把前八章串起来,用两道真实题目演示完整解题过程。建议对着 demo_sql.pcapng 在 Wireshark 里亲手过一遍。
题目:攻击者批量窃取了 N 份用户的身份证号,接口把身份证明文放在 idcard 字段里。请把这些号码按被窃取时间排序后拼接,对拼接结果算 MD5,最后 flag{md5}。
idcard 的 API。http.response contains "idcard",得到所有携带身份证的响应(看有多少条,掐头去尾确认数据量)。export-objects http 把响应当文本挑几条看字段真实结构。点开一条响应,内部 JSON 层能看到类似 "idcard":"3302…" 的 18 位号码。同时记录每条响应的相对时间(frame.time_relative)作为"被窃取时间"。
# 先导
tshark -r x.pcapng -Y "http.response contains \"idcard\"" \
-T fields -e frame.time_relative -e http.file_data > d.txt
# 再算(核心:双关键字排序 + 拼接 + md5)
import hashlib,re
r=[]
for i,line in enumerate(open('d.txt',encoding='utf-8',errors='ignore')):
m=re.search(r'"idcard"\s*:\s*"(\d{18})"',line)
try:t=float(line.split('\t')[0])
except:continue
if m:r.append((t,i,m.group(1)))
r.sort(key=lambda x:(x[0],x[1]))
s=''.join(x[2] for x in r)
print(len(s), hashlib.md5(s.encode()).hexdigest())
# flag{md5值}
题目:攻击者用 SQL 时间盲注逐字符爆破 flag 字符。对每个位置的字符用条件:若 ord(substr(flag,位置,1))… 为真则服务器 sleep(5),否则立即返回。延迟 5s 判定为真。请还原完整 flag。
http.request,找到带 substr / ord / if / sleep 的 SQL 注入请求。id=… 或类似参数里塞了 if(条件,sleep(5),0)。URL 解码后看真实 payload。关键:看「响应延迟」。
# 导出每条注入请求的延迟时间 + 判断条件(示意,字段按实际改) tshark -r x.pcapng -Y "http and tcp.payload contains \"sleep\"" \ -T fields -e frame.time_relative -e http.request.uri
然后在程序里按"下一个请求相对上一个的延迟是否≈5s"还原每位字符,逐位拼接。小样本先手推 2~3 位确认逻辑,再铺开。
chr()。| 共同点 | 挑战18 | 挑战25 |
|---|---|---|
| 先"观/滤"定协议与文件 | HTTP 明文 + API | HTTP + SQL 注入特征 |
| 信息在"哪个方向" | 响应体里的 idcard | 不是包内容,而是"时间和条件" |
| 组装规则 | 按时间(+序号)排序拼接 → MD5 | 按位置 1,2,3… 拼 ASCII 字符 |
| 验算标志 | 长度 N×18、条数=N | 28 位才是 flag 长度 |
| 最终形式 | flag{md5} | flag{…} |
所有流量题都是这套:看清题目在要什么 → 定位信息方向 → 抽取 → 按规则组装 → 验算。反复练习,你就能"看到什么题型 → 立刻知道套路"。