javascript前端审计:博彩网站后台js加密解密分析
字数 1081 2025-08-10 09:16:21

JavaScript前端审计:博彩网站后台JS加密解密分析

概述

本文档详细分析了一个博彩网站后台登录页面的前端JavaScript加密机制,包括加密流程分析、密钥提取方法和解密过程。

发现过程

  1. 目标平台需要下载APP使用
  2. 对APP进行渗透测试未发现可利用漏洞
  3. 通过信息搜集找到后台页面
  4. 尝试SQL注入、万能密钥、log4j2等攻击无效
  5. 转向密码爆破时发现前端加密机制

加密机制分析

关键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();
}

加密流程解析

  1. check()函数

    • 获取用户名和密码输入值
    • 检查输入是否为空
    • 调用secret()函数对用户名和密码进行加密
    • 将加密结果存入隐藏表单字段(xname和xpassword)
  2. secret()函数

    • 使用CryptoJS.MD5对固定密钥'letu@levle'进行哈希
    • 将MD5哈希结果分为两部分:
      • 前16字节作为初始化向量(IV)
      • 剩余部分作为AES密钥
    • 使用AES-CBC模式进行加密
    • 使用PKCS7填充方案

关键加密参数

  • 固定密钥:letu@levle
  • MD5哈希后的密钥:ace43e65106a77f6f3991777154f4bd0
    • IV(初始化向量):ace43e65106a77f6 (前16字节)
    • AES密钥:f3991777154f4bd0 (后16字节)
  • 加密模式:AES-CBC
  • 填充方案:PKCS7
  • 输出编码:Base64

解密方法

已知密文示例

  • 加密后的"admin"密文:9RDmzgbdrAZ9Oqi1qgz4Uw==

解密步骤

  1. 使用CryptoJS.MD5哈希固定密钥'letu@levle'
  2. 将哈希结果分为IV和AES密钥
  3. 使用AES-CBC模式解密
  4. 应用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"

安全漏洞利用

  1. 固定密钥:使用硬编码的固定密钥,一旦泄露所有加密数据都可解密
  2. 前端加密不可靠:前端加密不能替代HTTPS等传输层安全措施
  3. 可预测的IV:从密钥派生IV降低了安全性

后续渗透步骤

  1. 生成字典进行批量爆破
  2. 成功爆破出账号密码
  3. 登录后遇到Google二次验证屏障

防御建议

  1. 避免在前端使用固定密钥进行加密
  2. 实施完善的传输层安全措施(HTTPS)
  3. 使用随机生成的IV而非从密钥派生
  4. 实施速率限制防止爆破攻击
  5. 使用强二次验证机制(如Google Authenticator)

总结

通过分析前端JavaScript加密代码,可以提取出加密算法、密钥和IV等关键参数,从而实现对加密数据的解密。这凸显了仅依赖前端加密的安全风险,强调了实施多层次安全措施的重要性。

JavaScript前端审计:博彩网站后台JS加密解密分析 概述 本文档详细分析了一个博彩网站后台登录页面的前端JavaScript加密机制,包括加密流程分析、密钥提取方法和解密过程。 发现过程 目标平台需要下载APP使用 对APP进行渗透测试未发现可利用漏洞 通过信息搜集找到后台页面 尝试SQL注入、万能密钥、log4j2等攻击无效 转向密码爆破时发现前端加密机制 加密机制分析 关键JavaScript代码 加密流程解析 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字节) 加密模式:AES-CBC 填充方案:PKCS7 输出编码:Base64 解密方法 已知密文示例 加密后的"admin"密文: 9RDmzgbdrAZ9Oqi1qgz4Uw== 解密步骤 使用CryptoJS.MD5哈希固定密钥'letu@levle' 将哈希结果分为IV和AES密钥 使用AES-CBC模式解密 应用PKCS7填充方案 JavaScript解密代码示例 安全漏洞利用 固定密钥 :使用硬编码的固定密钥,一旦泄露所有加密数据都可解密 前端加密不可靠 :前端加密不能替代HTTPS等传输层安全措施 可预测的IV :从密钥派生IV降低了安全性 后续渗透步骤 生成字典进行批量爆破 成功爆破出账号密码 登录后遇到Google二次验证屏障 防御建议 避免在前端使用固定密钥进行加密 实施完善的传输层安全措施(HTTPS) 使用随机生成的IV而非从密钥派生 实施速率限制防止爆破攻击 使用强二次验证机制(如Google Authenticator) 总结 通过分析前端JavaScript加密代码,可以提取出加密算法、密钥和IV等关键参数,从而实现对加密数据的解密。这凸显了仅依赖前端加密的安全风险,强调了实施多层次安全措施的重要性。