쿼리문을 보자마자 생각나는 방법이 하나 있다.
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에서 문제를 풀다가 알게 되었다.
'워게임 > Lord of SQLInjection' 카테고리의 다른 글
[Lord of SQLInjection] Darkelf Write UP (0) | 2021.07.14 |
---|---|
[Lord of SQLInjection] Wolfman Write UP (0) | 2021.07.14 |
[Lord of SQLInjection] Orc Write UP (0) | 2021.07.12 |
[Lord of SQLInjection] Coblt Write UP (0) | 2021.07.05 |
[Lord of SQLInjection] Gremlin Write UP (0) | 2021.07.05 |