아래는 서버 코드이다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
$_GET[id] = strtolower($_GET[id]);
$_GET[id] = str_replace("admin","",$_GET[id]);
$query = "select id from prob_vampire where id='{$_GET[id]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("vampire");
highlight_file(__FILE__);
?>
먼저 strtolower함수로 대문자 우회를 방어하고 있었다.
하지만 익숙한 replace함수가 보인다.
replace함수로 admin을 공백으로 치환해주고 있었다.
그럼 지금까지 해왔던 것처럼 adadminmin이런식으로 우회하면 될 것 같다.
아래처럼 말이다.
select id from prob_vampire where id='adadminmin'
위같이 하게 되면 admin이 한번 공백으로 치환되고 그 후에 쿼리로는 admin이 가게 될 것이다.
replace의 특성상 한번밖에 필터링 해주지 않는다.
그럼 해보자.
바로 클리어할 수 있었다.