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

hamayanhamayan's blog

orge [LORD OF SQLINJECTION]

Lord of SQLInjection

include "./config.php"; 
login_chk(); 
$db = dbconnect(); 
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
$query = "select id from prob_orge 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>"; 

$_GET[pw] = addslashes($_GET[pw]); 
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge"); 
highlight_file(__FILE__); 

特徴は以下。

  • pwのみ入力するが、or,andが含まれるとエラー
  • 後半はorcと同じになっていて、adminのパスワードを取ってこないといけないのだろう

or,andが使えない状態でのBlind SQL Injection

Blind SQL Injection without and,or

andとorが使えなくても&&||で代用可能

' || id = 'admin' && {md} <= length(pw) #これを使ってパスワードの全長を解析しよう。
自分の場合は8だった。

' || id = 'admin' && {md} <= ascii(substr(pw,{i+1},1)) #
後半でasciiとsubstrを使ってある文字のバイナリ値を取得している。
この値を二分探索で特定して、一文字ずつ探し当てていこう。

guestで使ってるパスワードどうするんだろう…

と思いつつとりあえず、出てきたパスワードで?pw=7b751aecしてみたらClearした。
確かによくよくみたら、exitとかしてないから、前半はどうなってもいいのか。