본문 바로가기

Hack The Box CBBH

OS Command Injection

728x90
반응형
<?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 : 중앙 서버와 독립적으로 작동하면서도 많은 기능을 제공하는 클라이언트-서버 구조의 클라이언트를 의미한다. 즉, 서버에 의존하지 않고도 자체적으로 다양한 기능을 수행할 수 있는 클라이언트를 말한다.

728x90
반응형

'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