아래는 서버 코드이다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/\'/',$_GET[id])) exit("HeHe");
if(preg_match('/\'/',$_GET[pw])) exit("HeHe");
$query = "select id from prob_succubus 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("succubus");
highlight_file(__FILE__);
?>
이번 문제는 쿼터가 필터링 되어 있고 쿼리에 쿼터가 있어서 쿼터를 우회해야하는 문제이다.
예전에 봤던 유형이라 보자마자 해답을 알 수 있었다.
획기적인 방법이라 기억에 더 남았던 것 같다.
select id from prob_succubus where id='\' and pw=' or 1=1 -- '
백슬래시를 사용하여 두번째 쿼터를 일반 문자로 인식하게하고 ' and pw가 pw의 첫번째 쿼에 의해서 id의 value의 문자열이 되게 하는 방식에 우회인 것이다.
이 방법은 전에 했던 삽질 중 하나였다.
하지만 이번 문제에서는 해답처럼 보였다.
그러게 되면 뒤에는 쿼타가 풀린 자유로운 sql 쿼리를 작성할 수 있는 환경이 되고 or 1=1 -- 를 해주게 되면 참으로 인식이 되어 result의 결과값이 나올 것이고 주석으로 뒤는 무효화 된다.
이번 문제는 result의 결과값만 존재 한다면 풀리는 문제이기 때문에 위처럼 넣어 주겠다.