BugkuCTF–分析–資訊提取
題目連接配接:資訊提取
下載下傳檔案,可以發現是一道流量分析的題目,用wireshark打開
根據題目的提示和流量包的内容可以知道這是一次布爾盲注的完整過程,是以我們直接過濾出http流量
接下來找出注入flag的地方,發現是從第806個流量包開始的,檢視流量包
發現注入的方法是二分法,這裡簡單的介紹一些
ORD
和
MID
ord() 傳回字元串第一個字元的ASCII值
mid() 傳回字元串的一部分
如果大于64成功, 那麼加上64的1/2即在判斷是否大于96, 依次判斷下去, 最後的判斷結果一定會收斂,最後可以得到第一個字元是 I。以此類推可以得到完整的flag,做本題需要一定的時間和體力。
2. 利用腳本,快速得到flag
1)我們直接過濾出http流量. 直接 檔案->導出分組解析結果->為CSV
2)我們發現如果注入的結果是真, 那麼傳回的消息會有這一行, 消息長度應該大于460
這裡直接上代碼,參考了大佬的代碼,做了一丁丁的修改
import re
import urllib.parse
# 更改為自己從wireshark提取出的csv檔案位址
f = open(r"D:/sqlmap.csv")
lines = f.readlines()
datas = []
# 轉碼, 儲存進datas
for line in lines:
datas.append(urllib.parse.unquote(line))
urls = [] # 儲存注入flag的url
for i in range(len(datas)): # 提取出注入flag的url
if datas[i].find("isg.flags ORDER BY `value` LIMIT 0,1),1,1))>64") > 0:
urls = datas[i:]
break
flag = {}
# 用正則比對
macth1 = re.compile(r"LIMIT 0,1\),(\d*?),1\)\)>(\d*?) HTTP/1.1")
macth2 = re.compile(r"HTTP,([0-9]{3})")
for i in range(0, len(urls), 2): # 因為有傳回響應, 是以步長為2
get1 = macth1.search(urls[i])
if get1:
key = int(get1.group(1)) # key儲存字元的位置
value = int(get1.group(2)) # value儲存字元的ascii編碼
get2 = macth2.search(urls[i+1])
if get2:
if int(get2.group(1)) > 450:
value += 1
flag[key] = value # 用字典儲存flag
f.close()
result = ''
for value in flag.values():
result += chr(value)
print(result)
# ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}