Command Injection
- 웹 애플리케이션에서 시스템 명령을 사용할 때, 세미콜론 혹은 &, &&를 사용해 하나의 Command를 Injection하여 두 개의 명령어가 실행되게 하는 공격
- 서버 자체의 콘솔 명령어를 실행시킬 수 있기 때문에 공격이 성공하면 매우 큰 피해가 발생한다.
발생 원인
- 어플리케이션에 운영체제 명령어(Shell Script)를 실행하는 기능이 존재하는 경우, 외부 입력값을 검증, 제한하지 않고 운영체제 명령어 또는 명령어 일부로 사용하는 경우에 발생
- 어플리케이션이 올라간 운영체제를 공격자가 직접적으로 제어할 수 있게 됨
외부 입력값을 운영체제 명령어로 사용하는 경우
String cmd = request.getParameter("cmd");
Runtime.exec(cmd);
run.jsp?cmd=ifconfig
run.jsp?cmd=ifconfig & cat /etc/passwd
외부 입력값을 운영체제 명령어 파라미터로 사용하는 경우
String file = request.getParameter("file");
Runtime.exec("cat " + file);
view.jsp?file=/data/upload/myfile.txt
view.jsp?file=/data/dupload/myfile.txt & cat /etc/passwd
불필요한 운영체제 명령어 실행 제거
- 어플리케이션에서 명령어 실행이 필요한 경우는 드물다.
- 해당 명령어 실행이 꼭 필요한지 확인하고 해당 기능을 다른 기능으로 대체하는 것이 바람직하다.
명령어, 파라미터로 사용 될 값을 제한
- 화이트리스트 방식
- 저장된 목록 범위 내 값만 허용하는 방식
- 새로운 입력 유형에도 보안이 적용되므로 안전
- 내부에서 사용할 값을 미리 정의하고 해당 범위에서만 사용하도록 함
- 블랙리스트 방식
- 저장된 목록 범위 외 값을 전부 허용하는 방식
- 예상되는 입력 유형이 다양하고 변화가 심한 경우 사용
입력값을 사용 전 검증하기
- 입력값에 추가 명령을 실행하는 &, |, ; 등의 문자가 포함되어 있는지 확인