Springboot actuator不可不注意的安全问题-可越权-可脱库
1. 通过httptrace 越权
httptrace是该应用每一次被http访问的记录,包含每次request的cookie、请求参数、等。设想一下如果拿到用户请求的cookie,那么就可以登录该用户的账户进行任意操作。
第一步,创建springboot 项目、pom引入actuator
org.springframework.boot
spring-boot-starter-actuator
第二步,在application.properties 中增加暴露所有端点配置,默认只暴露(/health)
第三步,注入HttpTraceRepository Bean,httptrace的存储方式
@Configuration
public class APPConfig {
@Bean
@ConditionalOnMissingBean(HttpTraceRepository.class)
public HttpTraceRepository traceRepository(){
return new InMemoryHttpTraceRepository();
}
}
看一下结果,暴露的有哪些端点,访问(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、存储层本身的账号安全控制,例如统一引入加密机制。