はまやんはまやんはまやん

hamayanhamayan's blog

dragon [LORD OF SQLINJECTION]

Lord of SQLInjection

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のものだけ抜き取れる。