los:xavis
[코드분석]
<?php
include "./config.php";
login_chk();
dbconnect();
↑DB와 연결을 위한 코드
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/regex|like/i', $_GET[pw])) exit("HeHe");
↑preg함수를 통한 필터링
$query = "select id from prob_xavis where id='admin' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
↑첫번째 쿼리 실행
$_GET[pw] = addslashes($_GET[pw]);
↑addslashes함수 이용
$query = "select pw from prob_xavis where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
↑두번째 쿼리 실행
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis");
↑문제의 포인트
[내 풀이]
코드를 보니
- preg함수를 통해 필터링하는데 특히 regex와 like를 필터링
- 첫번째 쿼리가 실행되기만 하면 hello 어쩌고 라고 출력
- 두번째 쿼리실행과 문제의 포인트를 통해 blind injection임을 알 수 있음
즉, id='admin'인 정확한 pw값을 구하여야 문제가 풀림
일반적인 blind injection문제 해결법처럼 pw의 길이를 구하고 정확한 pw값을 구하면 된다. 라고 생각했는데
길이부터가 구하기가 만만치 않을 거 같은 느낌이 들었다. 왜냐면 0-20까지 다 해보았는데 나오지 않았기 때문이다...
이건 하나하나 구하는건 분명 아님을 예상한다.
like를 필터링하는 것을 보니 .... 혹시 문자패턴을 아용해 검색하는 like연산자를 이용하는 것처럼 푸는게 아닐까...?
- hex화해서 length를 찍어본다
-