记某次bp插件+flask自动替换绕过防重放的漏洞挖掘
字数 1792 2025-08-23 18:31:18
Burp插件+Flask自动替换绕过防重放机制漏洞挖掘技术文档
1. 前言
本文档详细记录了一种利用Burp插件结合Flask服务自动替换请求头签名参数,从而绕过前端防重放机制的漏洞挖掘方法。该方法适用于前端采用时间戳、随机字符串和签名校验的防重放机制场景。
2. 技术背景
2.1 防重放机制分析
目标系统采用的防重放机制包含三个关键参数:
Timestamp:时间戳Noncestr:随机字符串(UUID v4)Signature:基于请求参数、时间戳、随机字符串和密钥生成的MD5签名
2.2 防重放机制工作原理
- 每次请求必须携带新的验证参数
- 服务端校验签名有效性
- 签名包含时间戳,可防止重放攻击
- 签名包含随机字符串,确保每次请求唯一
3. 签名生成机制分析
3.1 参数定位方法
- 使用Burp Suite抓取正常请求
- 观察请求头中疑似防重放的参数
- 通过浏览器开发者工具全局搜索关键字(Ctrl+Shift+F12)
- 在JavaScript代码中设置断点调试
3.2 签名生成逻辑
3.2.1 Noncestr生成
// 生成UUID v4随机字符串
n._create4 = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
3.2.2 Signature生成
- 根据请求方法处理参数:
- GET请求:对参数进行排序后拼接
- POST请求:直接拼接JSON数据
- 拼接格式:
param + "&" + 时间戳 + "&" + nonceStr + "&" + key - 对拼接后的字符串进行MD5哈希
3.2.3 签名验证流程
- 服务端接收请求
- 使用相同算法生成签名
- 比较客户端签名与服务端签名
- 验证时间戳有效性(防重放窗口)
4. 自动化绕过方案
4.1 技术架构
使用以下组件实现自动化绕过:
- Burp Suite:作为主要的HTTP代理和测试工具
- autoDecoder插件:实现请求/响应的自动处理
- Flask服务:提供签名生成和请求头替换功能
4.2 工具准备
-
安装autoDecoder插件:
- GitHub地址:https://github.com/f0ng/autoDecoder
- 支持Burp Suite的请求/响应自动加解密
-
Flask服务框架:
- 轻量级Python Web框架
- 提供签名生成API接口
4.3 Flask服务实现
4.3.1 服务端代码
from flask import Flask, request
import hashlib
import uuid
import time
app = Flask(__name__)
# 替换为实际的密钥
SECRET_KEY = "your_secret_key_here"
def generate_signature(params, timestamp, nonce_str):
"""
生成签名
:param params: 请求参数字符串
:param timestamp: 时间戳
:param nonce_str: 随机字符串
:return: MD5签名
"""
sign_str = f"{params}&{timestamp}&{nonce_str}&{SECRET_KEY}"
return hashlib.md5(sign_str.encode('utf-8')).hexdigest()
@app.route('/encode', methods=["POST"])
def encrypt():
"""
处理Burp Suite发送的加密请求
"""
# 获取请求参数
body = request.form.get('dataBody') # 请求体
headers = request.form.get('dataHeaders') # 请求头
# 生成新的签名参数
timestamp = str(int(time.time()))
nonce_str = str(uuid.uuid4())
# 处理GET/POST参数
if request.method == "GET":
# 对GET参数排序处理
params = "&".join(sorted(body.split("&"))) if body else ""
else:
# POST请求直接使用JSON体
params = body if body else ""
signature = generate_signature(params, timestamp, nonce_str)
# 构造新的请求头
new_headers = []
if headers:
for line in headers.split("\r\n"):
if not any(line.startswith(h) for h in ["Timestamp:", "Noncestr:", "Signature:"]):
new_headers.append(line)
new_headers.append(f"Timestamp: {timestamp}")
new_headers.append(f"Noncestr: {nonce_str}")
new_headers.append(f"Signature: {signature}")
# 返回处理后的请求
return "\r\n".join(new_headers) + "\r\n\r\n" + (body if body else "")
@app.route('/decode', methods=["POST"])
def decrypt():
"""
处理Burp Suite发送的解密请求(本例中不需要)
"""
return request.form.get('dataBody', '')
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8888, debug=True)
4.3.2 服务部署
-
安装依赖:
pip install flask -
启动服务:
python app.py
4.4 Burp Suite配置
-
安装autoDecoder插件:
- 通过Burp Suite的Extender选项卡添加插件
-
配置插件:
- 加密接口:
http://localhost:8888/encode - 解密接口:
http://localhost:8888/decode - 勾选"Intruder payload processing"选项
- 加密接口:
-
解决中文乱码问题:
- 检查Python文件编码(UTF-8)
- 确保Flask响应头包含
Content-Type: text/html; charset=utf-8
5. 漏洞挖掘流程
5.1 测试环境发现
-
在测试过程中注意观察:
- 域名跳转情况
- 接口文档泄露
- 测试环境标识
-
发现测试环境后:
- 立即收集接口文档
- 备份所有可用接口
- 对比测试环境与生产环境差异
5.2 接口Fuzz测试
-
使用配置好的Burp Suite进行测试:
- 利用Intruder模块批量测试接口
- 自动处理签名参数,无需手动干预
-
重点关注:
- 未授权访问接口
- 参数注入点
- 业务逻辑漏洞
6. 防御建议
6.1 加强防重放机制
-
增加签名算法复杂度:
- 使用HMAC-SHA256替代MD5
- 加入客户端指纹信息
-
缩短时间戳有效窗口:
- 从分钟级缩短到秒级
- 服务端严格校验时间戳
6.2 其他安全措施
-
接口文档管理:
- 测试环境与生产环境隔离
- 接口文档访问控制
-
代码混淆:
- 对前端加密代码进行混淆
- 防止签名算法被轻易分析
-
多因素校验:
- 结合IP限制
- 加入二次验证机制
7. 总结
本文介绍了一种完整的绕过前端防重放机制的方法,通过分析签名生成逻辑,结合Burp插件和Flask服务实现自动化请求处理,有效提高了在防重放机制下的漏洞挖掘效率。该方法的核心在于:
- 准确分析前端签名生成逻辑
- 设计自动化签名生成服务
- 利用Burp插件实现无缝集成
- 针对测试环境进行重点测试
此技术方案不仅适用于本文描述的特定场景,经过适当修改后也可应用于其他类似的防重放机制绕过场景。