반응형
아 또 포트포워딩 해야하는 문제다. 공유기 관리자 접근 계정도 모르겠고 포트포워딩 여는것도 별로 좋아하지 않아서 뇌로 풀었다.
소스
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 37</title>
</head>
<body>
<?php
$db = dbconnect();
$query = "select flag from challenge where idx=37";
$flag = mysqli_fetch_array(mysqli_query($db,$query))['flag'];
$time = time();
$p = fopen("./tmp/tmp-{$time}","w");
fwrite($p,"127.0.0.1");
fclose($p);
$file_nm = $_FILES['upfile']['name'];
$file_nm = str_replace("<","",$file_nm);
$file_nm = str_replace(">","",$file_nm);
$file_nm = str_replace(".","",$file_nm);
$file_nm = str_replace("/","",$file_nm);
$file_nm = str_replace(" ","",$file_nm);
if($file_nm){
$p = fopen("./tmp/{$file_nm}","w");
fwrite($p,$_SERVER['REMOTE_ADDR']);
fclose($p);
}
echo "<pre>";
$dirList = scandir("./tmp");
for($i=0;$i<=count($dirList);$i++){
echo "{$dirList[$i]}\n";
}
echo "</pre>";
$host = file_get_contents("tmp/tmp-{$time}");
$request = "GET /?{$flag} HTTP/1.0\r\n";
$request .= "Host: {$host}\r\n";
$request .= "\r\n";
$socket = fsockopen($host,7777,$errstr,$errno,1);
fputs($socket,$request);
fclose($socket);
if(count($dirList) > 20) system("rm -rf ./tmp/*");
?>
<form method=post enctype="multipart/form-data" action=index.php>
<input type=file name=upfile><input type=submit>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>
전체 흐름을 보면 현재 시간값을 가져와서 'tmp-시간값' 으로 된 파일들을 접속 시마다 생성한다. 그리고 20개가 되면 모조리 지운다.
이때, 파일 안에 127.0.0.1 이라는 값으로 저장되는데, 해당 서버에서 이 파일 안의 주소값과 포트번호 7777의 호스트에 접속을 하여 플래그값을 뿌려준다. 그래서 이 주소를 내 주소로 바꿔줘야한다.
해당 서버에 접속하는 time값에 해당하는 'tmp-시간값' 파일을 새로 만들어서 시간값에 맞는 정확한 시간에 업로드하면
기존의 tmp-시간값 파일이 생성되고 난 뒤 코드에서 해당 파일의 내용을 내 ip로 덮어쓰게된다.
그리고 그때 '7777포트를 포트포워딩을 해놓은 상태에서 netcat을 통해 포트를 열어둔 내 호스트'에 플래그값이 전달된다.
FLAG{well...is_it_funny?_i_dont_think_so...}
참고로 이런 문제를 '레이스컨디션 기법' 문제라고 합니다.
한정된 자원을 여러 프로세스가 동시에 작업하게 되면서 실행순서의 취약점 발생을 이용해 공격하는 것이죠.
+ 참고로 php에서 fopen의 w옵션은 덮어쓰기임. a가 내용추가.
반응형
'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 39번 (0) | 2020.11.03 |
---|---|
[Webhacking.kr] 38번 (0) | 2020.11.03 |
[Webhacking.kr] 36번 (0) | 2020.10.28 |
[Webhacking.kr] 35번 (0) | 2020.10.24 |
[Webhacking.kr] 34번 (0) | 2020.10.24 |