Command Injection

강혜인·2025년 5월 29일

WEB_Hack

목록 보기
14/18

Command Injection?


Command Injection

  • 웹 애플리케이션에서 시스템 명령을 사용할 때, 세미콜론 혹은 &, &&를 사용해 하나의 Command를 Injection하여 두 개의 명령어가 실행되게 하는 공격
  • 서버 자체의 콘솔 명령어를 실행시킬 수 있기 때문에 공격이 성공하면 매우 큰 피해가 발생한다.
  • 현재 웹 애플리케이션에서는 서버의 파일을 cat 명령어를 사용해 사용자 입력과 함께 보여줄 수 있도록 만들어져 있음
    • 해커는 이를 이용해 리눅스에서 두 개의 명령을 한 줄에 동시에 실행할 수 있도록 하는 연결자인 “세미콜론(;)”을 사용해 ifconfig 명령을 실행시키기 위해 웹 페이지에 요청을 보냄
    • 사용자로부터의 요청을 아무런 검증 없이 서버에 전송
    • 요청된 명령을 서버에서 실행하고, 서버의 민감정보를 그대로 노출
    • 여러가지 명령어로 정보를 수집한 해커는 서버 내 라이브러리 중 원데이 취약점을 이용해 리눅스 서버의 root 권한을 획득 가능

발생 원인

  • 어플리케이션에 운영체제 명령어(Shell Script)를 실행하는 기능이 존재하는 경우, 외부 입력값을 검증, 제한하지 않고 운영체제 명령어 또는 명령어 일부로 사용하는 경우에 발생
    • 어플리케이션이 올라간 운영체제를 공격자가 직접적으로 제어할 수 있게 됨

Command Injection 공격 예시

외부 입력값을 운영체제 명령어로 사용하는 경우

String cmd = request.getParameter("cmd");
Runtime.exec(cmd);
  • 이런 jsp 파일이 있다고 할 때 개발자가 의도한 실행은
run.jsp?cmd=ifconfig
  • 그러나 입력값에 따라
run.jsp?cmd=ifconfig & cat /etc/passwd
  • 위와 같은 방식으로 의도치 않은 명령어가 같이 실행될 수 있다.

외부 입력값을 운영체제 명령어 파라미터로 사용하는 경우

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을 방지하는 방법

불필요한 운영체제 명령어 실행 제거

  • 어플리케이션에서 명령어 실행이 필요한 경우는 드물다.
  • 해당 명령어 실행이 꼭 필요한지 확인하고 해당 기능을 다른 기능으로 대체하는 것이 바람직하다.

명령어, 파라미터로 사용 될 값을 제한

  • 화이트리스트 방식
    • 저장된 목록 범위 내 값만 허용하는 방식
    • 새로운 입력 유형에도 보안이 적용되므로 안전
    • 내부에서 사용할 값을 미리 정의하고 해당 범위에서만 사용하도록 함
  • 블랙리스트 방식
    • 저장된 목록 범위 외 값을 전부 허용하는 방식
    • 예상되는 입력 유형이 다양하고 변화가 심한 경우 사용

입력값을 사용 전 검증하기

  • 입력값에 추가 명령을 실행하는 &, |, ; 등의 문자가 포함되어 있는지 확인

0개의 댓글