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을 넣어줬다.