fuzz web请求时,遇到请求参数被前端加signature怎么办
字数 943 2025-08-26 22:11:29
Web请求参数签名机制分析与绕过方法
1. 签名机制概述
在Web安全测试中,经常会遇到请求参数被前端添加signature的情况。这是一种常见的安全防护措施,用于防止参数被篡改。当请求参数有任何变化时,signature验证失败,请求就无法正常处理。
2. 签名机制分析流程
2.1 识别签名参数
首先观察请求包,发现以下关键参数:
token: 用户会话标识time: 时间戳version: API版本signature: 签名值md5str: 用于生成签名的原始字符串
示例请求:
token=o5z2z6...&time=1559801535&version=2&signature=5af79f...&md5str=time1559801535tokeno5z2z6...version2
2.2 前端代码分析
通过分析前端JavaScript代码(通常是app.js或类似文件),发现签名生成逻辑:
- 收集所有参数(排除"key"参数)
- 对参数按键名进行排序
- 拼接参数名和值形成
md5str - 在
md5str后追加key值 - 对拼接后的字符串进行MD5哈希,生成
signature
关键代码段:
var l = "";
r.map(function(e) {
"" !== e.value && (l += "" + e.key + e.value)
});
var f = l;
return l += e.key,
l = Object(a.hexMd5)(l),
n = Object.assign({
token: e.token,
time: t,
version: 2,
signature: l,
md5str: f
}, n),
2.3 关键参数获取
发现key参数通过单独的API请求获取:
export function getTokenKey(data) {
return request({
url: '?vcode/key',
method: 'post',
data
})
}
请求示例:
POST /xx/index.php/?vcode/key HTTP/1.1
Host: xxxxxxx
Content-Length: 0
响应示例:
{
"status": 200,
"data": {
"key": "08e95876b4d844789c00b350c1dc3e5d",
"siteCode": "hervu"
},
"token": "q7c2z319g3H1d8v5w8X7c2a0z7T6k9d8x2D9O2Z5d75275v100o7f2n3s2f8s2k9m1056915i618b15425g4e54370s4"
}
3. 签名生成验证
验证签名生成算法:
- 拼接
md5str:time + timestamp + token + token值 + version + version值 - 在
md5str后追加key值 - 对拼接后的字符串进行MD5哈希
验证公式:
signature = hexmd5(md5str + key)
4. 自动化测试解决方案
为了在参数fuzz测试时自动处理签名,实现了一个代理脚本。
4.1 代理脚本功能
- 拦截请求
- 解析请求体
- 重新计算签名
- 修改请求中的签名和md5str
- 转发修改后的请求
4.2 核心代码实现
def upadte_post_body(body):
key = '08e95876b4d844789c00b350c1dc3e5d'
paramlist = body.split('&')
paramlist.sort() # Simulate js key field sorting
paramdic = {}
new_md5str = ''
old_md5str = ''
new_sign = ''
old_sign = ''
for i in paramlist:
_ = i.split('=')
if _[0] != 'md5str' and _[0] != 'signature':
new_md5str = new_md5str + _[0] + _[1]
elif _[0] == 'md5str':
old_md5str = _[1]
elif _[0] == 'signature':
old_sign = _[1]
md5 = hashlib.md5()
hashstring = new_md5str + key
md5.update(hashstring.encode('utf-8'))
new_sign = md5.hexdigest()
body = body.replace(old_sign, new_sign)
body = body.replace(old_md5str, new_md5str)
return body
4.3 代理使用方式
- 常规HTTP站点:
python proxy_add_sign.py -p 8080
- HTTPS站点:
python proxy_add_sign.py -p 8080 -s True
5. 测试工具集成
5.1 与Burp Suite集成
- 配置Burp使用本地代理(127.0.0.1:8080)
- 所有请求将通过代理脚本自动处理签名
5.2 与sqlmap集成
使用--proxy参数:
sqlmap -u "http://target.com/api" --proxy="http://127.0.0.1:8080"
6. 总结
- 签名机制通常包括参数收集、排序、拼接和哈希
- 关键是要找到签名算法和必要的参数(如key)
- 代理脚本是处理签名验证的有效方法
- 该方法适用于各种测试工具,无需修改工具本身
完整项目地址:proxy_add_sign