> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-4/http/or-command-injection.md).

# 커맨드 인젝션 | Command Injection

## HTTP - 커맨드 인젝션 <a href="#bkmrk-page-title" id="bkmrk-page-title"></a>

여러분들의 집 공유기 관리자 페이지에 들어가 보면 다음과 같이 핑 트래픽을 날릴 수 있는 기능이 있는 경우가 있습니다.

<figure><img src="https://guides.redraccoon.kr/uploads/images/gallery/2025-01/scaled-1680-/YtawMVpX1Hp4EjGf-image-1735976049067.png" alt=""><figcaption></figcaption></figure>

공유기 관리자 웹 애플리케이션뿐만 아니라, 많은 웹 애플리케이션들은 운영체제 단에서 실행되는 명령어나 프로그램들 (ping, 등) 을 애플리케이션단에서 실행할 수 있도록 기능을 만들어놓는 경우가 있습니다. 내가 만드는 웹 애플리케이션 서버에 사용자가 SSH 해서 프로그램을 직접 실행하지 말고, 웹 애플리케이션을 통해 실행되도록 기능을 만드는 것입니다.

이런 웹 애플리케이션 -> 운영체제 명령어/프로그램 실행 기능에서는 커맨드 인젝션(Command Injection)이라는 취약점이 발생할 수 있습니다.&#x20;

<figure><img src="https://guides.redraccoon.kr/uploads/images/gallery/2025-01/scaled-1680-/veZYwhDOCiGU4P12-image-1735976062592.png" alt=""><figcaption></figcaption></figure>

커맨드 인젝션(Command Injection)은 웹 서버나 애플리케이션에서 운영체제 명령어나 스크립트 등을 실행하는 기능이 있을 때, 공격자가 악의적인 입력값을 전달해 실행되는 명령어를 조작하는 공격입니다. 웹 서버나 애플리케이션이 실행 중인 운영체제 단의 명령어를 조작할 수 있기 때문에, 시스템 레벨에서 의도하지 않은 명령이 실행될 수 있습니다.

이런 기능들은 대부분 웹 개발 프레임워크의 운영체제 명령어/프로그램 실행 함수를 사용합니다. 이런 함수들은 대부분 운영체제에서 쉘 프로세스를 실행한 뒤, 웹 애플리케이션에서 받아온 유저의 입력값을 쉘에 넣어주는 형식으로 실행됩니다.

커맨드 인젝션과 관련된 취약한 PHP 코드는 다음과 같습니다:

```sql
<?php
$ip = $_GET['ip'];
system("ping " . $ip);
?>
```

위 PHP 코드는 GET요청의 `ip` 파라미터로부터 입력값을 받은 뒤 운영체제 단에서 쉘 프로세스(`sh`, `bash`, 등)를 실행하고 그 쉘 안에서 `ping <ip>` 의 형식으로 명령어를 수행합니다.

일반적인 형태라면 유저가 IP주소를 입력한 뒤 `system("ping" . "1.1.1.1")` 와 같이 핑 명령어가 실행될 것입니다. 하지만 공격자가 악의적인 페이로드를 넣는 경우 추가적인 명령어를 실행할 수 있게 됩니다. 예를 들어, `; whoami` 와 같은 페이로드를 다음과 같이 실행한다라고 가정 해봅니다.

```
https://example.com/ping.php?ip=1.1.1.1;whoami
```

이 경우, 운영체제 단에서 마지막으로 실행되는 명령어는 다음과 같습니다.

```
ping 1.1.1.1; whoami
```

위 명령어를 칼리 리눅스에서 실행 중인 bash쉘 등에서 쳐보면 핑 명령어가 실행된 뒤 whoami 명령어가 실행되는 것을 볼 수 있습니다. 이는 쉘과 관련된 컨트롤 연산자(Control Operators) 때문입니다. 컨트롤 연산자들은 쉘에서 실행될 때 특별한 의미를 가진 문자열들인데, `,`, `;`, `&&`,`||`, `|` 등이 있습니다.

<table><thead><tr><th width="104">연산자</th><th>설명</th></tr></thead><tbody><tr><td><code>;</code></td><td>두 명령어를 순차적으로 실행. 첫 번째 명령어의 실행 결과와 상관없이 두 번째 명령어 실행</td></tr><tr><td><code>&#x26;&#x26;</code></td><td>첫 번째 명령어가 성공적으로 실행될 경우에만 두 번째 명령어 실행</td></tr><tr><td><code>||</code></td><td>첫 번째 명령어 실행 후 실패할 경우에만 두 번째 명령어 실행</td></tr><tr><td><code>&#x26;</code></td><td>명령어를 백그라운드에서 실행</td></tr><tr><td><code>|</code></td><td>파이프 - 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 사용</td></tr><tr><td><code>!</code></td><td>뒤따르는 명령어의 실행 결과를 반전(성공시 실패로, 실패시 성공으로)</td></tr></tbody></table>

위에서 사용된 `1.1.1.1; whoami` 의 경우 `; 이전의 ping 1.1.1.1 명령어를 실행한 뒤, 실행이 끝나면 ; 뒤의 whoami 명령어를 실행하라` 라는 의미를 가지게 됩니다. 이처럼 컨트롤 연산자들을 이용해 공격자가 원하는 명령어를 실행하도록 악의적인 입력값을 전달하는 것을 커맨드 인젝션 공격이라고 부릅니다.

### 실습 <a href="#bkmrk-ec-8b-a4-ec-8a-b5" id="bkmrk-ec-8b-a4-ec-8a-b5"></a>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F8EuRn4l9CscJX2ZuBDSK%2Fimage.png?alt=media&amp;token=f26d42d6-0744-431f-8b2a-a4a934b50ea4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FoAd7cxXjWXWlh4ju6CHl%2Fimage.png?alt=media&amp;token=7098c7c4-d2cf-4bf7-8a95-898054fa8f6b" alt=""><figcaption></figcaption></figure>

* URL Encoding : && 명령어 연산자를 단축키로 바꾼다 - <mark style="color:red;">**CTRL + U**</mark>
* <mark style="color:red;">**왠만하면 연산자는 URL 인코딩을 하여 사용하여야 한다.**</mark>

타겟 서버나 애플리케이션이 특정 OS 혹은 써드파티 명령어를 실행하고, 유저 입력을 받는다면 쉘의 명령어 연산자와 명령어/코드 등을 이용해 커맨드 인젝션에 취약한지 알아봅니다.

<table><thead><tr><th width="112">연산자</th><th>설명</th></tr></thead><tbody><tr><td><code>;</code></td><td>두 명령어를 순차적으로 실행. 첫 번째 명령어의 실행 결과와 상관없이 두 번째 명령어 실행</td></tr><tr><td><code>&#x26;&#x26;</code></td><td>첫 번째 명령어가 성공적으로 실행될 경우에만 두 번째 명령어 실행</td></tr><tr><td><code>||</code></td><td>첫 번째 명령어 실행 후 실패할 경우에만 두 번째 명령어 실행</td></tr><tr><td><code>&#x26;</code></td><td>명령어를 백그라운드에서 실행</td></tr><tr><td><code>|</code></td><td>파이프 - 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 사용</td></tr><tr><td><code>!</code></td><td>뒤따르는 명령어의 실행 결과를 반전(성공시 실패로, 실패 시 성공으로)</td></tr></tbody></table>

버프스위트 Intruder 기능을 이용하는 방법도 있습니다. 이와 관련해서는 강의 영상을 참고 해주세요.

커맨드 인젝션 퍼징 사전 - [링크](https://github.com/payloadbox/command-injection-payload-list#unix-)

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FxzuKSrBccpmLin3u7L2E%2Fimage.png?alt=media&amp;token=44d72d19-d6c9-4bf1-b3c7-2a591b97ec3a" alt=""><figcaption></figcaption></figure>

&#x20;깃허브에서 복사한다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FH31LswL92mHZhfO3ys4q%2Fimage.png?alt=media&amp;token=0d758c4d-165a-42fc-8dda-694b7ef17638" alt=""><figcaption></figcaption></figure>

&#x20;프록시로 잡아서 intruder 탭으로 가져가서 페이로드 마커를 해준다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FWcamgvrVuZe4ZrzELdHr%2Fimage.png?alt=media&amp;token=076af508-7fd2-460a-86a2-51af320e6523" alt=""><figcaption></figcaption></figure>

&#x20;페이로드 탭으로 가서 셋팅에서 깃허브에서 복사한 내용을 Paste를 눌러 넣는다.

<figure><img src="https://guides.redraccoon.kr/uploads/images/gallery/2025-01/scaled-1680-/Bwt1wHuv8Ncu8Kg6-image-1735976082355.png" alt=""><figcaption></figcaption></figure>

### 연습 문 <a href="#bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c" id="bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c"></a>

* `mod3ex` 박스의 포트 4280에서 실행 중인 DVWA에서 커맨드 인젝션을 연습 해보세요.
* `DVWA Security`에서 난이도를 하나씩 올리면서 커맨드 인젝션 페이지 맨 하단에 있는 `View Source` 버튼을 눌러 어떤 방식으로 커맨드 인젝션을 방어하고 있는지 공부 해보세요.
