记一次测试过程中登录参数加密逆向分析
字数 1272 2025-08-24 16:48:15
登录参数加密逆向分析教学文档
1. 前言
在渗透测试过程中,经常会遇到前端对登录参数进行加密的情况。本文将通过一个实际案例,详细讲解如何对登录框中的密码加密参数进行逆向分析,并实现加密算法的复现。
2. 环境准备
2.1 工具准备
- 浏览器开发者工具(Chrome/Firefox)
- Python 3.x
- Node.js(用于运行前端JS代码)
- 代码编辑器(VS Code等)
2.2 库准备
- Python:
pycryptodome或crypto-js - Node.js:
crypto-js
3. 加密分析流程
3.1 初步观察
- 打开目标登录页面
- 打开浏览器开发者工具(F12)
- 切换到"网络(Network)"选项卡
- 勾选"Fetch/XHR"筛选器
- 在登录框中输入测试密码(如"123456")并提交
- 观察请求参数,特别是password字段的值
3.2 定位加密函数
- 在开发者工具中切换到"源代码(Sources)"选项卡
- 使用全局搜索功能(Ctrl+Shift+F)搜索关键词:
- "encrypt"
- "password"
- "AES"
- "crypto"
- 找到疑似加密函数(本例中为
c(t)函数)
3.3 分析加密算法
通过分析找到的加密函数,确定以下信息:
- 加密算法:AES
- 加密模式:ECB
- 填充方式:PKCS7
- 密钥:需要进一步分析确定
4. 加密算法复现
4.1 Python实现方法
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
# 密钥(示例中使用的是16字节的密钥)
key = b'0123456789ABCDEF'
# 创建AES加密器(ECB模式)
cipher = AES.new(key, AES.MODE_ECB)
def encrypt(msg):
"""
加密函数
:param msg: 明文消息
:return: Base64编码的密文
"""
plaintext = msg.encode('utf-8')
padded_plaintext = pad(plaintext, AES.block_size)
ciphertext = cipher.encrypt(padded_plaintext)
return base64.b64encode(ciphertext).decode('utf-8')
def decrypt(ciphertext):
"""
解密函数
:param ciphertext: Base64编码的密文
:return: 解密后的明文
"""
ciphertext_bytes = base64.b64decode(ciphertext.encode('utf-8'))
padded_plaintext = cipher.decrypt(ciphertext_bytes)
plaintext = unpad(padded_plaintext, AES.block_size)
return plaintext.decode('utf-8')
# 测试
enData = encrypt('123456')
print("加密结果:", enData)
print("解密结果:", decrypt(enData))
4.2 Node.js实现方法
const CryptJs = require('crypto-js');
function c(t) {
var e = CryptJs.enc.Utf8.parse(t);
return CryptJs.AES.encrypt(e, {
"words": [808530483, 875902519, 943276354, 1128547654],
"sigBytes": 16
}, {
mode: CryptJs.mode.ECB,
padding: CryptJs.pad.Pkcs7
}).toString()
}
// 测试
data = '123456';
console.log(c(data));
5. 调试技巧
5.1 断点调试
- 在加密函数开始和结束处设置断点
- 单步执行观察变量变化
- 将光标悬停在变量上查看值
5.2 变量替换
- 当遇到未定义变量时(如示例中的
o) - 在断点处查看该变量的值
- 在复现代码中直接使用该值替换
6. 实际应用
6.1 密码爆破
- 准备密码字典(明文)
- 使用加密算法对字典中所有密码进行加密
- 使用加密后的密码进行爆破
6.2 自动化脚本
可以将加密逻辑集成到自动化测试工具中,如:
- Burp Suite的Intruder模块
- Python的requests库脚本
- 自定义的渗透测试工具
7. 注意事项
- 密钥获取:在实际分析中,密钥可能隐藏在JS的其他部分或通过其他方式生成
- 加密模式:确认是ECB还是其他模式(CBC等)
- 填充方式:常见的有PKCS7、ZeroPadding等
- 编码方式:注意Base64、Hex等不同编码方式
- 法律合规:确保测试行为获得授权
8. 扩展知识
8.1 AES加密模式
- ECB:电子密码本模式,简单但不安全
- CBC:密码分组链接模式,更安全但需要IV
- GCM:伽罗瓦/计数器模式,提供认证加密
8.2 其他常见前端加密
- RSA:非对称加密
- MD5/SHA:哈希算法(不可逆)
- 自定义加密算法
9. 总结
通过本文的学习,你应该掌握了:
- 如何识别前端加密参数
- 如何定位和分析加密函数
- 如何复现加密算法(Python和Node.js实现)
- 如何应用这些知识进行渗透测试
在实际工作中,每个网站的加密方式可能不同,需要灵活运用这些技巧进行分析。