安全测试实战破解AES加密MD5签名验证的自动化解决方案第一次遇到那个靶场登录接口时我差点以为要无功而返了。BurpSuite的Intruder模块明明已经配置好了字典却总是返回签名校验失败的错误。这就像拿着一把万能钥匙却发现门锁不仅需要钥匙还需要实时生成的动态密码。本文将完整还原我如何通过autoDecoder工具解决这个结合AES加密和动态MD5签名的复杂验证机制。1. 问题定位当传统暴力破解遇上复合验证那是一个典型的登录接口但请求体和响应体都经过了AES加密更棘手的是请求头中还包含了三个关键字段timestamp当前时间戳requestId32位随机字符串sign基于请求体明文requestIdtimestamp的MD5签名# 签名生成伪代码 def generate_sign(json_body, request_id, timestamp): sign_str json_body request_id timestamp return hashlib.md5(sign_str.encode()).hexdigest()传统暴力破解在这里会遇到三个致命问题时间敏感性timestamp必须实时生成预先生成的数据包会因时间过期而失效请求唯一性每个requestId只能使用一次批量请求会导致签名校验失败数据关联性sign值依赖于requestId和timestamp三者必须保持逻辑一致提示在动态签名场景下多线程暴力破解几乎必然失败必须限制为单线程操作2. 逆向工程解密前端加密逻辑通过浏览器开发者工具分析我定位到了关键的加密函数AES加密参数算法AES-CBC密钥(key)1234567891234567偏移量(iv)1234567891234567填充方式PKCS7// 前端加密核心逻辑 function encryptData(plainText) { const key CryptoJS.enc.Utf8.parse(1234567891234567); const iv CryptoJS.enc.Utf8.parse(1234567891234567); return CryptoJS.AES.encrypt( plainText, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ).toString(); }同时发现了签名相关的两个关键函数函数名作用示例输出dtime()生成13位时间戳1689234567890p()生成符合UUIDv4规范的requestIda1b2c3d4-e5f6-4a7b-8c9d...3. 构建自动化加解密服务为了在BurpSuite中实现实时加解密我用Python搭建了一个本地处理服务from flask import Flask, request import hashlib from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import execjs app Flask(__name__) # 加载JS加密函数 ctx execjs.compile( function generateRequestId() { // UUID v4生成逻辑 } function getTimestamp() { return Date.now().toString(); } ) app.route(/encode, methods[POST]) def handle_encode(): # 获取原始请求 raw_body request.form[dataBody] raw_headers request.form[dataHeaders] # 生成动态参数 timestamp ctx.call(getTimestamp) request_id ctx.call(generateRequestId) # 计算签名 sign_str f{raw_body}{request_id}{timestamp} signature hashlib.md5(sign_str.encode()).hexdigest() # 更新请求头 new_headers update_headers(raw_headers, { timestamp: timestamp, requestId: request_id, sign: signature }) # AES加密请求体 encrypted aes_encrypt(raw_body) return f{new_headers}\r\n\r\n{encrypted}关键组件说明execjs执行前端加密逻辑确保与客户端行为一致Flask提供HTTP接口供BurpSuite调用PyCryptodome实现AES加解密与前端参数完全匹配4. autoDecoder配置实战autoDecoder的配置需要特别注意以下几个关键点配置项加解密服务器地址http://localhost:5000/encode解密服务器地址http://localhost:5000/decode处理模式选择Request/Response全自动处理1. 安装autoDecoder插件后进入Project options autoDecoder 2. 在Encode标签页填写加密服务URL 3. 在Decode标签页填写解密服务URL 4. 勾选Auto-process requests/responses常见配置错误及解决方法问题现象可能原因解决方案返回Invalid signature时间戳不同步检查服务器时间是否与客户端一致请求被拒绝requestId重复确保每次生成全新的requestId解密失败IV与密钥不匹配核对AES参数是否与前端一致注意测试时务必使用单线程模式动态签名机制对并发请求极其敏感5. 实战效果与技巧优化配置完成后BurpSuite的所有请求/响应都会自动加解密。在Repeater模块中可以直接编辑明文{ username: admin, password: guess123 }而实际发送的请求会变成POST /login HTTP/1.1 timestamp: 1689234567890 requestId: a1b2c3d4-e5f6-4a7b-8c9d... sign: 7a1b3f8d9c2e5f6a1b3f8d9c2e5f6a1 U2FsdGVkX13aB2jJZ5p7iVn4wGq7/KoLNpWxY9v8Jk几个提升效率的技巧字典预处理提前用Python生成常用密码的加密结果减少实时加密开销错误重试针对时间戳过期的情况自动重新生成签名结果过滤在Logger中设置过滤规则快速定位成功响应# 密码字典预处理示例 def preprocess_dict(wordlist): encrypted_words [] for word in wordlist: encrypted aes_encrypt(fpassword:{word}) encrypted_words.append(encrypted) return encrypted_words经过一周的实战这套方案成功破解了测试目标的弱密码防护。最关键的收获是面对复合验证机制时必须建立完整的加解密管道而autoDecoder正是连接BurpSuite与自定义解密逻辑的理想桥梁。