명령어 삽입이라는 의미의 Command Injection은 애플리케이션 내에서 원격으로 코드를 실행할 수 있어 원격 코드 실행(Remote Code Execution, RCE)으로도 불린다.
명령어 삽입은 애플리케이션이 사용자의 장치에서 실행되는 것과 동일한 권한을 가지고 운영체제에서 명령어를 실행하도록 애플리케이션을 악용하는 것이다.
취약한 시스템과 공격자가 직접적으로 상호작용할 수 있기 때문에 공격자에게 가장 효과적인 공격 방식이다.
명령어 삽입은 2019년 AppSec Intelligence 보고에 의한 상위 10개의 취약점 중 하나였으며, OWASP 프레임워크에서도 웹 애플리케이션 상위 10가지 취약점 중 하나로 지속적으로 제안하고 있다.
종종 PHP, Python, NodeJS같은 언어를 사용해서 시스템을 구성한 애플리케이션에서 발견된다. 입력 필드가 존재하는 경우를 예로 들 수 있다.

위 코드에서는 사용자가 $title이라는 입력 필드에 데이터를 입력해 디렉토리에서 노래 제목을 검색한다.
$title에 저장한다.grep명령어로 songtitle.txt내에서 탐색한다.애플리케이션이 노래가 저장된 디렉토리에 접근하고 저장까지 하기 때문에 공격자는 본인이 원하는 명령을 이 애플리케이션에 삽입할 수 있다.
예를 들어서 grep을 사용해 노래 리스트에 접근하는 대신에 다른 민감한 파일에 접근해 데이터를 읽어내도록 요청할 수 있다.
이런 방식은 어떤 애플리케이션이 어떤 프로그래밍 언어를 사용했는지에 관계없이 사용할 수 있다. 애플리케이션이 운영체제와 상호작용하는 이상, 명령어 삽입은 일어날 수 있다.
실습 세션에서 나오겠지만 명령어 삽입이 발생하는지 여부를 애플리케이션 동작을 통해서 판단할 수도 있다.
사용자 입력으로 시스템 명령에 데이터를 저장하는 애플리케이션은 개발자가 의도하지 않는 동작으로 이어질 수 있는데, 쉘 연산자 중 ;, &, &&등의 시스템 명령을 결합해 실행할 수 있다.
애플리케이션에서 직접적인 출력이 없는 경우 애플리케이션의 동작을 살펴봐야 발생 여부를 판단할 수 있다.
블라인드 유형을 탐지하려면 시간 딜레이를 유발하는 페이로드를 사용해야 한다.
예를 들어서 ping, sleep명령어는 테스트에 중요한 페이로드이다. ping은 지정한 횟수에 비례해 애플리케이션이 몇 초간 멈추도록 한다.
다른 방법으로는 출력을 강제하는 것이 있다.
>과 같은 리다이렉션 연산자를 사용해서 whoami같은 명령어를 실행하고 파일로 리다이렉션하도록 지시할 수 있고, cat명령어로 해당 파일을 읽도록 할 수 있겠다.
블라인드 유형은 확인이 즉각적이지 않거나 아예 존재하지 않기 때문에 복잡하고, Linux와 Window 시스템의 명령어 구문이 다르기 때문에 테스트가 많이 필요하다.
curl명령어는 매우 훌륭한 방법인데, 페이로드 내에서 애플리케이션에 데이터를 보내고 받아볼 수 있다.
curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami
위 코드와 같이 명령어 삽입이 가능할 수 있다.
블라인드 탐지보다 훨씬 쉽다고 할 수 있다. 상세 명령어 삽입은 말그대로 애플리케이션이 어떤 일을 하고 있는지, 무엇이 실행되고 있는지 상세하게 출력을 제공한다.
ping, whoami같은 명령어 출력이 애플리케이션에 직접 표시된다.
Linux Payload
| 페이로드 | 기능 |
|---|---|
| whoami | 애플리케이션이 어떤 사용자 권한으로 실행되는지 확인 |
| ls | 현재 디렉토리의 내용을 나열, 구성 파일, 환경 파일(토큰 및 애플리케이션키 등) 같은 파일을 찾을 수 있다. |
| ping | 애플리케이션을 지연, 블라인드 명령어 삽입 테스트 시 유용 |
| sleep | 머신에 ping 명령어가 설치되지 않은 경우 사용 |
| nc | Netcat, 애플리케이션에 역방향 셀을 생성하는 데 사용될 수 있음, 대상 머신을 탐색해 다른 서비스, 파일 또는 권한 상승 수단을 찾을 수 있음. |
Window Payload
| 페이로드 | 기능 |
|---|---|
| whoami | 애플리케이션이 어떤 사용자 권한으로 실행되는지 확인 |
| dir | 현재 디렉토리의 내용을 나열, 구성 파일, 환경 파일(토큰 및 애플리케이션키 등) 같은 파일을 찾을 수 있다. |
| ping | 애플리케이션을 지연, 블라인드 명령어 삽입 테스트 시 유용 |
| timeout | 머신에 ping 명령어가 설치되지 않은 경우 사용 |