문제에 아무리 파일을 업로드해봐도 따로 필터링도 없고 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

+ Recent posts