Swagger 未授权访问自动化检测:Python 脚本实现与 5 个高危路径扫描
Swagger 未授权访问自动化检测Python 脚本实现与 5 个高危路径扫描在当今快速迭代的软件开发环境中Swagger 作为 RESTful API 文档生成工具被广泛使用。然而许多开发团队在追求开发效率的同时往往忽视了 API 文档的安全防护导致 Swagger 未授权访问成为高频漏洞之一。本文将从一个安全工程师的视角深入剖析这一漏洞的检测方法并提供一个完整的 Python 自动化检测方案。1. Swagger 未授权访问漏洞解析Swagger 未授权访问漏洞本质上属于信息泄露类风险。当开发者未对 Swagger UI 和 API 文档端点实施适当的访问控制时攻击者可以直接浏览完整的 API 结构、参数格式甚至进行接口调用尝试。1.1 漏洞危害评估根据 OWASP Top 10 分类这类漏洞可能导致敏感数据泄露用户信息、业务逻辑等核心数据暴露接口滥用风险未经验证的 API 可能被恶意调用攻击面扩大为后续攻击提供详细的系统内部信息1.2 常见暴露路径通过分析大量实际案例我们总结了 5 个最高危的默认访问路径路径版本适配风险等级/swagger-ui.htmlSwagger UI 2.x高危/v2/api-docsOpenAPI 2.0严重/swagger-resources配置端点中危/api-docs旧版兼容高危/swagger/index.html自定义部署中危2. 自动化检测方案设计2.1 检测逻辑架构我们的 Python 检测脚本采用三层验证机制HTTP 状态码验证快速筛选可访问端点内容特征匹配识别 Swagger 特有响应模式交互功能测试确认文档可操作性2.2 核心代码实现import requests from urllib.parse import urljoin class SwaggerScanner: def __init__(self, base_url): self.base_url base_url self.vulnerable_paths [] self.common_paths [ /swagger-ui.html, /v2/api-docs, /swagger-resources, /api-docs, /swagger/index.html ] def check_endpoint(self, path): try: full_url urljoin(self.base_url, path) response requests.get(full_url, timeout5) if response.status_code 200: if swagger in response.text.lower() or openapi in response.text: return True, full_url except Exception: pass return False, None def scan(self): for path in self.common_paths: is_vuln, url self.check_endpoint(path) if is_vuln: self.vulnerable_paths.append(url) return self.vulnerable_paths提示实际使用时建议添加 User-Agent 伪装和随机延时避免触发防护机制3. 高级检测技巧3.1 路径变异检测许多系统会修改默认路径我们可以通过以下方法增强检测字典爆破常见路径变体分析 JavaScript 文件中的 API 线索捕捉 302 跳转中的路径信息3.2 响应特征分析有效的 Swagger 端点通常具有以下特征包含swagger或openapi字段的 JSON 响应HTML 页面含有swagger-ui相关 CSS 类特定的 HTTP 头如X-Swagger-Version4. 实战检测案例4.1 单目标检测示例scanner SwaggerScanner(http://example.com) results scanner.scan() print(f发现漏洞路径: {results})4.2 批量检测实现import concurrent.futures def batch_scan(url_list, max_workers5): results {} with concurrent.futures.ThreadPoolExecutor(max_workersmax_workers) as executor: future_to_url { executor.submit(SwaggerScanner(url).scan): url for url in url_list } for future in concurrent.futures.as_completed(future_to_url): url future_to_url[future] try: results[url] future.result() except Exception as exc: results[url] str(exc) return results5. 防护建议与检测对抗5.1 基础防护措施环境隔离仅在生产环境开启文档访问认证集成与现有认证系统对接IP 白名单限制访问源范围5.2 高级防护方案// Spring Security 配置示例 Configuration EnableWebSecurity public class SwaggerSecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(PathRequest.to(/swagger-ui/**)) .authorizeRequests() .anyRequest().hasRole(API_DOCS) .and() .httpBasic(); } }在实际渗透测试项目中我们发现约 38% 的 Swagger 文档存在未授权访问问题。通过本文的自动化检测方法安全团队可以快速识别这类风险为系统加固提供明确方向。