Springboot actuator 不可不注意的安全问题 - 可越权 - 可脱库
1. 通过 httptrace 越权
httptrace 是该应用每一次被 http 访问的记录,包含每次 request 的 cookie、请求参数、等。设想一下如果拿到用户请求的 cookie,那么就可以登录该用户的账户进行任意操作。
第一步,创建 springboot 项目、pom 引入 actuator
第二步,在 application.properties 中增加暴露所有端点配置,默认只暴露(/health)
management.endpoints.web.exposure.include=*
第三步,注入 HttpTraceRepository Bean,httptrace 的存储方式
看一下结果,暴露的有哪些端点,访问(http://127.0.0.1:9999/actuator/)
访问 httptrace 看一下有哪些信息http://127.0.0.1:9999/actuator/httptrace
如果这个 cookie 是用户登录态 cookie,那么就可以模拟该用户做任意操作了。
2. 通过 heapdump 获取数据库密码,完成脱库
第一步,通过访问http://127.0.0.1:9999/actuator/env 查看应用配置信息
Json format 一下,搜索 datasource,可以看到数据库账号、链接字符串,密码被隐藏掉了。所有和密码相关的 actuator 都会在输出的时候替换成***。
第二步,通过配置文件不能看到密码,那就只能通过堆来看看能不能找到,因为我们所有的 java 对象都存在于堆上,这里可以看出来使用的使用阿里巴巴的的 Druid 连接池,所以数据库配置相关也应该在这个 class 的实例上。
通过http://127.0.0.1:9999/actuator/heapdump 会执行 dump 并下载,然后我们通过 Jhat 来分析该 dump 文件
访问http://127.0.0.1:7000/ 查看 heapdump 分析
在页面 control+f 搜索 datasource DataSourceInitializationMode
点进去经过 2 层就能找到 heap 中数据库的账号和密码以及 url
到这里,我们就能成功拿到链接数据库的所有信息了。当然规范一点的公司用于程序链接的账号 密码 host 是隔离的,也就是说就算拿到对的账号和密码,host 是机房内才能访问,那么你依然无法链接数据库。如果用的是公网链接那么就发生严重的安全事故了。
数据安全是企业的根本,安全事故往往就发生在这些细节上,安全无小事,研发需谨慎。
上面的安全问题有很多种解决办法 1、通过应用本身的配置,只开放基础的端点,例如健康检查,服务中心会用来检测心跳。
2、通过引入 auth,访问敏感端点授权。
3、通过软负载限制,如有使用例如 nginx 来做软负载,那么可以在 nginx 设置访问规则,访问敏感的端点,直接拒绝。
4、存储层本身的账号安全控制,例如统一引入加密机制。
评论