Post

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



$_FILES
m.blog.naver.com/jeongju02/221471839853


  • $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}


풀이
hevton.tistory.com/195?category=1145930






This post is licensed under CC BY 4.0 by the author.