Command Injection이란?

Cura·2023년 12월 18일
0

기타 정보

목록 보기
3/6

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. 입력값을 사용 전 검증한다

  • 입력값에 추가 명령을 실행하는 &, |, ; 등의 문자가 포함되어있는지 확인한다.
profile
우리는 울지 않는 부엉이요, 발자국 없는 범이다.

0개의 댓글