🔥 웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩
위아래 1줄씩 띄우고 중요한 부분은 볼드 효과
📍 OS Command Injection이란?
👉🏻 운영체제(시스템) 명령어 주입
👉🏻 원격 실행 명령어를 주입함으로써 공격자가 원하는 명령을 실행하게 함
👉🏻 서버의 중요 설정 파일 등을 조회/수정/삭제하고 서버 자체를 재실행 한다든지 치명적인 공격이 될 수 있음
📍 공격 대상
👉🏻 SQL Injection은 Application과 DB가 연결된 상태(DB Connection)에서만 공격 가능
👉🏻 OS Command Injection은 Application과 시스템 명령어가 연결된 상태에서 공격 가능
👉🏻 즉, OS Command Injection은 일반 웹사이트 중에서도 특정 관리자 페이지에서 시스템 명령어 실행이 가능한 특수한 환경에서만 발생됨
📍 SQL Injection VS OS Command Injection
👉🏻 SQL Injection은 중요 데이터 탈취, OS Command Injection은 중요 데이터 탈취는 물론 다른 명령도 실행 가능
👉🏻 SQL Injection의 경우 테이블 삭제 등의 정말 중요한 명령어는 systemadmin과 같은 권한이 있어야 한다는 제약이 있으나 OS Command Injection은 이러한 권한에 대해서 조금 더 수월하게 접근 가능하여 더욱 위험하다고 볼 수 있음
👉🏻 하지만, 오늘날 DB가 정보의 중심지이기 때문에 Injection 취약점의 대장은 SQL Injection임!
📍 공격 원리 분석
👉🏻 CMD 주입 > 사용자 입력 값 + 미완성되 시스템 명령어 구문 > 완성된 시스템 명령어 구문 > 결과에 따른 동작 구성 > 공격 성공
// 정상 값
nslookup www.test.co.kr
// 비정상적 값
nslookup www.test.co.kr&ipconfig
👉🏻 비정상적인 값으로 웹쉘 구현이 될 수 있기 때문에 CMD 주입 시에 입력 값 검증 로직이 필요함!
📍 대응 방안
👉🏻 서버 사이드 스크립트로 기능 구현
...
import java.util.regex.*;
...
String ip = request.getParameter("ip");
boolean flag = Pattern.matches("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$", ip);
if(!flag) {
out.println(history.back(-1););
return;
}
...
// 혹은 화이트리스트 검증 방식으로 필요한 부분만 허용함
String value = request.getParameter("value");
boolean flag = Pattern.matches("^[0-9a-zA-Z.-]*&", value);
// 악의적인 문자 검증
String value = request.getParameter("value");
boolean flag = Pattern.matches("[|&\n;`]", value);
if(flag) {
return;
}
👉🏻 사용자 입력 값 형식에 따른 정규 표현식 검증
👉🏻 악의적인 문자 검증
👉🏻 웹 사이트에서 해당 기능 없애기