sql盲注流量分析
1、用Wireshark打开sqlshark.pcap文件
分析:只有TCP协议和HTTP协议,TCP协议在传输层,传输单位为报文段,所有直接看应用层的HTTP协议
2、过滤出HTTP 协议
3、分析数据包
请求:
响应:
响应为一个html的文本
响应内容1:
响应内容2:
分析:POST请求数据为
"username"="1"
"password" = "any'/**/Or/**/(iF(((leAst((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 14 fOr 1))),99)in(99))),1,0))#"
猜测拼接后的SQL语句为:select * from user where username='1' and password='any' Or (iF(((leAst((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 14 fOr 1))),99)in(99))),1,0))#'
当or后面语句正确时,就视为登录成功
4、用kali的tshark工具将数据部分提取出来
tshark -r sqlshark.pcap -Y "http" -T fields -e http.file_data > data.txt
-r:设置读取本地文件
-Y:使用过滤器的语法
-T: 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text;fields为字段
-e: 如果-T fields选项指定,-e用来指定输出哪些字段
这题根据POST数据和返回html文本数据就可以了,所以指定http.file_data
>:linux重定向将前面的内容输出写入到后面文件
提取后的数据POST数据为URL编码,写了脚本提取分析一下
5、脚本分析提取
初步分析:
发现每次截取查询出来的password每个字符,将截取的字符用ord函数转为ASCII码和输入的数字用least函数取最小的一个,判断是不是in里的数字,最后不带least函数进行确认。
例如:查出的password为abc
- ord(a) = 97
- least(97,101) in (101) ==> 97 in (101) -----false
- least(97,96) in (96) ==> 96 in (96) ----true
- least(97,97) in (97) ==> 97 in (97) ---- true
- (97) in (97) ----最后不用least函数进行确认
所以,只需要找出不含least的请求提取in里面的数字转为ASCII对应的字符拼接起来即可
# -*-coding:utf-8 -*-
# @File :exp.py
import urllib
from urllib import parse
with open("data.txt", "r") as f:
for line in f.readlines():
if "password" in line: # 如果password字段在,说明是请求
# 以password分割取后面一部分再进行url解密
line = urllib.parse.unquote(line.split('password=')[1])
# 存放请求数据
tmp = line
else: # 否则是响应
# 如果响应成功,并且不含least即是“确认”请求
if "login success" in line and "least" not in tmp.lower():
print(chr(int(tmp.split("in(")[1].split(")")[0])), end="")
套个VNCTF{}即可