javascript前端审计:博彩网站后台js加密解密分析
字数 1081 2025-08-10 09:16:21
JavaScript前端审计:博彩网站后台JS加密解密分析
概述
本文档详细分析了一个博彩网站后台登录页面的前端JavaScript加密机制,包括加密流程分析、密钥提取方法和解密过程。
发现过程
- 目标平台需要下载APP使用
- 对APP进行渗透测试未发现可利用漏洞
- 通过信息搜集找到后台页面
- 尝试SQL注入、万能密钥、log4j2等攻击无效
- 转向密码爆破时发现前端加密机制
加密机制分析
关键JavaScript代码
function check() {
var code = 'letu@levle';
var yname = $("#yname").val();
if (!yname) {
alert("用户名不能为空");
return false;
} else {
var newName = secret(yname, code, false);
$("#xname").val(newName);
}
var ypassword = $("#ypassword").val();
if (!ypassword) {
alert("密码不能为空");
return false;
} else {
var newPassword = secret(ypassword, code, false);
$("#xpassword").val(newPassword);
}
}
function secret(string, code, operation) {
code = CryptoJS.MD5(code).toString();
var iv = CryptoJS.enc.Utf8.parse(code.substring(0, 16));
var key = CryptoJS.enc.Utf8.parse(code.substring(16));
if (operation) {
return CryptoJS.AES.decrypt(string, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
return CryptoJS.AES.encrypt(string, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
}
加密流程解析
-
check()函数:
- 获取用户名和密码输入值
- 检查输入是否为空
- 调用secret()函数对用户名和密码进行加密
- 将加密结果存入隐藏表单字段(xname和xpassword)
-
secret()函数:
- 使用CryptoJS.MD5对固定密钥'letu@levle'进行哈希
- 将MD5哈希结果分为两部分:
- 前16字节作为初始化向量(IV)
- 剩余部分作为AES密钥
- 使用AES-CBC模式进行加密
- 使用PKCS7填充方案
关键加密参数
- 固定密钥:
letu@levle - MD5哈希后的密钥:
ace43e65106a77f6f3991777154f4bd0- IV(初始化向量):
ace43e65106a77f6(前16字节) - AES密钥:
f3991777154f4bd0(后16字节)
- IV(初始化向量):
- 加密模式:AES-CBC
- 填充方案:PKCS7
- 输出编码:Base64
解密方法
已知密文示例
- 加密后的"admin"密文:
9RDmzgbdrAZ9Oqi1qgz4Uw==
解密步骤
- 使用CryptoJS.MD5哈希固定密钥'letu@levle'
- 将哈希结果分为IV和AES密钥
- 使用AES-CBC模式解密
- 应用PKCS7填充方案
JavaScript解密代码示例
function decrypt(encryptedString) {
var code = 'letu@levle';
code = CryptoJS.MD5(code).toString();
var iv = CryptoJS.enc.Utf8.parse(code.substring(0, 16));
var key = CryptoJS.enc.Utf8.parse(code.substring(16));
return CryptoJS.AES.decrypt(encryptedString, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
// 示例用法
var decrypted = decrypt("9RDmzgbdrAZ9Oqi1qgz4Uw==");
console.log(decrypted); // 输出: "admin"
安全漏洞利用
- 固定密钥:使用硬编码的固定密钥,一旦泄露所有加密数据都可解密
- 前端加密不可靠:前端加密不能替代HTTPS等传输层安全措施
- 可预测的IV:从密钥派生IV降低了安全性
后续渗透步骤
- 生成字典进行批量爆破
- 成功爆破出账号密码
- 登录后遇到Google二次验证屏障
防御建议
- 避免在前端使用固定密钥进行加密
- 实施完善的传输层安全措施(HTTPS)
- 使用随机生成的IV而非从密钥派生
- 实施速率限制防止爆破攻击
- 使用强二次验证机制(如Google Authenticator)
总结
通过分析前端JavaScript加密代码,可以提取出加密算法、密钥和IV等关键参数,从而实现对加密数据的解密。这凸显了仅依赖前端加密的安全风险,强调了实施多层次安全措施的重要性。