if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); //donot try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
GET 메소드로 id와 pw를 받고 있다. 또한 입력받은 값은 prob, _, ., ()이라는 문자열이 들어있으면, No Hack ~_~을 출력하고 종료한다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo"<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}' 입력 받은 id와 pw의 값을 쿼리문에 넣어지게 된다. 그 후 Mysql에 쿼리문을 적용시켜서 나온 결과값을 비교하는데, 결과의 id가 있다면 문제가 풀리게 된다.
'#를 통해 쿼리문을 select id from prob_gremlin where id=''으로 만들어줬다.
그 이유는 id와 pw 두가지 데이터를 동일해야 결과 값이 나오는데, 이러면 찾기 힘들기 때문에 id만 입력하여 찾으려고 한다.
DB에 admin이라는 id가 있을거 같아서 admin'#를 하니, 다행히 admin이라는 id가 있어서 결과 값이 result 변수에 저장되어 문제가 풀리게 되었다.