目录
下载解压文件,根据题目意思,应该是一道SQL盲注的流量题,这种题目一般有两种解法,一种是手工,另一种是利用脚本跑出flag,本题需要一定的SQL注入知识
手工法
我们先导出http流,查看一下SQL盲注过程
文件——导出对象——HTTP
根据http请求分析,估计这流量打的应该是sqli-labs的靶场,但是我们还不能很确定盲注的字符,哪个才是正确的,但是一般都是响应包字节不同或者是序号中的最后一个才是正确的字符,所以我们过滤一下http流,观察一下正确的响应包
回到原来的界面,输入http并回车,观察发现的确序号是最后一个才是正确的字符,而且响应包长度是764,盲注错的响应包是763,所以废话不多说,再次导出http流,我们直接拉到后面爆flag的http请求
注意到不是用二分法是用递增的方法跑的,后面的操作都是在爆表名,所以flag肯定就是某一个表名
观察发现,到1629组时开始爆出flag,每个数字后面的最后一位就是正确的表名,到这里我们可以手工一个拼接起flag了
值得注意的是,拼接完后的flag是错误的,是因为第十五个字符没跑出来
这里应该是作者调皮,把第十五个正确跑出来的字符http请求给删掉了,而且是递增跑的,所以正确的字符应该就在2后面的ascii码对应的字符里,从3开始猜数发现flag正确
脚本法
简单思路就是,先利用文件流操作,将跑表名的http请求给过滤出来,然后再利用re库正则匹配序号以及盲注的字符,配合字典的方法过滤掉盲注错误的字符,就得到flag了
下面是我自己写的python脚本
#文件流过滤目标类型:
#?id=1'%20and%20substr((select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()),52,1)='f'%20--+ HTTP/1.1
import re
#用列表存放过滤出来的http请求
text=[]
with open(r"cap.pcap","rb") as f:
for i in f.readlines():
if b"?id=1'%20and%20substr((select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())" in i:
text.append(i.strip())
f.close()
#利用字典配合正则提取正确盲注的字符
flag={}
for i in text:
try :
num = int(re.search(br"database\(\)\),(\d+),1\)",i).group(1).decode()) #匹配序号
str = re.search(br"1\)='(.|\n)'%20--\+ HTTP/1.1",i).group(1).decode() #匹配字符
flag[num] = str #过滤错误的字符
except:
pass
#输出
for i in flag.values():
print(i,end="")
运行结果:
得到正确flag:
flag{e63d3da86fe34a83bbfbdb9d3177a641}
手工法flag错误原因
盲注正确的报文确实是存在的,只是被出题人动了手脚,导致正确盲注的第十五位flag没在wireshark显示出来
所以用脚本跑出来的flag才是正确的