목표 : 에러메시지
파일 업로드가 가능하고 소스를 바로 보여준다.
<?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>
SQL
복사
에러가 나오면 출력하게 돼있고,
업로드된 파일 명에서 . < > / 은 없애고 $fn에 저장한다.
$cp는 tmp_name이라는 임시 파일명으로 설정하고 $fn 파일을 $cp 경로에 복사한다
이후 그 안에 flag값을 저장한다.
tmp_name 형식을 알 수 있다면 해당된 경로로 찾아가 작성된 flag를 볼 수 있다.
얻을 수 있는 정보는 더 이상 없으므로 파일 업로드를 통한 에러를 통해 정보를 얻어야 한다.
파일 이름을 쓸데없이 길게 만들어봤다.
한큐에 tmp_name을 획득했다.
원래 업로드 했던 파일에 접근해보자.
이름 필터링에서 . 이 사라질테니 이를 지우고 다시 접속해보면
플래그를 획득했다.