Druid未授权访问原因分析
漏洞说明:Druid由阿里巴巴数据库出品,为监控而生的数据库连接池,并且Druid可以提供监控,监控SQL的执行时间、监控Web URI的请求、Session监控等功能,使用广泛。
需要明确: Druid本身是不存在漏洞的,Druid未授权访问是因为开发者配置的不够全面,导致攻击者输入ip/druid/index.html即可直接即可登录到Druid监控界面,这就是所谓未授权,即可访问。
具体示例如图所示:
解决办法
1.添加登录用户名密码
未授权访问的常见原因:
(1)攻击者可以不输入账号密码即可访问管理页面
(2)或者是攻击者输入常见账号密码,比如账号:root,密码:123456等这种保密性很低的账号密码,即可访问管理页面。
以上这两种情况,都可以通过添加复杂的登录账号密码来解决。只要账号密码没有被掌握,可以很大程度避免未授权访问问题。
优点:
(1)可以继续使用Druid监控管理功能
(2)对用户使用习惯影响较小
缺点:
(1)为了尽可能降低风险,账号密码需要不定期更换,密码难度等级需要设定较高
(2)理论上来说仍然存在被攻击的可能性
具体解决方法(二选一):
(1)可以在druidConfig中配置:
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
Map<String, String> initParameters = new HashMap<>();
initParameters.put("resetEnable", "false"); //禁用HTML页面上的“Rest All”功能
initParameters.put("allow", "10.10.119.115"); //ip白名单(没有配置或者为空,则允许所有访问)
initParameters.put("loginUsername", "admin"); //++监控页面登录用户名
initParameters.put("loginPassword", "admin"); //++监控页面登录用户密码
initParameters.put("deny", ""); //ip黑名单
//如果某个ip同时存在,deny优先于allow
servletRegistrationBean.setInitParameters(initParameters);
return servletRegistrationBean;
}
也可以在web.xml中配置
<!-- 配置 Druid 监控信息显示页面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
2.禁用Druid监控页功能
为了彻底避免未授权访问风险,如果不需要使用或者很少使用Druid的监控功能,可以尝试彻底禁用Druid监控页,这种做法比较简单粗暴,有利有弊。
优点:
(1)彻底避免未授权访问风险
(2)配置起来比较更加简单,禁用后无需再关心密码被破解问题
缺点:
(1)彻底禁用后,自己也无法使用Druid监控页功能
(2)可能影响使用习惯,可能影响工作的开展,降低Druid管理的便利性
在application.properties配置文件中添加一行代码即可:
#是否启用StatViewServlet(监控页面),true-启动,默认false-不启动,对于某些低版本druid-spring-boot-starter.jar默认是true
spring.datasource.druid.stat-view-servlet.enabled=false
是否启用StatViewServlet(监控页面),true-启动,默认false-不启动,对于某些低版本druid-spring-boot-starter.jar默认是true
例如:1.1.2版本
1.1.22版本
参考其他:
【漏洞预警】druid未授权访问漏洞
漏洞级别:高危
漏洞类型:逻辑漏洞
漏洞讲解:druid没有设置授权访问,通过/druid/index.html进入到druid监控页面后打开sessin监控,里面是监控的所有sessin,只要配置url监控里面的地址,判断session是否失效,拿到没有失效的sessin,通过浏览器cookie替换器,替换sessin,即可登录后台
1.检查 POM 清单中是否引用 Druid 组件:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.24</version>
</dependency>
2.检查application配置文件中是否开启Druid监控:
spring:
datasource:
druid:
stat-view-servlet:
# 是否启用StatViewServlet(监控页面),true-启动,默认false-不启动
enabled: true
或
spring.datasource.druid.stat-view-servlet.enabled=true
修复方法:
方式一:关闭druid监控
【springboot application.yml配置】
spring:
datasource:
druid:
stat-view-servlet:
# 是否启用StatViewServlet(监控页面),默认true-启动,false-不启动
enabled: false
【application.properties配置】
#是否启用StatViewServlet(监控页面),默认true-启动,false-不启动
spring.datasource.druid.stat-view-servlet.enabled=false
方式二:配置内网白名单与账号密码
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=自定义用户名
spring.datasource.druid.stat-view-servlet.login-password=强口令
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1 #禁止暴露公网
spring:
datasource:
druid:
stat-view-servlet:
# 是否启用StatViewServlet(监控页面),默认true-启动,false-不启动
enabled: false
login-username: 自定义用户名
login-password: 强口令
allow: 127.0.0.1 #禁止暴露公网