利用js挖掘漏洞
字数 1151 2025-08-18 11:37:49
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. 异步加载实战案例
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. 逆向分析流程
- 抓包分析加密参数
- 定位加密代码位置
- 下断点调试或关键字搜索
- 分析加密算法逻辑
- 将算法转化为Python脚本
- 测试解密功能
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. 使用步骤
- 下载项目:https://github.com/jxhczhl/JsRpc
- 本地运行服务端
- 注入JS环境
// 注入环境后连接通信
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz");
- 注册加密函数
// 固定的RSA密钥
var rsa = "MIxxxxxxxxDAQAB";
//注册行为
demo.regAction("key", function(resolve, param) {
var user = param["param"];
var res = getKeyParams(user, rsa);
resolve(res);
});
- 远程调用
http://127.0.0.1:12080/go?group=zzz&action=key¶m=123456
3. 优势
- 无需完整还原加密算法
- 直接调用浏览器中的加密函数
- 适用于复杂加密场景
总结
JavaScript漏洞挖掘是Web安全测试中的重要环节,通过本文介绍的技术方法,可以有效地发现各种安全问题。从简单的信息泄露到复杂的加密逆向,再到便捷的JSRPC技术,安全研究人员可以根据实际情况选择合适的方法进行测试。