Bootstrap

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、存储层本身的账号安全控制,例如统一引入加密机制。