BUU 流量分析 sqltest
阿新 • • 發佈:2021-08-10
知識點
sql盲注
做題過程
首先我們觀察流量包,可以看到很多條這樣的http請求,url中有select
, SCHEMA_name
等,可以確定是對mysql資料庫的盲注
我們來把url的部分提取出來
一種方法是匯出http物件
,但是這樣的話接下來就要手動讀注入資訊了,這很不方便
所以我們用tshark提取
tshark -r sqltest.pcapng -Y "http.request" -T fields -e http.request.full_uri > data.txt
-r 讀取檔案 -Y 過濾語句 -T pdml|ps|text|fields|psml,設定解碼結果輸出的格式 -e 輸出特定欄位 http.request.uri http請求的uri部分
現在我們可以寫python來提取資料了。
來看提取出的payload:
第一部分 獲取資料庫庫名
1.獲取information_schema.SCHEMATA中資料行數的長度,從中可以知道長度是1
2.獲取information_schema.SCHEMATA中資料行數,chr(53) = '5'
,即infomation_schema.SCHEMATA有5行資料
information_schema.SCHEMATA中儲存了所有資料庫
3.(第19行-第61行+第65,66行)
開始獲取每一個數據庫的長度,這一部分是併發執行的
4.(62,63,64,第67-417行)
開始獲取每一個數據庫庫名,併發執行
418行已經獲取到了庫名
第二部分 表
1.表名個數的長度
2.表名個數
3.表名長度
4.表名(445-510)
511看到已經獲取了表名
第三部分 欄位
1.欄位個數的長度
2.欄位個數
3.獲取每一個欄位長度
4.併發獲取每個欄位欄位名(546-601)
第四部分 值
1.值個數的長度
2.值的個數
值的個數為1
3.值的長度
這一個值的長度是38
4.獲取值(628-972)
這一步就是我們要找的flag了,寫一個指令碼提取一下。我們知道注入語句為
id=1 and ascii(substr(((select concat_ws(char(94), flag) from db_flag.tb_flag limit 0,1)), {第i個字元}, 1))>{字元的ascii值}
我們把第i個字元
和ascii值
提取出來,取i變化時的值,指令碼為:
import urllib.parse
f = open("data.txt","r").readlines()
s = []
for i in range(627,972):
data = urllib.parse.unquote(f[i]).strip()
payload = data.split("and")[1]
positions = payload.find("from db_flag.tb_flag limit 0,1)), ")
data1 = payload[positions+35:].split(",")[0]
data2 = payload[positions+35:].split(">")[1]
s.append([data1,data2])
for i in range(1,len(s)):
if s[i][0]!=s[i-1][0]:
print(chr(int(s[i-1][1])),end="")
print(chr(int(s[-1][1])))