아래는 서버 코드이다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");
highlight_file(__FILE__);
?>
코드를 보아 하니 쿼터를 필터링하는 것 같다.
아래에 문자들을 필터링 한다.
지금껏 쿼터들을 필터링 했던 문제들을 생각하면 전부 괄호로 쿼터를 우회했던 것 같다.
이번 문제에서는 친절하게도 no=에 ''가 없다.
일단 admin의 no는 안알려준다.
그래서 no = 1로 guest가 맞는지 확인한다.
아래처럼 맞았고 아마도 admin의 no는 2가 아닐까 추측한다.
코드에 직접 대입해보면서 익스플로잇을 짜면 아래와 같다.
guest이면서 no가 3인것은 결과가 없고 ||로 or연산을 하여 no가 2와 같은 것을 갖고 오는 쿼리로 인젝션한다.
아래처럼 get 파라미터로 입력하고 요청을 보내면
성공할 수 있다.