문제에 아무리 파일을 업로드해봐도 따로 필터링도 없고 PHP는 실행이 되지 않습니다.
물론 .htaccess 파일을 업로드해봤는데도 마찬가지였습니다.
여기서 랜덤하게 이것저것 때려봤는데...
이런식으로 파일을 업로드해도 따로 나오는 게 없어서,
뭐 없네, 하고 파일을 지우다가..
??
플래그가 나왔습니다.
납득이 되지 않아서 다시 천천히 살펴보았습니다.
<?php include "config.php"; session_sync(); ?> <html> <head> <title>Challenge 48</title> </head> <body> <h1>MEMO</h1> <?php $db = dbconnect(); if(($_GET['mode'] == "del") && ($_GET['time'])){ if(preg_match("/[^0-9]/",$_GET['time'])) exit("time is not int"); $result = mysqli_fetch_array(mysqli_query($db,"select id,up from chall48 where id='{$_SESSION['id']}' and time='{$_GET['time']}'")); if($result['id'] == $_SESSION['id']) mysqli_query($db,"delete from chall48 where time='{$_GET['time']}' and id='{$_SESSION['id']}'"); if($result['up']){ system("rm ./upload/{$result['up']}"); exit("file deleted. <a href=/>go back</a>"); } } if($_POST['memo']){ $_POST['memo'] = addslashes($_POST['memo']); $file = $_FILES['upfile']['name']; $file = addslashes($file); if(preg_match("/\.\.|\//",$file)) exit("hacking detected"); if($file){ copy($_FILES['upfile']['tmp_name'],"./upload/".$file); } mysqli_query($db,"insert into chall48 values('{$_SESSION['id']}',".time().",'{$file}','{$_POST['memo']}')"); } ?> <form method=post enctype=multipart/form-data> <input type=text size=50 name=memo><br><input type=file name=upfile><input type=submit value='Send'> </form> <?php $result = mysqli_query($db,"select * from chall48 order by time desc limit 0,20"); while($row = mysqli_fetch_array($result)){ $icon = crc32($_SESSION['id'])%8+1; $timestamp = $row['time']; $date = date('H:i:s',$timestamp); echo "<table border=0><tr onmouseout=this.style.background='white' onmouseover=this.style.background='silver'><td>{$date}</td><td align=center><img src={$icon}.jpg><br>{$row['id']}</td><td width=500>".htmlentities($row['memo'])."</td>"; if($row['id'] == $_SESSION['id'] && $row['up']) echo("<td>[<a href=./upload/{$row['up']}>upload file</a>]</td>"); if($row['id'] == $_SESSION['id']) echo("<td>[<a href=?mode=del&time={$timestamp}>Delete</a>]</td>"); echo "</tr></table>"; } ?> </body> </html>
일단 문제를 뽑아와보니 위와 같았습니다.
알고보니 delete를 수행할 때 system 명령어 rm으로 수행하는 것을 확인하였습니다.
생각해보니 파일을 지운다면 system 명령어든 뭐든 이용하여 PHP에서 직접 파일을 지울 때 shell 명령어를 동작시킬 거라 생각했어야 했네요.
system 명령어에서 따로 파일 이름의 필터링이 이루어지지 않으면 위와 같은 취약점을 일으킬 수 있다는 점 유의해야겠습니다.
'WARGAMES > webhacking.kr - old' 카테고리의 다른 글
Webhacking.kr_No50(450) - old (0) | 2020.01.15 |
---|---|
Webhacking.kr_No49(300) - old (0) | 2020.01.15 |
Webhacking.kr_No47(150) - old (0) | 2020.01.15 |
Webhacking.kr_No46(300) - old (0) | 2020.01.15 |
Webhacking.kr_No45(550) - old (0) | 2020.01.13 |
Webhacking.kr_No44(250) - old (0) | 2020.01.13 |
Webhacking.kr_No43(250) - old (0) | 2020.01.08 |
Webhacking.kr_No42(200) - old (0) | 2020.01.08 |