2023年10月,高危Swagger UI 的漏洞一个XSS漏洞(CVE-2023-45851)在GitHub上被公开。攻击者只需构造一个包含恶意脚本的高危URL,就能在受害者打开Swagger页面时窃取Cookie、漏洞伪造请求。高危这不是漏洞Swagger第一次出事,也绝不会是高危最后一次。
Swagger(现在叫OpenAPI Specification)本质上是漏洞一套API描述规范。它让开发者用YAML或JSON写清楚每个接口的高危参数、返回值、漏洞认证方式,高危然后自动生成交互式文档。漏洞方便是高危真方便,但问题也出在这里——它把API的漏洞全部结构暴露在了一个Web页面上。
默认配置就是高危灾难
我见过太多项目,Swagger UI直接挂在生产环境的
/swagger-ui.html或/swagger/index.html路径下,没有任何访问控制。打开浏览器,所有接口一目了然:用户登录、订单查询、数据库管理、文件上传……甚至连内部调试接口都在上面。更糟的是,很多框架的Swagger集成默认开启。Springfox在Spring Boot项目里加个依赖就自动生效,FastAPI自带
/docs和/redoc两个端点。开发者图省事,上线时忘了关,或者根本不知道需要关。2021年,某电商平台就因为这个栽了跟头。安全研究员通过公开的Swagger页面发现了
/api/v1/admin/exportAllUsers这个接口,不需要任何认证就能导出全量用户数据。接口文档里连参数示例都写好了,直接复制粘贴就能用。不只是信息泄露
Swagger页面本身是静态的,但它暴露的信息足够攻击者拼出完整攻击链。比如文档里写了
/api/v1/user/{ id}返回用户详情,那试试/api/v1/user/1、/api/v1/user/2……如果没做水平权限校验,就能遍历所有用户。还有更直接的。某些Swagger UI版本允许在页面上直接发起请求,攻击者不需要写代码,点几下按钮就能调用接口。如果接口有SQL注入或命令执行漏洞,Swagger就成了现成的攻击平台。
去年我帮一个朋友看他们公司的测试环境,Swagger页面上赫然列着一个
/debug/execute接口,参数是cmd。我问他这是干嘛的,他说是开发时方便跑shell命令的,忘了删。测试环境虽然不对外,但谁能保证没有内网横向移动?怎么防
最直接的办法:生产环境别开Swagger。如果非要开,加认证。Spring Security配个
httpBasic()就能挡住大部分扫描器。或者用Nginx做IP白名单,只允许公司办公网访问。如果用的是Springfox,在
application.properties里设springfox.documentation.enabled=false。FastAPI的话,FastAPI(docs_url=None, redoc_url=None)就能关掉。别嫌麻烦,这几行配置能省掉后面一堆事。还有个容易忽略的点:Swagger的JSON描述文件(通常是
/v2/api-docs或/openapi.json)也要一起关。有人只关了UI页面,忘了这个端点,结果照样能拿到完整API结构。最后说个真实案例。某金融公司在内网部署了Swagger,觉得内网安全就没管。结果一个外包员工电脑中了木马,攻击者通过内网访问Swagger,发现了
/api/transfer接口,参数里居然有fromAccount和toAccount,而且没做CSRF防护。攻击者用脚本批量发起转账请求,半小时内转走了几十万。事后复盘,如果Swagger页面加了认证,攻击者至少得多花几倍时间。Swagger是个好工具,但好工具用错地方就是灾难。别让API文档变成攻击者的说明书。
顶: 32踩: 935






评论专区