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或类似文件),发现签名生成逻辑:

  1. 收集所有参数(排除"key"参数)
  2. 对参数按键名进行排序
  3. 拼接参数名和值形成md5str
  4. md5str后追加key
  5. 对拼接后的字符串进行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. 签名生成验证

验证签名生成算法:

  1. 拼接md5str: time + timestamp + token + token值 + version + version值
  2. md5str后追加key
  3. 对拼接后的字符串进行MD5哈希

验证公式:

signature = hexmd5(md5str + key)

4. 自动化测试解决方案

为了在参数fuzz测试时自动处理签名,实现了一个代理脚本。

4.1 代理脚本功能

  1. 拦截请求
  2. 解析请求体
  3. 重新计算签名
  4. 修改请求中的签名和md5str
  5. 转发修改后的请求

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 代理使用方式

  1. 常规HTTP站点:
python proxy_add_sign.py -p 8080
  1. HTTPS站点:
python proxy_add_sign.py -p 8080 -s True

5. 测试工具集成

5.1 与Burp Suite集成

  1. 配置Burp使用本地代理(127.0.0.1:8080)
  2. 所有请求将通过代理脚本自动处理签名

5.2 与sqlmap集成

使用--proxy参数:

sqlmap -u "http://target.com/api" --proxy="http://127.0.0.1:8080"

6. 总结

  1. 签名机制通常包括参数收集、排序、拼接和哈希
  2. 关键是要找到签名算法和必要的参数(如key)
  3. 代理脚本是处理签名验证的有效方法
  4. 该方法适用于各种测试工具,无需修改工具本身

完整项目地址:proxy_add_sign

Web请求参数签名机制分析与绕过方法 1. 签名机制概述 在Web安全测试中,经常会遇到请求参数被前端添加signature的情况。这是一种常见的安全防护措施,用于防止参数被篡改。当请求参数有任何变化时,signature验证失败,请求就无法正常处理。 2. 签名机制分析流程 2.1 识别签名参数 首先观察请求包,发现以下关键参数: token : 用户会话标识 time : 时间戳 version : API版本 signature : 签名值 md5str : 用于生成签名的原始字符串 示例请求: 2.2 前端代码分析 通过分析前端JavaScript代码(通常是app.js或类似文件),发现签名生成逻辑: 收集所有参数(排除"key"参数) 对参数按键名进行排序 拼接参数名和值形成 md5str 在 md5str 后追加 key 值 对拼接后的字符串进行MD5哈希,生成 signature 关键代码段: 2.3 关键参数获取 发现 key 参数通过单独的API请求获取: 请求示例: 响应示例: 3. 签名生成验证 验证签名生成算法: 拼接 md5str : time + timestamp + token + token值 + version + version值 在 md5str 后追加 key 值 对拼接后的字符串进行MD5哈希 验证公式: 4. 自动化测试解决方案 为了在参数fuzz测试时自动处理签名,实现了一个代理脚本。 4.1 代理脚本功能 拦截请求 解析请求体 重新计算签名 修改请求中的签名和md5str 转发修改后的请求 4.2 核心代码实现 4.3 代理使用方式 常规HTTP站点: HTTPS站点: 5. 测试工具集成 5.1 与Burp Suite集成 配置Burp使用本地代理(127.0.0.1:8080) 所有请求将通过代理脚本自动处理签名 5.2 与sqlmap集成 使用 --proxy 参数: 6. 总结 签名机制通常包括参数收集、排序、拼接和哈希 关键是要找到签名算法和必要的参数(如key) 代理脚本是处理签名验证的有效方法 该方法适用于各种测试工具,无需修改工具本身 完整项目地址: proxy_ add_ sign