
1. 문제 정보
- 문제 번호 : old -19
- 문제 점수 : 25점
2. 문제 분석
문제 19번에 들어가면 파일이 업로드하는 창이 나온다.

파일을 올리면 done이 나오고 아무 일도 안 일어난다.

소스코드를 보면 ., <, >,/를 파일 이름에서 필터링한다.
./{upload}/에 파일이 올라간다.
ini_set 함수는 PHP 환경 설정을 코드로 직접 제어할 수 있게 해 준다.
ini_set으로 변경한 설정은 해당 스크립트(페이지)의 실행이 끝나면 없어진다.
display_errors 값: 0 (끄기) 또는 1 (켜기) 설명: 스크립트 실행 중 발생한 에러를 화면에 보여줄지 결정한다. 주로 개발 중에는 1로 설정해 디버깅을 하지만, 실제 운영 중인 사이트에서는 경로 정보나 DB 구조 같은 민감한 정보가 노출될 수 있어 반드시 0으로 꺼두어야 한다.
<?php
include "../../config.php";
include "./inc.php";
if($_GET['view_source']) view_source();
error_reporting(E_ALL);
ini_set("display_errors", 1);
?><html>
<head>
<title>Challenge 41</title>
</head>
<body>
<?php
if(isset($_FILES['up']) && $_FILES['up']){
$fn = $_FILES['up']['name'];
$fn = str_replace(".","",$fn);
$fn = str_replace("<","",$fn);
$fn = str_replace(">","",$fn);
$fn = str_replace("/","",$fn);
$cp = $_FILES['up']['tmp_name'];
copy($cp,"./{$upload_dir}/{$fn}");
$f = @fopen("./{$upload_dir}/{$fn}","w");
@fwrite($f,$flag);
@fclose($f);
echo("Done~");
}
?>
<form method=post enctype="multipart/form-data">
<input type=file name=up><input type=submit value='upload'>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>
3. 풀이
이 문제의 핵심은 코드가 숨기고 있는 $upload_dir 경로를 알아내는 것이다.
ini_set("display_errors", 1); 설정이 여기서 결정적인 힌트가 된다.
서버가 에러를 감추지 않고 우리에게 보여주도록 설정되어 있기 때문이다.
운영체제마다 파일 이름이나 전체 경로의 길이에 제한이 있다. 만약 이 제한을 넘어서는 아주 긴 이름의 파일을 업로드하려고 시도하면, PHP의 copy 함수는 파일을 복사하지 못하고 에러를 발생시킬 것이다.
burp suite로 파일이름을 아주 길게 요청하면

에러 메시지가 나오고 파일 경로가 나오게 된다.

파일이름에. 을 뺀 상태로 요청하면 Flag가 나온다

4. 요약
- ini_set 설정으로 인해 에러 메시지가 출력된다는 점을 이용해 소스코드에 은닉된 업로드 경로를 파악해야 한다.
- 파일 이름을 시스템 허용 길이보다 길게 조작하여 전송함으로써 강제로 에러를 유발하면 경고 메시지에서 전체 경로가 노출된다.
- 확인된 경로를 통해 업로드한 파일에 접근하면 소스코드 로직에 의해 파일 내부에 쓰인 플래그를 획득할 수 있다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-51 문제 (0) | 2026.01.30 |
|---|---|
| [webhacking.kr] old-43 문제 (0) | 2026.01.30 |
| [webhacking.kr] old-1문제 (0) | 2026.01.27 |
| [webhacking.kr] old-23문제 (1) | 2026.01.27 |
| [webhacking.kr] old-36문제 (0) | 2026.01.27 |