由于传播、利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人承担,Cyb3rES3c及文章作者不承担任何责任。如有侵权烦请告知,我们将立即删除相关内容并致歉。请遵守《中华人民共和国个人信息保护法》、《中华人民共和国网络安全法》等相关法律法规。
在打CTF的时候常常会遇到一些要分析SQL盲注的流量包,如下图所示。
有时关键信息就藏在盲注请求的ASCII码中,如果要提取的数据包比较庞大,采用手工提取会比较繁琐而且容易出错,本文分享一个可以节省手工提取信息的时间同时保证准确率的技巧。
注:仅针对GET请求的SQL盲注。
WireShark导出文件时选择导出CSV文件,因为导出的CSV文件中的数据是保持先后顺序的(这一点很关键),方便进行数据处理。
提取CSV文件中的Info字段的内容
脚本原理:先过滤无关的数据(借助请求参数中的关键字进行过滤,如ascii、substr和一些库名、表名、字段名),将要提取的信息保存到List中,然后比较前后两个数据包的特定内容是否一致,如果不一致,则提取前一个数据包特定内容(一般是ASCII码),最后将ASCII码转换为字符拼接成字符串。
limit 0, 1) > 97
limit 0, 1) > 100
limit 1, 1) > 97
在上面的这个例子中要提取出 limit 0, 1) > 100,因为前后两个字段不一样,前一个是0,后一个是1。
下面以BUUCTF Misc sqltest为例
要提取的内容是这样的
GET /index.php?act=news&id=1%20and%20ascii(substr(((select%20concat_ws(char(94),%20flag)%20%20from%20db_flag.tb_flag%20%20limit%200,1)),%2038,%201))>125 HTTP/1.1
下面是一段自己写的脚本
import pandas as pd
from urllib.parse import unquote
filename = "./your-filename.csv"
readFile = pd.read_csv(filename)
secretList = []
columnName = "Info"
# 提取盲注请求
for element in readFile[columnName]:
# 需要根据情况自行替换过滤条件
if "GET" in element and "HTTP" in element and "substr" in element and "concat_ws" in element:
elementUrlDecode = unquote(element)
element = element.replace("%20", ' ').replace("GET /index.php?act=news&id=1 and ascii(substr(((select concat_ws(char(94), flag) from db_flag.tb_flag limit 0,1)),", '')
# print(element)
secretList.append(element)
# 初始化盲注字符位置
first = secretList[0].split(',')[0]
asciiList = []
# print(first)
for index in range(1, len(secretList)):
second = secretList[index].split(',')[0]
# 比较前后两个请求包中的盲注的字符位置是否相等,如果不相等则说明前一个请求参数的ascii是正确的
if first != second:
print(secretList[index - 1])
extractData = secretList[index - 1].split('>')[1].split(' ')[0]
asciiList.append(extractData)
# 刷新前后两个盲注的字符位置
first = second
# 单独处理最后一个盲注请求
print(secretList[len(secretList) - 1])
extractData = secretList[len(secretList) - 1].split('>')[1].split(' ')[0]
asciiList.append(extractData)
print(asciiList)
flag = ""
for element in asciiList:
flag += chr(int(element))
print(flag)
注:在提取信息时因为是比较前后两个数据包特定内容是否一致,如果不一致就提取前一个数据包相关的ASCII码,所以会忽略最后一个数据包的内容,需要在循环外单独处理最后一个数据包,如描述不清楚,可参考代码帮助理解。
程序执行结果如下
以上仅仅是自用的方法,如有好的技巧,欢迎留言分享!
原文始发于微信公众号(Cyb3rES3c):流量分析之提取WireShark中的SQL盲注流量技巧分享
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论