1. 项目概述
encrypt-labs 是一个专注于前端加密安全研究的靶场项目,旨在帮助安全研究人员和开发人员深入理解常见的前端加密技术及其潜在安全风险。该靶场模拟了多种真实场景下的前端加密实现方式,包括AES、RSA、DES等加密算法,以及签名验证等安全机制。
通过这个靶场,我们可以学习如何分析前端加密逻辑,掌握常用的解密和逆向手法,并构造符合服务端验证规则的请求。这对于理解现代Web应用的安全防护机制和潜在漏洞具有重要意义。
2. 环境搭建与配置
2.1 Docker环境准备
首先需要在Ubuntu 24.04.3 TLS系统上搭建Docker环境:
bash复制git clone https://github.com/Ta0ing/encrypt-labs-docker.git
cd src
sudo vim database.php
修改数据库配置如下:
php复制$host = 'encrypt_labs_mysql';
$dbname = 'encrypt_labs_db';
$username = 'encrypt_user';
$password = 'encrypt_password';
配置Docker镜像加速:
bash复制sudo vim /etc/docker/daemon.json
添加以下内容:
json复制{
"registry-mirrors": [
"https://docker.1ms.run",
"https://dockerproxy.cn",
"https://hub.rat.dev"
]
}
重启Docker服务:
bash复制systemctl restart docker
启动容器:
bash复制# 老版本Docker
docker-compose up -d --build
# 新版本Docker
docker compose up -d --build
启动后访问你的靶机ip:82,默认账户密码为admin/123456。
2.2 浏览器调试工具配置
为了有效分析前端加密逻辑,需要熟悉浏览器开发者工具的使用:
- Chrome/Firefox开发者工具(F12)
- 网络请求监控(Network)
- JavaScript调试(Sources/Debugger)
- 控制台(Console)
特别推荐使用Firefox的"栈跟踪"功能,可以更清晰地追踪加密函数的调用链。
3. 加密场景分析与破解
3.1 AES固定Key场景
3.1.1 加密逻辑分析
通过浏览器调试工具定位到加密函数sendDataAes,分析其加密参数:
- 算法:AES-CBC
- 密钥(Key):固定16位字符串"1234567890123456"
- 偏移量(IV):固定16位字符串"1234567890123456"
- 填充方式:PKCS7
- 输出:Base64编码
3.1.2 BurpSuite插件配置
使用Galaxy插件进行请求解密/加密:
- 下载Galaxy插件:
bash复制git clone https://github.com/outlaws-bai/Galaxy
- 修改
aes_cbc_form.py脚本:
python复制KEY = b"1234567890123456"
IV = b"1234567890123456"
JSON_KEY = "encryptedData"
- 启动插件并配置BurpSuite:
- 设置Hook Request
- 添加请求头
X-Galaxy-Http-Hook: HookedRequest
3.1.3 实际测试
在Repeater模块中测试解密功能:
- 发送加密请求
- 查看解密后的明文
- 修改明文内容
- 观察自动加密过程
3.2 AES服务端获取Key场景
3.2.1 加密流程分析
- 首先从服务端获取AES的Key和IV(Base64编码)
- 使用获取的Key和IV加密用户数据
- 发送加密后的数据
3.2.2 插件脚本修改
修改aes_cbc.py脚本:
python复制KEY = base64.b64decode("UMmKw73GSNZcCFqj6/XN5A==")
IV = base64.b64decode("1SofbOFnjQCBcNt2M35PTQ==")
JSON_KEY = "encryptedData"
3.2.3 测试验证
- 捕获获取Key的请求
- 使用获取的Key解密请求数据
- 修改明文后验证自动加密功能
3.3 RSA加密场景
3.3.1 加密逻辑分析
- 算法:RSA(PKCS#1 v1.5填充)
- 公钥:硬编码在前端代码中
- 加密对象:用户名和密码的JSON字符串
3.3.2 插件配置
使用rsa.py模板脚本:
python复制pub_key = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----"""
3.3.3 测试过程
- 捕获加密请求
- 使用插件自动加密修改后的明文
- 验证服务端响应
3.4 AES+RSA混合加密场景
3.4.1 加密流程分析
- 随机生成AES Key和IV
- 使用RSA公钥加密AES Key和IV
- 使用AES加密用户数据
- 发送加密后的数据和加密的Key/IV
3.4.2 破解思路
由于无法获取RSA私钥,可以采用以下方法:
- 使用浏览器Override功能固定AES Key和IV
- 修改
app.js代码:
javascript复制_0x4515a4 = CryptoJS.enc.Utf8.parse('1234567890123456')
_0x5e9345 = CryptoJS.enc.Utf8.parse('1234567890123456')
3.4.3 插件脚本
修改aes_rsa.py脚本:
python复制KEY = b"1234567890123456"
IV = b"1234567890123456"
JSON_KEY1 = "encryptedData"
3.5 DES规律Key场景
3.5.1 加密规则分析
- 算法:DES-CBC
- Key:用户名前8位,不足补'6'
- IV:'9999'+用户名前4位,不足补'9'
- 加密对象:密码字段
- 输出:16进制字符串
3.5.2 插件脚本
python复制def generate_key_iv(username: str) -> tuple[bytes, bytes]:
# 生成KEY
username_prefix = username[:8]
key = username_prefix.ljust(8, '6').encode()
# 生成IV
username_prefix_4 = username[:4]
iv_str = "9999" + username_prefix_4.ljust(4, '9')
iv = iv_str.encode()
return key, iv
3.6 明文加签场景
3.6.1 签名算法分析
- 算法:HmacSHA256
- 签名密钥:固定值"be56e057f20f883e"
- 签名原文:用户名+密码+随机数+时间戳
- 输出:16进制字符串
3.6.2 插件脚本
python复制# 签名密钥
secret_key = "be56e057f20f883e"
# 构造签名原文
sign_text = f"{username}{password}{nonce}{timestamp}"
# 计算签名
signature = hmac.new(
secret_key.encode('utf-8'),
sign_text.encode('utf-8'),
hashlib.sha256
).hexdigest()
3.7 服务端加签Key场景
3.7.1 流程分析
- 客户端发送用户名、密码和时间戳到服务端
- 服务端返回签名
- 客户端使用签名提交登录请求
3.7.2 实现方法
由于签名Key在服务端,无法直接获取,可以采用以下方法:
- 保持原始签名请求不变
- 修改明文后重新获取签名
- 使用新签名提交请求
4. 实战技巧与注意事项
4.1 调试技巧
-
代码定位:
- 使用浏览器"栈跟踪"功能追踪加密函数调用
- 在点击事件处设置断点
- 使用console.log输出关键变量
-
代码修改:
- 使用浏览器Override功能修改前端代码
- 固定加密参数便于分析
- 添加调试输出
-
请求分析:
- 注意请求格式(JSON/表单)
- 观察加密前后的数据变化
- 对比不同请求的参数差异
4.2 常见问题解决
-
解密失败:
- 检查加密算法和模式是否匹配
- 验证Key和IV是否正确
- 确认填充方式是否一致
-
插件不生效:
- 检查请求头
X-Galaxy-Http-Hook是否正确添加 - 验证插件脚本是否正常运行
- 确认端口和配置是否正确
- 检查请求头
-
编码问题:
- 注意Base64/Hex/URL编码的转换
- 确保字符编码一致(通常UTF-8)
- 处理JSON字符串时的转义字符
4.3 安全注意事项
-
合法授权:
- 仅对授权目标进行测试
- 遵守相关法律法规
-
测试环境:
- 使用隔离的测试环境
- 避免影响生产系统
-
数据保护:
- 不保存敏感数据
- 测试完成后清理环境
5. 扩展思考
5.1 前端加密的局限性
-
密钥暴露风险:
- 硬编码在前端的密钥容易被获取
- 动态获取的密钥可能被中间人攻击
-
算法依赖:
- 依赖JavaScript执行环境
- 可能被禁用或修改
-
性能影响:
- 复杂加密算法影响页面性能
- 移动端设备性能限制
5.2 改进建议
-
安全设计:
- 结合HTTPS传输
- 使用短期有效的动态密钥
- 实现服务端签名验证
-
防御措施:
- 增加请求频率限制
- 实施多因素认证
- 监控异常请求模式
-
最佳实践:
- 遵循OWASP安全指南
- 定期安全审计
- 保持加密库更新
通过encrypt-labs靶场的实践,我们深入理解了前端加密的实现方式和潜在风险。在实际开发中,应该平衡安全性和可用性,采用多层次的安全防护措施,而不仅仅依赖前端加密。同时,作为安全研究人员,掌握这些分析技术有助于发现和修复系统中的安全漏洞。