1. 程式人生 > >[百度杯] 九月場第二週 Sqli writeup

[百度杯] 九月場第二週 Sqli writeup

這道sql注入題折磨了我相當久,痛哭流涕啊!

拿到題,訪問url:
http://90fefcf9ed494886b66499d44a5b4f7466e12887e8b44c96.game.ichunqiu.com/b68a89d1c4a097a9d8631b3ac45e8979.php
老套路,先看原始碼,提示 login.php?id=1 ,心裡想著都是套路,然後訪問url:
http://90fefcf9ed494886b66499d44a5b4f7466e12887e8b44c96.game.ichunqiu.com/login.php?id=1
頁面顯示:welcome admin! 哈哈哈,這麼簡單,開始注入吧!然後,就沒有然後了,根本注入不出來,什麼情況?
走投無路,看看前輩門的writeup吧。前輩說:訪問頁面時會經過一次302的重定向,然後在重定向的response的headers 裡得到示:l0gin.php?id=1 注意這裡的0是數字0。我用burpsuite抓包發現哪裡有重定向啊?到底是哪裡出了問題?為什麼我找不到重定向的頁面呢?經過幾次測試發現是在訪問

http://90fefcf9ed494886b66499d44a5b4f7466e12887e8b44c96.game.ichunqiu.com/時發生了重定向,而且重定向到了
/b68a89d1c4a097a9d863lb3ac45e8979.php 和題目裡面給定的url只有一字只差
b68a89d1c4a097a9d8631b3ac45e8979.php 一個是l一個是1,真是考研我的眼力啊! 然後果然在headers裡發現了一個page欄位,內容是l0gin.php?id=1 。總結一下上面的套路,重定向一般發生在訪問域名而且不加引數或者資料夾名,檔名這樣的情況下,比如直接訪問http://90fefcf9ed494886b66499d44a5b4f7466e12887e8b44c96.game.ichunqiu.com/
就會重定向到一個預設的頁面檔案。因該記住這個套路。
好了,跳過了第一個坑,得到的頁面是這樣的:
這裡寫圖片描述
老實說,找這個注入點還是費了我很大的功夫,現在找出來了,回過頭來看,發現又是那麼簡單,真是鬼迷了心竅啊!
做題過程中給我帶來困難的就是哪個id列,有時候它會顯示url中的id引數的全部,有時候有隻會顯示一部分,給我帶來了很大的迷惑,現在想來它的顯示規則是這樣的:
當sql查詢有結果時,就從結果裡面提取出id,和username欄位來進行顯示;如果查詢失敗或者查詢沒有結果,那就從url引數裡面提取進行過過濾處理的id引數 。
在知道這個條件的情況下,我們就可以判斷注入語句到底有沒有執行,而不受顯示的id內容的干擾了。

1. 判斷過濾掉的字元:

不用想,肯定是有waf的,那麼知道過濾掉了哪些字元就很重要了。經過檢測發現會截斷 逗號, 井號#後面的值,當然也包括這兩個符號。遇到這種情況我們肯定要想,能不能繞過過濾,比如用轉換編碼的方法 。要想驗證繞過是否成功,那就需要注入點啊(起始尋找繞過waf方法,和尋找注入點有時候是交叉進行的)。由於沒有對單引號進行過濾,我們先試一下
id =1 and 1 ; id=1 and 0這兩種。
這裡寫圖片描述
很不幸的是好像進行了一中特殊的過濾,使 id=1fdadsd 這樣的引數直接識別為 id =1 而把後面的東西去掉。我也不曉得為啥要這樣做。換一個字元型注入吧 : id =1’ and ‘1
這裡寫圖片描述
查詢成功,但是還不能確定注入程式碼是否執行,再用 : id=1’ and ‘0
這裡寫圖片描述
查詢無結果,說明我們的注入語句執行成功了。但是要想獲得資料庫內容,就要看看能不能繞過逗號的過濾。我們先試一下url編碼的方式繞過#號過濾: (#的url編碼是%23)
這裡寫圖片描述
這裡寫圖片描述
看來繞過了對#號的過濾,再看能不能繞過逗號:
這裡寫圖片描述
結果是不幸的,不能用url編碼繞過逗號的過濾,果然這道題的過濾是非常惱人的。然後怎麼辦?看前輩的writeup找到一中不使用逗號注入資料庫的方法:
這裡寫圖片描述
這裡寫圖片描述
是不是覺得很奇怪,為啥顯示的不一樣。我覺得這也是一個關鍵點。對於表格型別的顯位,比如題目中這樣的,只會顯示出查詢結果中的一條記錄,如果我們用 id =1 ’ union select …..這樣的方式,那顯示的就是id=1的查詢結果,所以我們可以用
id=11’ union … 或者直接id= ’ union select …..
可以看到當前的資料庫是sqli 。
讓我們看一下有哪些資料庫
id= ' union select * from (select group_concat(distinct(table_schema)) from information_schema.tables ) a join (select version() ) b %23
這裡寫圖片描述
再看一下sqli裡面有哪些表:
id=' union select * from (select group_concat(table_name ) from information_schema.tables where table_schema = 'sqli' ) a join (select version() ) b %23
這裡寫圖片描述
再看一下有哪些欄位:
id = ' union select * from (select group_concat(column_name ) from information_schema.columns where table_name = 'users' ) a join (select version() ) b %23
這裡寫圖片描述
看一下flag_9c861b688330這個欄位裡的內容:
id=' union select * from (select group_concat(flag_9c861b688330 ) from users ) a join (select version() ) b %23
這裡寫圖片描述
找到了!