본문 바로가기
[웹해킹]/[Webhacking.kr]

[Webhacking.kr] 41번

by Hevton 2020. 11. 10.
반응형

첫 화면

소스보기

<?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>

 

 

 

[ 참고 ]

 

tmp_name

 

파일 업로드 시 업로드될 파일들은 해당 지정된 위치에 업로드되기 전에 모두 서버의 임시저장 공간 (tmp 폴더)에 임의 이름으로 저장을 하게 되고, 서버에 성공적으로 업로드 될 시 자동적으로 삭제된다. 이때 생성되는 임시파일의 이름에 대한 변수가 tmp_name이다. 

 

 

여튼 업로드되는 파일명인 fn변수에 다양한 필터링이 적용되어 있고, 우리는 $upload_dir이 담고 있는 값을 알아내야 한다.

copy 함수에 오류를 뿜어내기 위해서 아무것도 하지 않고 upload 버튼을 눌러본다.

오류를 뿜는다.

 

Filename이 공백이 되면 안된다고 해준다. 이 오류에 힘입어, 기본적으로 파일 이름의 최대 글자가 255자인 것을 고려하여 긴 이름을 가진 파일명을 업로드해보자. ( 직접 파일명을 255자를 넘게끔 변경하려고 시도해봐라, 255자에서 막힐 것이다. 파일 이름의 최대 글자는 255자이다.)

 

프록시 툴 BurpSuite를 이용해 255자 초과를 만들어 넘겨준다.

$upload_dir 이 보인다.

저렇게 디렉토리명을 확인할 수 있게 됐다. 이제 다시 정상적으로 파일을 업로드해보고, 해당 디렉토리에 위치한 파일로 페이지 이동을 해보면 플래그 값이 나온다. (참고로 ha.php파일을 업로드했을 경우에, 소스에서 .을 필터링하고있기 때문에 파일 확인 시에는 haphp로 입력해서 이동해야 한다.)

FLAG{error_msg_is_more_userful_than_you_think}

 

이걸 Auth 창으로 이동한 뒤 넣어주면 끝

 

 

 

 

반응형

'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글

[Webhacking.kr] 43번  (0) 2020.11.10
[Webhacking.kr] 42번  (0) 2020.11.10
[Webhacking.kr] 40번  (0) 2020.11.05
[Webhacking.kr] 39번  (0) 2020.11.03
[Webhacking.kr] 38번  (0) 2020.11.03