前言
相信很多朋友在服務(wù)器安全掃描的時(shí)候,遇到過Druid未授權(quán)訪問低風(fēng)險(xiǎn)漏洞提示。本文先對(duì)Druid未授權(quán)訪問漏洞進(jìn)行介紹和分析,最后給出兩種解決辦法,供大家參考。
一、Druid未授權(quán)訪問原因分析
漏洞說明:Druid由阿里巴巴數(shù)據(jù)庫出品,為監(jiān)控而生的數(shù)據(jù)庫連接池,并且Druid可以提供監(jiān)控,監(jiān)控SQL的執(zhí)行時(shí)間、監(jiān)控Web URI的請(qǐng)求、Session監(jiān)控等功能,使用廣泛。
需要明確: Druid本身是不存在漏洞的,Druid未授權(quán)訪問是因?yàn)殚_發(fā)者配置的不夠全面,導(dǎo)致攻擊者輸入ip/druid/index.html即可直接即可登錄到Druid監(jiān)控界面,這就是所謂未授權(quán),即可訪問。
具體示例如圖所示:
二、解決辦法
1.添加登錄用戶名密碼
未授權(quán)訪問的常見原因:
(1)攻擊者可以不輸入賬號(hào)密碼即可訪問管理頁面
(2)或者是攻擊者輸入常見賬號(hào)密碼,比如賬號(hào):root,密碼:123456等這種保密性很低的賬號(hào)密碼,即可訪問管理頁面。
以上這兩種情況,都可以通過添加復(fù)雜的登錄賬號(hào)密碼來解決。只要賬號(hào)密碼沒有被掌握,可以很大程度避免未授權(quán)訪問問題。
優(yōu)點(diǎn):
(1)可以繼續(xù)使用Druid監(jiān)控管理功能
(2)對(duì)用戶使用習(xí)慣影響較小
缺點(diǎn):
(1)為了盡可能降低風(fēng)險(xiǎn),賬號(hào)密碼需要不定期更換,密碼難度等級(jí)需要設(shè)定較高
(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.8.9.115"); //ip白名單(沒有配置或者為空,則允許所有訪問)
initParameters.put("loginUsername", "admin"); //++監(jiān)控頁面登錄用戶名
initParameters.put("loginPassword", "123.admin"); //++監(jiān)控頁面登錄用戶密碼
initParameters.put("deny", ""); //ip黑名單
//如果某個(gè)ip同時(shí)存在,deny優(yōu)先于allow
servletRegistrationBean.setInitParameters(initParameters);
return servletRegistrationBean;
}
(2)也可以在web.xml中配置
<!-- 配置 Druid 監(jiān)控信息顯示頁面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允許清空統(tǒng)計(jì)數(shù)據(jù) -->
<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監(jiān)控頁功能
為了徹底避免未授權(quán)訪問風(fēng)險(xiǎn),如果不需要使用或者很少使用Druid的監(jiān)控功能,可以嘗試徹底禁用Druid監(jiān)控頁,這種做法比較簡單粗暴,有利有弊。
優(yōu)點(diǎn):
(1)徹底避免未授權(quán)訪問風(fēng)險(xiǎn)
(2)配置起來比較更加簡單,禁用后無需再關(guān)心密碼被破解問題
缺點(diǎn):
(1)徹底禁用后,自己也無法使用Druid監(jiān)控頁功能
(2)可能影響使用習(xí)慣,可能影響工作的開展,降低Druid管理的便利性
在application.properties配置文件中添加一行代碼即可:
#是否啟用StatViewServlet(監(jiān)控頁面),默認(rèn)true-啟動(dòng),false-不啟動(dòng)
spring.datasource.druid.stat-view-servlet.enabled=false
總結(jié)
本文對(duì)Druid未授權(quán)訪問漏洞進(jìn)行了介紹和分析,并給出了兩種常見的解決辦法,可以按照自己的需求來選擇解決辦法。
個(gè)人建議: 如果用不到Druid監(jiān)控頁管理功能可以考慮徹底關(guān)掉,這樣后期比較省心。希望對(duì)大家有用!