1. 信息打点中的JS架构分析实战
在Web安全渗透测试中,前端JavaScript代码往往蕴含着大量关键信息。与传统的目录扫描不同,现代Web应用大量依赖前端框架和API接口,这使得JS代码分析成为信息收集的重要突破口。
我曾在一次企业级渗透测试中发现,目标网站的主JavaScript文件(app.bundle.js)中硬编码了三个测试环境的API端点,其中包括完整的Swagger文档路径。这种信息泄漏直接导致我们获取了未授权访问的后台管理接口。
1.1 基础JS文件收集技巧
使用Chrome开发者工具时,建议开启"Disable cache"选项并切换到Network面板的JS筛选器。以下是几个关键操作命令:
# 使用curl获取JS文件并格式化输出 curl -s https://target.com/static/js/main.js | js-beautify > analyzed.js # 使用wget递归下载JS文件 wget -r -l 1 -A.js https://target.com/static/对于混淆过的代码,Chrome的Pretty Print功能(Sources面板底部的{}按钮)可以初步还原代码结构。对于Webpack打包的应用,可以使用webpack-unpack等工具逆向分析模块结构。
1.2 主流框架特征识别
React应用的典型特征包括__REACT_DEVTOOLS_GLOBAL_HOOK__全局变量和ReactDOM.render调用。Vue则可以通过__VUE__或new Vue()初始化语句识别。Angular应用通常包含ng-前缀的HTML属性。
我曾遇到一个刻意隐藏框架类型的SPA应用,通过以下方法最终确认其使用Next.js:
- 检查
_next/static目录存在性 - 搜索
__NEXT_DATA__全局对象 - 分析路由处理中的
getStaticProps模式
2. 自动化框架识别与API提取
2.1 工具化识别流程
Wappalyzer虽然能识别常见框架,但对于自定义架构或低版本框架经常误判。更可靠的方法是组合使用多种工具:
# 使用WhatWaf检测防护体系 whatwaf -u https://target.com # 结合BuiltWith进行技术验证 builtwith --user-agent="Mozilla/5.0" https://target.com在实战中发现,约43%的Web应用会在JS注释中泄漏框架版本信息。建议使用正则表达式深度扫描:/(?:vue|react|angular)\s*[v]?[\s:]*[0-9.]+/i
2.2 API端点提取方法论
现代Web应用通常采用两种API暴露方式:
- 硬编码在JS文件中的完整URL(高风险)
- 通过环境变量动态配置(需进一步挖掘)
使用jsubfinder提取API端点的典型命令:
python3 jsubfinder.py -u https://target.com -d -o results.json进阶技巧包括:
- 监控XHR请求获取动态生成的端点
- 分析GraphQL的
/graphql或/query接口 - 捕获WebSocket连接初始化时的握手信息
3. FUZZ爬虫的工程化实践
3.1 智能爬虫构建要点
传统爬虫对JavaScript渲染的SPA效果有限,建议采用Puppeteer等无头浏览器方案:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://target.com', {waitUntil: 'networkidle2'}); // 提取所有AJAX请求 const requests = await page.evaluate(() => window.performance.getEntries() .filter(e => e.initiatorType === 'xmlhttprequest') .map(e => e.name) ); console.log(requests); await browser.close(); })();3.2 上下文感知的FUZZ策略
基于统计学的有效FUZZ需要:
- 建立基准请求模型(200状态码占比、响应时间分布)
- 设计增量式参数变异(先单参数后多参数组合)
- 实现异常检测机制(基于响应长度/时间/内容的突变)
一个典型的递归式FUZZ示例:
def recursive_fuzz(base_url, params, depth=3): if depth == 0: return for param in params: mutated = mutate_param(param) response = requests.get(base_url, params=mutated) analyze_response(response) recursive_fuzz(base_url, remove_param(params, param), depth-1)4. 敏感信息泄漏的深度挖掘
4.1 源码仓库特征识别
Git泄漏不仅限于.git目录暴露,还包括:
- GitHub的
/repos接口响应 - GitLab的
/-/graphql端点 - Bitbucket的
/rest/api结构
使用GitHound进行深度扫描:
git-hound --subdomain-file targets.txt --threads 204.2 云服务凭证的提取模式
AWS凭证的常见出现位置:
- JS配置文件中的
accessKeyId - 前端加密函数的初始化向量
- 开发者注释中的临时测试凭证
使用TruffleHog进行熵值检测:
trufflehog filesystem --directory=./downloaded_js在最近一次审计中,我们通过分析前端地图组件的初始化代码,发现其硬编码的Google Maps API密钥具有过高的权限,导致可以利用该密钥进行地理编码服务的滥用。
5. 防御视角的加固建议
作为渗透测试人员,我们应当同时具备防御思维。以下是给开发团队的安全建议:
- 前端代码混淆:
// 使用terser进行高级混淆 module.exports = { mangle: { reserved: ['$super'], // 保留关键变量 toplevel: true }, compress: { drop_console: true // 移除调试语句 } }- API端点动态化:
// 替代硬编码URL const API_BASE = process.env.API_BASE || window.API_BASE;- 实施严格的CORS策略:
location /api { if ($http_origin !~* "^https://(www\.)?example\.com$") { return 403; } add_header 'Access-Control-Allow-Origin' "$http_origin"; }在持续集成环节引入安全检测:
# GitLab CI示例 security_scan: stage: test script: - npm run secrets-scan - npm run dependency-check rules: - if: $CI_COMMIT_BRANCH == "main"