JS 逆向在渗透测试中的 1-4 级实战应用:从信息收集到算法破解
字数 1332 2025-08-29 08:30:06
JS逆向在渗透测试中的实战应用教学文档
一、JS逆向技术分级概述
JS逆向技术可分为5个级别,本文涵盖1-4级:
- 1级:JS文件定位与基础分析
- 2级:基础混淆与字符串解密
- 3级:动态调试与反反爬对抗
- 4级:加密算法逆向与复现
- 5级:自动化攻击链构建(将在后续文章中介绍)
二、1级:JS文件定位与基础分析
2.1 关键JS文件挖掘技巧
流量监控与抓包
- 使用Burp Suite的Proxy模块拦截HTTP请求
- 通过XHR/fetch过滤定位动态加载的JS文件
- 示例Burp Repeater请求:
GET /static/js/encrypt.js HTTP/1.1 Host: target.com
URL路径特征分析
常见敏感路径模式:
/api/signature.js- 签名逻辑/utils/crypto.js- 加密工具/auth/verify.js- 认证验证
电商平台登录加密分析案例
- 在Network面板中发现
login.js加载后,password参数由明文变为哈希值 - 原始请求:
POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=admin&password=123 - 加密后请求:
POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=admin&password=21232f297a57a5a743894a0e4a801fc3
2.2 敏感信息提取技术
字符串搜索工具链
- 使用grep提取JS中的Base64字符串:
grep -oP '(?<=btoa\()["'']([^"''\n]+)["'']' main.js | base64 -d
正则表达式实战
匹配可能的加密函数:
import re
pattern = re.compile(r'(aesEncrypt|rsaSign|md5Hash)\s*\(')
with open('main.js', 'r') as f:
matches = pattern.findall(f.read())
print(matches) # 输出所有加密函数名
三、2级:基础混淆与字符串解密
3.1 自动化去混淆工具链
de4js高级用法
de4js -r -m -o clean/ obfuscated/ # 递归处理多层混淆并生成可读性代码
手动修复技巧
处理eval包裹的Base64字符串:
// 混淆代码
eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%22%68%74%74%70%73%3a%2f%2f%65%78%61%6d%70%6c%65%2e%63%6f%6d%22'));
// 修复后
document.location = "https://example.com";
3.2 字符串加密破解实战
多层嵌套解密脚本
import base64
import urllib.parse
encrypted = "JUUyJTg1JThGJUUzJTlDJThGJUU0JUJEJTlG"
decoded = base64.b64decode(encrypted).decode('utf-8')
decoded = urllib.parse.unquote(decoded)
print(decoded) # 输出原始字符串
CMS后台XSS漏洞利用案例
破解eval(unescape(...))包裹的恶意脚本:
// 混淆代码
eval(unescape('%77%69%6e%64%6f%77%2e%61%6c%65%72%74%28%27%58%53%53%27%29'));
// 修复后
window.alert('XSS');
四、3级:动态调试与反反爬对抗
4.1 调试器绕过技术
反调试检测绕过
// 禁用debugger语句
(function () {
var oldDebugger = window.debugger;
window.debugger = function () {
// 空实现
};
})();
// 绕过setInterval检测
var oldSetInterval = window.setInterval;
window.setInterval = function (fn, delay) {
return oldSetInterval(fn, delay + 1000);
};
内存数据抽取工具
使用Chrome DevTools的Memory面板查找aesKey变量:
- 录制内存快照
- 搜索关键词
- 右键"Reveal in Sources"
4.2 动态加载JS分析
WebSocket监听实战
// 在控制台注入代码监听WebSocket消息
var oldWebSocket = WebSocket;
WebSocket = function (url) {
this.ws = new oldWebSocket(url);
this.ws.onmessage = function (e) {
console.log('WebSocket Message:', e.data);
};
};
金融平台风控逻辑逆向案例
通过Hook window.WebSocket方法捕获动态加载的风控JS文件:
var originalOpen = WebSocket.prototype.open;
WebSocket.prototype.open = function (url) {
if (url.includes('risk.js')) {
console.log('发现风控JS:', url);
}
originalOpen.apply(this, arguments);
};
五、4级:加密算法逆向与复现
5.1 对称加密逆向实战
AES-CBC模式破解
通过console.log注入获取密钥和IV:
console.log('aesKey:', window.aesKey);
console.log('iv:', window.iv);
Python复现解密逻辑
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
5.2 非对称加密破解案例
RSA公私钥提取
在JS文件中搜索setPublicKey和setPrivateKey:
var publicKey = '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...';
var privateKey = '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSj...';
Python模拟加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
key = RSA.importKey(publicKey)
cipher = PKCS1_v1_5.new(key)
encrypted = cipher.encrypt(b'password')
六、实战案例:从抓包到漏洞利用
6.1 漏洞挖掘流程
- 抓包分析:发现某SaaS平台API请求含sign参数
GET /api/data?token=abc123&sign=456 HTTP/1.1 - JS逆向:定位到sign由
md5(token+timestamp+secret)生成 - 密钥泄露:通过内存快照获取
window.secret = 'secure_key' - 漏洞利用:构造恶意请求访问敏感数据
6.2 自动化脚本开发
import requests
import hashlib
import time
def generate_sign(token, secret):
timestamp = str(int(time.time()))
raw = f"{token}{timestamp}{secret}"
return hashlib.md5(raw.encode()).hexdigest()
# 构造恶意请求
token = 'admin_token'
secret = 'secure_key'
sign = generate_sign(token, secret)
url = f"https://target.com/api/data?token={token}&sign={sign}"
response = requests.get(url)
print(response.json()) # 输出敏感数据
七、学习资源推荐
- 工具:
- JSDOS (JS沙箱环境)
- 社区:
- Reddit r/javascriptreverse
- 练习平台:
- JSFuck (混淆代码挑战)
- 测试环境:
docker run -p 80:80 vulnerables/web-dvwa
八、总结
通过本文的技术解析和实战案例,可以掌握从基础信息收集到复杂加密算法逆向的全流程,为渗透测试和SRC漏洞挖掘提供关键技术支撑。建议在实际操作中结合Docker搭建测试环境,逐步提升逆向能力。