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