old-27

old-27

old-27

SQL Injection 문제다.

view-source를 통해 페이지 소스 코드를 살펴보면

Challenge 27 SQL INJECTION view-source

먼저, input 박스가 GET 방식으로 작동하는 것을 알 수 있다.

그리고 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을 입력하면

문제를 해결할 수 있다.

from http://woong971.tistory.com/216 by ccl(A) rewrite - 2021-12-12 20:26:31