无需修改源码,处理spring boot未授权访问及Swagger漏洞处理
漏洞说明
spring boot未授权访问
风险程度:【高危】
漏洞概述:
未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷,导致其他用户可以直接访问,从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。登陆验证一般的方式都是将用户在登录口输入的账号密码拿去与数据库中的记录做验证,并且要求输入的账号密码要等于数据库中某条记录的账号密码,验证通过则程序就会给用户一个session,然后进入后台,否则就返回到登陆口。然而攻击者可以找到一些缺乏权限验证的URL,直接绕过登录执行数据库查询,构成未授权访问。
漏洞危害:
攻击者可绕过登录验证非法访问资源,如后台功能、敏感文件等。
整改建议:
建议增加漏洞页面(接口)的访问认证,防止未授权访问直接浏览访问或调用。
涉及的请求地址包括但不限于:
- [http://ip:port/env/]
- http://ip:port/mappings
- http://ip:port/dump/
Swagger接口文档泄露
风险程度:【高危】
漏洞概述:
Swagger生成的[API文档],是直接暴露在相关web路径下的。所有人均可以访问查看。通过这一点即可获取项目上所有的接口信息。那么结合实际业务,例如如果有文件读取相关的接口,可能存在任意文件下载,相关的业务访问可能存在未授权访问等。
漏洞危害:
业务敏感信息泄露后可能会对用户带来危害,系统敏感信息泄露可能会协助攻击者提供更多的攻击途径和方法。
整改建议:
结合SpringSecurity/shiro进行认证授权,将Swagger-UI的URL加入到各自的认证和授权过滤链中,当用户访问Swagger对应的资源时,只有通过认证授权的用户才能进行访问。
涉及的请求地址包括但不限于:
- [http://ip:port/swagger-ui.html#/cag45controller]
- http://ip:port/v2/api-docs
漏洞处理
spring boot未授权访问
官方给的整改建议,涉及修改代码,不方便实施。若涉及到的请求地址非必须,则可以通过修改配置文件进行处理:
# 若原来的配置如下,则表明访问时不需要认证,可直接访问,此时删除此配置即可。
management.security.enabled=false
上述方案亲测有效。
从网上查找,有如下方案(此方案未亲测),增加配置:
management.endpoints.web.exposure.exclude=env,heapdump,threaddump,mappings
或者是(未亲测),增加配置:
# 完全禁用actuator
management.server.port=-1
Swagger接口文档泄露
官方给的建议或网上其他帖子给的方案,都涉及修改代码,在生产环境下,一旦涉及代码修改,动作过大,又要重新测试、发布,太麻烦。
我采用的方案是通过nginx配置,过滤掉漏洞涉及的url,禁止方案,nginx中增加如下配置,亲测有效:
server {
listen 8081;
server_name 127.0.0.1;
if ($request_uri ~* "/swagger-ui") {
return 403;
}
if ($request_uri ~* "/api-docs") {
return 403;
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
注意,上述server_name,要换成自己系统的域名或服务器ip地址;listen和location重定向的ip、端口信息,要结合自己的实际情况修改。