<?php
if (isset($_GET['filename'])){
system("touch /tmp/" . $_GET['filename'] . ".pdf");
}
?>
OS Command Injection은 사용자가 제어할 수 있는 입력값이 직접 또는 간접적으로 시스템에 명령을 실행하는 웹 쿼리문에 영향을 미칠 때 발생하는 취약점이다. 모든 웹 프로그래밍 언어는 필요한 경우 백엔드 서버에서 운영 체제 명령을 직접 실행할 수 있는 다양한 기능을 제공한다. 이는 플러그인을 설치하거나 특정 애플리케이션을 실행하는 등의 목적으로 사용될 수 있다.
PHP 예시
PHP로 작성된 웹 애플리케이션에서 exec, system, shell_exec, passthru 또는 popen 함수를 통해 시스템 명령을 백엔드 서버에 전달할 수 있다.
<?php
if (isset($_GET['filename'])) {
system("touch /tmp/" . $_GET['filename'] . ".pdf");
}
?>
이 코드에서 사용자는 GET 요청의 filename 매개변수를 통해 /tmp 디렉터리에 .pdf 파일을 생성할 수 있다. 그러나 filename 매개변수의 사용자 입력값이 명령어 touch와 직접 결합되고, 이를 사전에 필터링하지 않았기 때문에 웹 애플리케이션이 Command Injection 취약점에 노출된다. 이를 통해 공격자는 백엔드 서버에서 임의의 시스템 명령을 실행할 수 있다.
NodeJS 예시
이러한 취약점은 PHP에만 국한되지 않으며, 모든 웹 개발 프레임워크나 언어에서 발생할 수 있다. 예를 들어, NodeJS로 개발된 웹 애플리케이션에서도 동일한 방식으로 취약점이 발생할 수 있다.
app.get("/createfile", function(req, res){
child_process.exec(`touch /tmp/${req.query.filename}.txt`);
})
위 코드도 Command Injection 취약점이 존재하며, GET 요청의 filename 매개변수가 명령어에 포함되지만 필터링이나 이스케이프 처리가 이루어지지 않았기 때문이다. PHP와 NodeJS에서 모두 동일한 Command Injection 기법으로 공격이 가능하다.
마찬가지로 다른 웹 개발 프로그래밍 언어에도 동일한 목적으로 사용되는 유사한 기능이 존재하며, 동일한 Command Injection 페이로드를 사용해 악용할 수 있다. 또한 Command Injection 취약점은 웹 애플리케이션에만 해당되지 않고, 실행 파일이나 Thick Client에서도 사용자 입력값이 필터링 없이 시스템 명령 실행 함수로 전달될 경우 발생할 수 있다.
※ Thick Client : 중앙 서버와 독립적으로 작동하면서도 많은 기능을 제공하는 클라이언트-서버 구조의 클라이언트를 의미한다. 즉, 서버에 의존하지 않고도 자체적으로 다양한 기능을 수행할 수 있는 클라이언트를 말한다.
'Hack The Box CBBH' 카테고리의 다른 글
| CBBH[Certified Bug Bounty Hunter] (0) | 2025.02.05 |
|---|---|
| XSS - Intro [HTB] (0) | 2025.01.13 |
| Command Injection - Injecting Commands (1) | 2024.12.09 |
| Command Injection - Detection (0) | 2024.12.09 |
| [Intro] Command Injection (0) | 2024.12.02 |