문제에 아무리 파일을 업로드해봐도 따로 필터링도 없고 PHP는 실행이 되지 않습니다.
물론 .htaccess 파일을 업로드해봤는데도 마찬가지였습니다.
여기서 랜덤하게 이것저것 때려봤는데...
이런식으로 파일을 업로드해도 따로 나오는 게 없어서,
뭐 없네, 하고 파일을 지우다가..
??
플래그가 나왔습니다.
납득이 되지 않아서 다시 천천히 살펴보았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?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 |