'
를 무력화 시켜야한다.'
를 사용하려면 무슨 짓을 해야할까??<?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__);
?>
id
와 pw
를 모두 '
로 감싸고 '
를 필터링하였다.
그렇다고 블라인드 인젝션을 하고 싶지도 않은 소스 코드다.
그렇다면 id
쪽 끝 '
를 문자화시키면 pw
쪽에서 자유롭게 인젝션이 가능하다.
특수문자를 문자열처럼 사용하려면 특수 문자 앞에 \
를 붙여주면 된다.
id
에 \
를 넣어주게 되면 select id from prob_succubus where id='\' and pw=''
, 즉 id
는 ' and pw=
라는 값을 인자로 가지게 된다. 그리고 뒤에 pw
인젝션으로 공격하고 주석으로 남은 '
를 처리해주면 문제는 해결된다.