渗透测试之前端JS加密浅析
字数 1642 2025-08-10 23:41:50

前端JS加密分析与渗透测试指南

一、加密算法快速判断方法

1. 通过密文特征判断

散列算法特征:

  • MD5: 32位十六进制 (如: e10adc3949ba59abbe56e057f20f883e)
  • SHA1: 40位十六进制 (如: 7c4a8d09ca3762af61e59520943dc26494f8941b)
  • SHA256: 64位十六进制 (如: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92)
  • SHA512: 128位十六进制

编码特征:

  • BASE64: 以"="结尾 (如: MTIzNDU2)
  • BASE32: 以"======"结尾 (如: GEZDGNBVGY======)
  • Unicode: 包含"\u"前缀 (如: \u0031\u0032\u0033\u0034\u0035\u0036)

加密算法特征:

  • DES/AES/RSA: 密文无规律,常以Base64编码输出
  • 对称和非对称加密通常以16进制形式表示(最大字母到F)

2. 通过开发者工具判断

  • 查看Network加载资源,寻找加密库如:
    • jsencrypt
    • crypto-js
    • 其他自定义加密库

二、加密JS代码定位方法

1. 关键字搜索法

  • 常用搜索关键字:

    • encrypt
    • passwd/password
    • MD5/AES/DES/RSA
    • 加密参数名
  • 搜索对象定义:

    var object
    function object
    object:
    object =
    

2. XHR断点法

适用场景:XHR/fetch请求

操作步骤

  1. 在开发者工具的XHR/fetch Breakpoints中添加固定路径(如:/adminlogin)
  2. 提交请求时会被断住
  3. 通过调用栈分析(从下往上)定位加密点

优点:距离加密函数较近

3. DOM事件断点法

操作步骤

  1. 在开发者工具的Event Listeners中找到登录事件
  2. 定位到相关JS文件
  3. 在疑似加密处下断点
  4. 跟值分析

特点:定位位置靠前,需要跟值到加密点

三、加密算法特征与扣取方法

1. RSA加密

特征代码

new JSEncrypt();
a.setPublicKey("key");
a.encrypt(passwd);

扣取步骤

  1. 找到JSEncrypt对象定义
  2. 提取整个大函数(通常在2000行左右)
  3. 解决环境依赖:
    navigator = {};
    window = this;
    
  4. 构造调用函数:
    function rsaPass(passwd) {
      var e = new JSEncrypt();
      e.setPublicKey("public_key_here");
      return e.encrypt(passwd);
    }
    

注意

  • RSA加密同一字符串每次生成的密文不同
  • 公钥通常隐藏在HTML元素中(如:$("#e").val())

2. DES加密

特征代码

const keyBytes = CryptoJS.enc.Utf8.parse(key);
const encrypted = CryptoJS.DES.encrypt(message, keyBytes, {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
});

关键参数

  • 密钥(key)
  • 加密模式(ECB/CBC等)
  • 填充方式(Pkcs7等)

3. AES加密

特征代码

function Encrypt(xxx){
  var xxx = CryptoJS.enc.Utf8.parse('key');
  var xx = CryptoJS.enc.Utf8.parse(xxx);
  var xxx = CryptoJS.AES.encrypt(xxx);
}

四、代码提取注意事项

  1. 作用域问题

    var _hex_md5;
    !(function(){
      var j = {
        hex_md5: function(){ console.log("1"); }
      }
      _hex_md5 = j; //导出
    })()
    
  2. 完整提取

    • 不能只提取加密函数,需要包含其所属对象
    • var开始到最后一个}是一个完整单元
  3. 环境依赖

    • 注意navigatorwindow等浏览器对象
    • 可能需要补充依赖如ASN1

五、测试脚本开发

1. 加密脚本

  • DES/AES/RSA批量加密脚本
  • 需要预先提取目标网站的key和加密参数

2. SQL注入辅助脚本

  • AES/DES配合sqlmap的SQL注入脚本
  • 示例项目:https://github.com/Small-ears/DES-AES_SQL_Scripts

六、常见问题解决

  1. 环境报错

    • ASN1 is not defined:从加密库源码中补充相关定义
    • 浏览器环境对象缺失:补充navigatorwindow
  2. 密文不一致

    • 检查加密模式(ECB/CBC)和填充方式
    • RSA加密同一字符串每次结果不同是正常现象
  3. 代码提取不全

    • 确保提取完整的函数作用域
    • 注意闭包和自执行函数

七、实战建议

  1. 优先使用XHR断点法定位加密点
  2. 对于非XHR请求,使用DOM事件断点或关键字搜索
  3. 提取代码时注意环境依赖和作用域
  4. 测试时先验证单个加密结果是否匹配
  5. 开发自动化脚本时考虑参数化和批量处理

通过以上方法,可以有效地分析和处理前端JS加密,为渗透测试提供必要的技术支持。

前端JS加密分析与渗透测试指南 一、加密算法快速判断方法 1. 通过密文特征判断 散列算法特征: MD5: 32位十六进制 (如: e10adc3949ba59abbe56e057f20f883e) SHA1: 40位十六进制 (如: 7c4a8d09ca3762af61e59520943dc26494f8941b) SHA256: 64位十六进制 (如: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92) SHA512: 128位十六进制 编码特征: BASE64: 以"="结尾 (如: MTIzNDU2) BASE32: 以"======"结尾 (如: GEZDGNBVGY======) Unicode: 包含"\u"前缀 (如: \u0031\u0032\u0033\u0034\u0035\u0036) 加密算法特征: DES/AES/RSA: 密文无规律,常以Base64编码输出 对称和非对称加密通常以16进制形式表示(最大字母到F) 2. 通过开发者工具判断 查看Network加载资源,寻找加密库如: jsencrypt crypto-js 其他自定义加密库 二、加密JS代码定位方法 1. 关键字搜索法 常用搜索关键字: encrypt passwd/password MD5/AES/DES/RSA 加密参数名 搜索对象定义: 2. XHR断点法 适用场景 :XHR/fetch请求 操作步骤 : 在开发者工具的XHR/fetch Breakpoints中添加固定路径(如:/adminlogin) 提交请求时会被断住 通过调用栈分析(从下往上)定位加密点 优点 :距离加密函数较近 3. DOM事件断点法 操作步骤 : 在开发者工具的Event Listeners中找到登录事件 定位到相关JS文件 在疑似加密处下断点 跟值分析 特点 :定位位置靠前,需要跟值到加密点 三、加密算法特征与扣取方法 1. RSA加密 特征代码 : 扣取步骤 : 找到JSEncrypt对象定义 提取整个大函数(通常在2000行左右) 解决环境依赖: 构造调用函数: 注意 : RSA加密同一字符串每次生成的密文不同 公钥通常隐藏在HTML元素中(如:$("#e").val()) 2. DES加密 特征代码 : 关键参数 : 密钥(key) 加密模式(ECB/CBC等) 填充方式(Pkcs7等) 3. AES加密 特征代码 : 四、代码提取注意事项 作用域问题 : 完整提取 : 不能只提取加密函数,需要包含其所属对象 从 var 开始到最后一个 } 是一个完整单元 环境依赖 : 注意 navigator 、 window 等浏览器对象 可能需要补充依赖如 ASN1 等 五、测试脚本开发 1. 加密脚本 DES/AES/RSA批量加密脚本 需要预先提取目标网站的key和加密参数 2. SQL注入辅助脚本 AES/DES配合sqlmap的SQL注入脚本 示例项目:https://github.com/Small-ears/DES-AES_ SQL_ Scripts 六、常见问题解决 环境报错 : ASN1 is not defined :从加密库源码中补充相关定义 浏览器环境对象缺失:补充 navigator 、 window 等 密文不一致 : 检查加密模式(ECB/CBC)和填充方式 RSA加密同一字符串每次结果不同是正常现象 代码提取不全 : 确保提取完整的函数作用域 注意闭包和自执行函数 七、实战建议 优先使用XHR断点法定位加密点 对于非XHR请求,使用DOM事件断点或关键字搜索 提取代码时注意环境依赖和作用域 测试时先验证单个加密结果是否匹配 开发自动化脚本时考虑参数化和批量处理 通过以上方法,可以有效地分析和处理前端JS加密,为渗透测试提供必要的技术支持。