쿼리문을 보자마자 생각나는 방법이 하나 있다.

 

if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 

id 파라미터가 쿼리문에 하드코딩 되어 있어서 id의 검증은 따로 없었다.
하지만 no 파라미터의 경우 prob, _, ., (), ', ", `에 대해서 검증하고 있었다.

 

$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result['id'] == 'admin') solve("goblin");

쿼리문의 결과값이 admin일 시 문제가 풀리게 된다.
select id from prob_goblin where id='guest' and no={$_GET[no]}를 분석하면, where절의 id가 guest로 하드코딩되어 있어서 guest를 no를 입력해야 guest이라는 쿼리문 결과를 얻을 수 있다.

 

하지만 문제의 목표는 결과값이 admin을 원하기 때문에 no에 SQL Injection을 삽입하여 쿼리문의 결과를 admin으로 얻어야 한다.

 

나는 그 방법을 select id from prob_goblin where id='guest' and no=-1 or id='admin'으로 id='guest' and no=-1을 False로 만들어서 True인 id='admin'를 사용하게끔 하겠다.

 

그러나 위 방법은 ', "이 필요하다. 그래서 ', "를 사용하지 않고 where절의 맨 뒤 id의 값이 admin으로 만들어줘야한다.

 

나는 그 방법을 아스키 코드의 hex값을 입력하여 ', "를 사용하지 않고 id에 admin을 넣어줬다.

 

해당 방법은 webhacking.kr에서 문제를 풀다가 알게 되었다.

복사했습니다!