반응형
소스보기
<?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자 초과를 만들어 넘겨준다.
저렇게 디렉토리명을 확인할 수 있게 됐다. 이제 다시 정상적으로 파일을 업로드해보고, 해당 디렉토리에 위치한 파일로 페이지 이동을 해보면 플래그 값이 나온다. (참고로 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 |