Webhacking.kr - web41 (풀이봄)
web41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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>
Solution
$fn = $_FILES['up']['name'];
-> 내가 올린 파일명$cp = $_FILES['up']['tmp_name'];
-> 서버 tmp 디렉토리에 저장된 파일명
내가 올린 파일명에 . < > /
가 있으면 없앰.
tmp에 저장된 파일에 내가 올린 파일을 복사하고 내가 올린 파일을 열어서 거기에 flag를 저장함.
따라서 내가 올린 파일을 확인해주면 됨. 그러려면 upload_dir을 알아야 하는데..
- 파일명 길이가 기본적으로 대부분 255자 까지라고 함.
(man pathconf)
따라서 255을 넘게 입력해주면 에러를 표시해줄 것이고 거기에 파일 디렉토리 경로가 포함되어서 나오게 됨.
- 경로
/4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/
정상적인 파일 test.txt를 업로드한 뒤 확인.
입력 시 ‘.’은 없어지므로 testtxt
로 접속하면 플래그가 나옴.
- Flag :
FLAG{error_msg_is_more_userful_than_you_think}
This post is licensed under CC BY 4.0 by the author.