利用js挖掘漏洞
字数 1151 2025-08-18 11:37:49

JavaScript漏洞挖掘技术详解

前言

在Web应用安全测试中,JavaScript(JS)代码分析是发现安全漏洞的重要途径。通过对JS代码的深入挖掘,可以发现敏感信息泄露、接口暴露、加密算法缺陷等多种安全问题。本文将系统介绍利用JS进行漏洞挖掘的各种技术方法。

一、JS中的敏感信息泄露

1. 默认用户名密码

  • 开发人员有时会在JS代码中硬编码默认凭证
  • 搜索关键词:adminpassworddefaulttest

2. 硬编码密码和密钥

  • API密钥、数据库密码、加密密钥等敏感信息
  • 搜索关键词:keysecrettokenpassword
  • 特别注意base64编码的字符串

二、JS中的指纹信息

  • 框架信息:Vue、React、Angular等
  • 开发商信息:公司名称、开发者信息
  • 版本信息:软件版本号
  • 这些信息有助于识别已知漏洞

三、JS中的接口泄露

1. 敏感接口发现

  • JS中常包含大量未在前端显示的API接口
  • 搜索关键词:api/v1//rest//graphql
  • 使用正则表达式匹配URL模式

2. 接口测试方法

  • 收集所有发现的接口
  • 测试未授权访问、越权等漏洞
  • 结合Burp Suite等工具进行批量测试

四、JS异步加载技术

1. 异步加载概念

  • 同步加载:使用<script>标签直接嵌入,阻塞页面解析
  • 异步加载:使用asyncdefer属性,不阻塞页面

2. 异步加载实战案例

var arr = [
    "https://xxx.xxx.com/xxxxxxx/xxxx/0.1.0/js/xxxxxxx.js",
    "https://xxx.xxx.com/xxxxxxx/xxxx/0.1.0/js/xxxxxxx.js"
];

for(var i=0; i<arr.length; i++){
    var script = document.createElement('script');
    script.src = arr[i];
    document.getElementsByTagName('head')[0].appendChild(script);
}
  • 在控制台执行可加载所有JS文件
  • 发现隐藏接口后,进一步分析调用逻辑

五、JS逆向破解加密

1. 逆向分析流程

  1. 抓包分析加密参数
  2. 定位加密代码位置
  3. 下断点调试或关键字搜索
  4. 分析加密算法逻辑
  5. 将算法转化为Python脚本
  6. 测试解密功能

2. 案例分析:某网站加密逆向

加密参数分析

  • nonce: 随机字符串防重放攻击
  • skey: 加密或身份验证密钥
  • sign: 请求签名

关键加密函数分析

getKeyParams: function(t, e) {
    var n = {
        timestamp: "",
        nonce: "",
        skey: "",
        body: "",
        sign: "",
        aesSecretKey: ""
    };
    ut = e;
    n.timestamp = (new Date).getTime();
    n.nonce = this.getNonce(32);
    n.skey = this.getAesSecretKey();
    n.aesSecretKey = rt;
    n.body = this.encryptByAES(r()(t), rt, "12xxxxxxxxxxxef").encryptContent;
    var i = this.encryptByMD5(n.timestamp + n.nonce + n.skey + n.body);
    return n.sign = this.encryptByRSA(i, ut), n;
}

Python还原加密算法

import base64
import hashlib
import random
import time
from Crypto.Cipher import AES, PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import pad, unpad

rsa_public_key = '''
-----BEGIN PUBLIC KEY-----
MxxxxxxxxxMBUD
-----END PUBLIC KEY-----
'''.strip()

class EncryptHandler:
    def __init__(self, rsa_public_key):
        self.aes_key = self.get_nonce(16)
        self.iv = '12xxxxxxxxxef'.encode('utf-8')
        self.rsa_public_key = rsa_public_key

    @staticmethod
    def get_nonce(length):
        characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        return ''.join(random.choice(characters) for _ in range(length))

    def aes_encrypt(self, data):
        cipher = AES.new(self.aes_key.encode('utf-8'), AES.MODE_CBC, self.iv)
        encrypted = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
        return base64.b64encode(encrypted).decode('utf-8')

    def md5_sign(self, data):
        return hashlib.md5(data.encode('utf-8')).hexdigest().upper()

    def rsa_encrypt(self, data):
        key = RSA.import_key(self.rsa_public_key)
        cipher = PKCS1_v1_5.new(key)
        encrypted_data = cipher.encrypt(data.encode('utf-8'))
        return base64.b64encode(encrypted_data).decode('utf-8')

    def prepare_request(self, body):
        timestamp = str(int(time.time() * 1000))
        nonce = self.get_nonce(32)
        aes_encrypted_body = self.aes_encrypt(body)
        skey = self.rsa_encrypt(self.aes_key)
        sign_str = timestamp + nonce + skey + aes_encrypted_body
        md5_signature = self.md5_sign(sign_str)
        rsa_signature = self.rsa_encrypt(md5_signature)
        request_data = {
            "timestamp": timestamp,
            "nonce": nonce,
            "skey": skey,
            "body": aes_encrypted_body,
            "sign": rsa_signature
        }
        return request_data

六、JSRPC技术应用

1. JSRPC原理

  • 在浏览器控制台注入JSRPC环境
  • 通过WebSocket与本地服务端连接
  • 远程调用浏览器中的加密函数

2. 使用步骤

  1. 下载项目:https://github.com/jxhczhl/JsRpc
  2. 本地运行服务端
  3. 注入JS环境
// 注入环境后连接通信
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz");
  1. 注册加密函数
// 固定的RSA密钥
var rsa = "MIxxxxxxxxDAQAB";

//注册行为
demo.regAction("key", function(resolve, param) {
    var user = param["param"];
    var res = getKeyParams(user, rsa);
    resolve(res);
});
  1. 远程调用
http://127.0.0.1:12080/go?group=zzz&action=key&param=123456

3. 优势

  • 无需完整还原加密算法
  • 直接调用浏览器中的加密函数
  • 适用于复杂加密场景

总结

JavaScript漏洞挖掘是Web安全测试中的重要环节,通过本文介绍的技术方法,可以有效地发现各种安全问题。从简单的信息泄露到复杂的加密逆向,再到便捷的JSRPC技术,安全研究人员可以根据实际情况选择合适的方法进行测试。

JavaScript漏洞挖掘技术详解 前言 在Web应用安全测试中,JavaScript(JS)代码分析是发现安全漏洞的重要途径。通过对JS代码的深入挖掘,可以发现敏感信息泄露、接口暴露、加密算法缺陷等多种安全问题。本文将系统介绍利用JS进行漏洞挖掘的各种技术方法。 一、JS中的敏感信息泄露 1. 默认用户名密码 开发人员有时会在JS代码中硬编码默认凭证 搜索关键词: admin 、 password 、 default 、 test 等 2. 硬编码密码和密钥 API密钥、数据库密码、加密密钥等敏感信息 搜索关键词: key 、 secret 、 token 、 password 等 特别注意base64编码的字符串 二、JS中的指纹信息 框架信息:Vue、React、Angular等 开发商信息:公司名称、开发者信息 版本信息:软件版本号 这些信息有助于识别已知漏洞 三、JS中的接口泄露 1. 敏感接口发现 JS中常包含大量未在前端显示的API接口 搜索关键词: api 、 /v1/ 、 /rest/ 、 /graphql 等 使用正则表达式匹配URL模式 2. 接口测试方法 收集所有发现的接口 测试未授权访问、越权等漏洞 结合Burp Suite等工具进行批量测试 四、JS异步加载技术 1. 异步加载概念 同步加载:使用 <script> 标签直接嵌入,阻塞页面解析 异步加载:使用 async 或 defer 属性,不阻塞页面 2. 异步加载实战案例 在控制台执行可加载所有JS文件 发现隐藏接口后,进一步分析调用逻辑 五、JS逆向破解加密 1. 逆向分析流程 抓包分析加密参数 定位加密代码位置 下断点调试或关键字搜索 分析加密算法逻辑 将算法转化为Python脚本 测试解密功能 2. 案例分析:某网站加密逆向 加密参数分析 nonce : 随机字符串防重放攻击 skey : 加密或身份验证密钥 sign : 请求签名 关键加密函数分析 Python还原加密算法 六、JSRPC技术应用 1. JSRPC原理 在浏览器控制台注入JSRPC环境 通过WebSocket与本地服务端连接 远程调用浏览器中的加密函数 2. 使用步骤 下载项目:https://github.com/jxhczhl/JsRpc 本地运行服务端 注入JS环境 注册加密函数 远程调用 3. 优势 无需完整还原加密算法 直接调用浏览器中的加密函数 适用于复杂加密场景 总结 JavaScript漏洞挖掘是Web安全测试中的重要环节,通过本文介绍的技术方法,可以有效地发现各种安全问题。从简单的信息泄露到复杂的加密逆向,再到便捷的JSRPC技术,安全研究人员可以根据实际情况选择合适的方法进行测试。