前端加解密对抗encrypt-labs
字数 2219 2025-08-22 12:23:19

前端加解密对抗实战教学文档

1. 前言与工具准备

1.1 项目背景

  • 项目地址: https://github.com/SwagXz/encrypt-labs
  • 作者: SwagXz
  • 目标: 提供8种常见前端加密方式的实战练习环境,包括AES、DES、RSA等加密方式以及签名、防重放等安全机制

1.2 测试环境

  • 混淆版地址: http://82.156.57.228:43899
  • 无混淆版地址: http://82.156.57.228:43899/easy.php
  • 默认凭证: admin/123456

1.3 必备工具

  1. Burp插件: autoDecoder (https://github.com/f0ng/autoDecoder)
    • 支持AES、DES、SM4、SM2、RSA等加密方式
  2. 浏览器插件: Ctool (https://ctool.dev/)
    • 提供更全面的加解密功能验证

2. 加密方式分析与对抗技术

2.1 第一关: AES固定Key加密

加密分析

  • 加密参数: encryptedData
  • 加密方式: AES-CBC模式,PKCS7填充
  • Key: 1234567890123456
  • IV: 1234567890123456

对抗方法

  1. 定位加密函数:
function sendDataAes(url) {
  const formData = {
    username: document.getElementById("username").value,
    password: document.getElementById("password").value
  };
  const jsonData = JSON.stringify(formData);
  const key = CryptoJS.enc.Utf8.parse("1234567890123456");
  const iv = CryptoJS.enc.Utf8.parse("1234567890123456");
  const encrypted = CryptoJS.AES.encrypt(jsonData, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  }).toString();
}
  1. autoDecoder配置:
    • Key: 1234567890123456
    • IV: 1234567890123456
    • 正则表达式: encryptedData=([^&]+)

2.2 第二关: AES服务端动态Key

加密分析

  • 特点: 先请求获取Key/IV,再发送加密数据
  • Key/IV有效期: 客户端与服务端连接期间不变

对抗方法

  1. 先获取服务端返回的Key/IV
  2. 使用获取的Key/IV配置autoDecoder
  3. 保持会话不中断可重复使用同一Key/IV

2.3 第三关: RSA加密

加密分析

  • 加密参数: data
  • 公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----

对抗方法

  1. 定位加密函数:
const encrypted = jsEncrypt.encrypt(data.toString());
  1. autoDecoder配置:
    • 使用公钥进行加密
    • 无法解密(无私钥)
    • 可构造相同加密数据重放

2.4 第四关: AES+RSA混合加密

加密分析

  • 流程:
    1. 生成随机16位AES Key和IV
    2. 用AES加密表单数据
    3. 用RSA加密AES Key和IV
    4. 发送encryptedData(AES加密数据)、encryptedKeyencryptedIv

对抗方法

  1. 修改JS固定Key/IV:
// 修改前
const key = CryptoJS.lib.WordArray.random(16);
const iv = CryptoJS.lib.WordArray.random(16);

// 修改后
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("1234567890123456");
  1. 使用固定Key/IV生成encryptedData
  2. 可忽略encryptedKeyencryptedIv的修改

2.5 第五关: DES规律Key

加密分析

  • 加密参数: 仅password
  • Key规则: username补足8位(不足补6)
  • IV规则: "9999"+username前4位
  • 示例:
    • username: admin
    • Key: admin666
    • IV: 9999admi

对抗方法

  1. 定位加密函数:
const key = CryptoJS.enc.Utf8.parse(username.padEnd(8, '6'));
const iv = CryptoJS.enc.Utf8.parse('9999' + username.slice(0, 4));
  1. autoDecoder配置:
    • 根据username动态生成Key/IV

2.6 第六关: 明文加签(HMAC-SHA256)

签名分析

  • 参数: nonce(随机10位), timestamp, signature
  • 签名算法:
const dataToSign = username + password + nonce + timestamp;
const signature = CryptoJS.HmacSHA256(dataToSign, secretKey).toString(CryptoJS.enc.Hex);
  • secretKey: be56e057f20f883e

对抗方法

  1. Python发包脚本:
import hmac
import hashlib

def generate_signature(username, password, nonce, timestamp, secret_key):
    data_to_sign = username + password + nonce + str(timestamp)
    h = hmac.new(secret_key.encode('utf-8'), digestmod=hashlib.sha256)
    h.update(data_to_sign.encode('utf-8'))
    return h.hexdigest()
  1. 固定nonce可重复使用签名

2.7 第七关: 服务端动态签名Key

特点

  1. 先请求获取签名Key
  2. 使用获取的Key生成签名
  3. 发送登录请求时携带签名

对抗方法

  1. 实现两阶段请求:
    • 第一阶段获取签名Key
    • 第二阶段使用Key生成签名并发送
  2. 爆破时需要每次获取新Key

2.8 第八关: 防重放机制

加密分析

  • 参数: random(加密时间戳)
  • 加密方式: RSA加密当前时间戳
  • 防重放: 服务端检查时间戳唯一性

对抗方法

  1. Python实现:
def rsa_encrypt(data, public_key):
    key = RSA.import_key(public_key)
    cipher = PKCS1_v1_5.new(key)
    encrypted_data = cipher.encrypt(data.encode('utf-8'))
    return b64encode(encrypted_data).decode('utf-8')

timestamp = str(int(round(time.time() * 1000)))
random = rsa_encrypt(timestamp, public_key)
  1. 每次请求生成新的时间戳加密值

3. 总结与实战建议

3.1 通用分析流程

  1. 抓包定位加密参数
  2. 在JS中下断点分析加密逻辑
  3. 确定加密算法和关键参数(Key/IV等)
  4. 选择对抗方法:
    • 修改JS固定加密参数
    • 使用工具自动加解密
    • 编写自定义发包脚本

3.2 不同加密方式的对抗策略

加密类型 关键特征 对抗方法
AES固定Key 硬编码Key/IV 直接使用固定Key解密
AES动态Key 先获取Key再加密 保持会话重用Key
RSA 非对称加密,只有公钥 构造相同加密数据重放
混合加密 AES+RSA组合 固定AES Key或Hook加密过程
规律Key 根据输入生成Key 分析生成规则动态计算
加签 参数+签名 重现签名算法
防重放 唯一性校验 保证每次请求参数唯一

3.3 进阶技巧

  1. JS Hook: 覆盖加密函数获取明文
  2. 反混淆: 对于混淆代码使用AST解析
  3. 自动化: 将分析过程整合到自动化测试工具
  4. 动态调试: 结合浏览器开发者工具动态修改运行时代码

通过系统掌握这些加密方式和对抗技术,可以有效提升在前端加密场景下的渗透测试能力。

前端加解密对抗实战教学文档 1. 前言与工具准备 1.1 项目背景 项目地址 : https://github.com/SwagXz/encrypt-labs 作者 : SwagXz 目标 : 提供8种常见前端加密方式的实战练习环境,包括AES、DES、RSA等加密方式以及签名、防重放等安全机制 1.2 测试环境 混淆版地址 : http://82.156.57.228:43899 无混淆版地址 : http://82.156.57.228:43899/easy.php 默认凭证 : admin/123456 1.3 必备工具 Burp插件 : autoDecoder (https://github.com/f0ng/autoDecoder) 支持AES、DES、SM4、SM2、RSA等加密方式 浏览器插件 : Ctool (https://ctool.dev/) 提供更全面的加解密功能验证 2. 加密方式分析与对抗技术 2.1 第一关: AES固定Key加密 加密分析 加密参数 : encryptedData 加密方式 : AES-CBC模式,PKCS7填充 Key : 1234567890123456 IV : 1234567890123456 对抗方法 定位加密函数 : autoDecoder配置 : Key: 1234567890123456 IV: 1234567890123456 正则表达式: encryptedData=([^&]+) 2.2 第二关: AES服务端动态Key 加密分析 特点 : 先请求获取Key/IV,再发送加密数据 Key/IV有效期 : 客户端与服务端连接期间不变 对抗方法 先获取服务端返回的Key/IV 使用获取的Key/IV配置autoDecoder 保持会话不中断可重复使用同一Key/IV 2.3 第三关: RSA加密 加密分析 加密参数 : data 公钥 : 对抗方法 定位加密函数 : autoDecoder配置 : 使用公钥进行加密 无法解密(无私钥) 可构造相同加密数据重放 2.4 第四关: AES+RSA混合加密 加密分析 流程 : 生成随机16位AES Key和IV 用AES加密表单数据 用RSA加密AES Key和IV 发送 encryptedData (AES加密数据)、 encryptedKey 和 encryptedIv 对抗方法 修改JS固定Key/IV : 使用固定Key/IV生成 encryptedData 可忽略 encryptedKey 和 encryptedIv 的修改 2.5 第五关: DES规律Key 加密分析 加密参数 : 仅 password Key规则 : username补足8位(不足补6) IV规则 : "9999"+username前4位 示例 : username: admin Key: admin666 IV: 9999admi 对抗方法 定位加密函数 : autoDecoder配置 : 根据username动态生成Key/IV 2.6 第六关: 明文加签(HMAC-SHA256) 签名分析 参数 : nonce (随机10位), timestamp , signature 签名算法 : secretKey : be56e057f20f883e 对抗方法 Python发包脚本 : 固定nonce 可重复使用签名 2.7 第七关: 服务端动态签名Key 特点 先请求获取签名Key 使用获取的Key生成签名 发送登录请求时携带签名 对抗方法 实现两阶段请求: 第一阶段获取签名Key 第二阶段使用Key生成签名并发送 爆破时需要每次获取新Key 2.8 第八关: 防重放机制 加密分析 参数 : random (加密时间戳) 加密方式 : RSA加密当前时间戳 防重放 : 服务端检查时间戳唯一性 对抗方法 Python实现 : 每次请求生成新的时间戳加密值 3. 总结与实战建议 3.1 通用分析流程 抓包定位加密参数 在JS中下断点分析加密逻辑 确定加密算法和关键参数(Key/IV等) 选择对抗方法: 修改JS固定加密参数 使用工具自动加解密 编写自定义发包脚本 3.2 不同加密方式的对抗策略 | 加密类型 | 关键特征 | 对抗方法 | |---------|---------|---------| | AES固定Key | 硬编码Key/IV | 直接使用固定Key解密 | | AES动态Key | 先获取Key再加密 | 保持会话重用Key | | RSA | 非对称加密,只有公钥 | 构造相同加密数据重放 | | 混合加密 | AES+RSA组合 | 固定AES Key或Hook加密过程 | | 规律Key | 根据输入生成Key | 分析生成规则动态计算 | | 加签 | 参数+签名 | 重现签名算法 | | 防重放 | 唯一性校验 | 保证每次请求参数唯一 | 3.3 进阶技巧 JS Hook : 覆盖加密函数获取明文 反混淆 : 对于混淆代码使用AST解析 自动化 : 将分析过程整合到自动化测试工具 动态调试 : 结合浏览器开发者工具动态修改运行时代码 通过系统掌握这些加密方式和对抗技术,可以有效提升在前端加密场景下的渗透测试能力。