从加密分析到登录验证码爆破
字数 949 2025-08-22 12:23:41
前端加密分析与验证码爆破实战教学
1. 加密分析基础
1.1 加密流量识别
- 全流量加密特征:无法直接判断传输的具体参数
- 关键搜索词:
encrypt、decrypt、cipher等加密相关术语
1.2 加密算法识别方法
- 全局搜索加密参数名称
- 逆向调试查找加密逻辑
- 分析前端JavaScript代码
2. 加密算法分析
2.1 AES-ECB加密
function i(e) {
if ("" === e) return e;
var t = a.enc.Utf8.parse(e),
n = a.AES.encrypt(t, a.enc.Utf8.parse("19RMSFORECAST123"), {
mode: a.mode.ECB,
padding: a.pad.Pkcs7
});
return n.ciphertext.toString()
}
关键参数:
- 密钥:
"19RMSFORECAST123"(硬编码) - 模式:ECB(电子密码本模式)
- 填充:PKCS7
2.2 AES-CBC加密
function s(e) {
var t = a.enc.Utf8.parse(a.MD5("jQaTs$K6Vnb9#nNp").toString()),
n = a.enc.Utf8.parse(a.MD5("QIBlGu3dwO#7geJm").toString().substr(0, 16));
if ("" === e) return e;
var i = a.enc.Utf8.parse(e),
s = a.AES.encrypt(i, t, {
iv: n,
mode: a.mode.CBC,
padding: a.pad.Pkcs7
});
return s.ciphertext.toString().toUpperCase()
}
关键参数:
- 密钥:
"jQaTs$K6Vnb9#nNp"的MD5哈希值 - IV(初始化向量):
"QIBlGu3dwO#7geJm"的MD5哈希值前16字节 - 模式:CBC(密码分组链接模式)
- 填充:PKCS7
3. 加解密脚本实现
3.1 使用CryptoJS库
const CryptoJS = require("crypto-js");
3.2 ECB模式加解密
// 加密函数(ECB模式)
function encryptECB(plaintext) {
if (!plaintext) return plaintext;
var key = CryptoJS.enc.Utf8.parse("19RMSFORECAST123");
var encrypted = CryptoJS.AES.encrypt(
CryptoJS.enc.Utf8.parse(plaintext),
key,
{ mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }
);
return encrypted.ciphertext.toString(); // 返回十六进制密文
}
// 解密函数(ECB模式)
function decryptECB(ciphertext) {
if (!ciphertext) return ciphertext;
var key = CryptoJS.enc.Utf8.parse("19RMSFORECAST123");
var decrypted = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Hex.parse(ciphertext) },
key,
{ mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }
);
return decrypted.toString(CryptoJS.enc.Utf8); // 返回解密后的明文
}
3.3 CBC模式加解密
// 加密函数(CBC模式)
function encryptCBC(plaintext) {
if (!plaintext) return plaintext;
var key = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("jQaTs$K6Vnb9#nNp").toString()
);
var iv = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("QIBlGu3dwO#7geJm").toString().substr(0, 16)
);
var encrypted = CryptoJS.AES.encrypt(
CryptoJS.enc.Utf8.parse(plaintext),
key,
{ iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
);
return encrypted.ciphertext.toString().toUpperCase();
}
// 解密函数(CBC模式)
function decryptCBC(ciphertext) {
if (!ciphertext) return ciphertext;
var key = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("jQaTs$K6Vnb9#nNp").toString()
);
var iv = CryptoJS.enc.Utf8.parse(
CryptoJS.MD5("QIBlGu3dwO#7geJm").toString().substr(0, 16)
);
var decrypted = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Hex.parse(ciphertext) },
key,
{ iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
);
return decrypted.toString(CryptoJS.enc.Utf8); // 返回解密后的明文
}
4. 登录参数分析
4.1 解密后参数
userid- 用户名/用户IDpassword- 密码mfacode- 多因素认证码(爆破目标)type- 用户权限类型(可能的越权测试点)
4.2 三重验证机制
- 用户名密码验证
- 图形验证码
- 登录验证码(mfacode)
5. 验证码爆破实战
5.1 爆破准备
- 使用脚本生成加密后的密码本
- 准备Burp Suite工具
5.2 爆破步骤
- 拦截登录请求
- 对
mfacode参数进行爆破 - 分析响应判断成功登录
5.3 安全风险升级
- 如果系统仅使用用户名+登录验证码(无密码验证),风险将升级为任意用户登录
6. 防御建议
6.1 开发者防护措施
- 避免硬编码密钥和IV
- 使用动态生成的密钥
- 实现服务端加密
- 增加请求频率限制
- 使用更复杂的多因素认证机制
6.2 渗透测试要点
- 检查加密参数是否可预测
- 验证密钥是否可逆向获取
- 测试验证码是否可爆破
- 检查权限参数是否可越权修改
7. 总结
本案例展示了如何通过分析前端加密算法、实现加解密脚本,并利用已知加密机制对验证码进行爆破的全过程。关键在于:
- 准确识别加密算法和参数
- 正确实现加解密过程
- 针对薄弱环节(如mfacode)进行定向爆破
- 理解系统安全机制的整体设计缺陷