一、Druid简介
Druid 是由阿里巴巴开发的一个高性能、分布式的数据库连接池(DataSource),主要用于 Java 应用程序中数据库连接的管理和优化。Druid 在功能、性能、稳定性和监控方面表现突出,是目前 Java 开发中常用的数据库连接池之一。
1)什么是数据库连接池?
数据库连接池(Database Connection Pool) 是一种用于管理和优化数据库连接的技术,它通过复用一组数据库连接,减少频繁创建和关闭数据库连接的开销,从而提升应用程序与数据库之间的性能和稳定性。
2)为什么需要数据库连接池?
在与数据库交互的过程中,建立一个新的数据库连接通常是一个开销较大的操作,主要包括以下步骤:
- 创建数据库连接对象。
- 进行网络通信,验证身份。
- 分配资源(如内存、线程)。
- 关闭连接,释放资源。
如果每次数据库操作都重新建立连接,尤其是在高并发环境下,会导致以下问题:
- 性能瓶颈:频繁建立和释放连接占用大量系统资源,影响响应速度。
- 资源浪费:每个连接都占用一定的内存、CPU、网络资源,频繁操作可能导致资源耗尽。
- 连接泄漏:如果连接未及时关闭,可能导致数据库连接耗尽,进而导致应用程序崩溃。
为了解决这些问题,数据库连接池应运而生。
3)数据库连接池的工作原理?
- 初始化连接池:应用程序启动时,连接池会创建一组数据库连接并保持它们处于空闲状态。这些连接会被缓存以供重复使用。
- 分配连接:当应用程序需要与数据库交互时,从连接池中取出一个空闲连接,而不是新建一个连接。
- 释放连接:操作完成后,应用程序不会关闭连接,而是将连接归还到连接池,供其他请求重复使用。
- 连接维护:连接池会定期检测空闲连接的状态,移除无效连接,并根据需求动态增加或减少连接数量。
数据库连接池是现代 Java 应用程序中不可或缺的组件,能够显著提升数据库访问性能、节省资源,并提高应用程序的并发能力。常见的连接池实现如 Druid、HikariCP 等,已经成为企业级开发的标配。
1.1 核心功能
数据库连接池管理
提供了灵活高效的数据库连接池管理,支持多种数据库(如 MySQL、PostgreSQL、Oracle、SQL Server 等),并能够有效管理数据库连接的生命周期。SQL 监控和统计
内置了强大的 SQL 监控功能,能够记录 SQL 执行情况、慢查询、执行时间、错误等信息,帮助开发者优化 SQL 性能。(监控SQL的执行时间、监控Web URI的请求、Session监控)
SQL 防火墙
提供了 SQL 防火墙功能,可以防止 SQL 注入攻击和不安全的 SQL 操作,确保数据库的安全性。高效的性能
Druid 对连接池性能进行了优化,特别是在高并发和大规模应用场景下,具有更好的性能和稳定性。内存管理
提供了对内存使用情况的监控和管理,支持自动清理无用连接,降低内存泄漏的风险。扩展性和灵活性
Druid 提供了丰富的配置选项,支持多种扩展机制,开发者可以根据需求自定义连接池行为。
1.2 Druid 的组件
- DruidDataSource:核心组件,负责数据库连接的管理。
- Druid Monitor:内置的 Web 监控页面,提供 SQL 执行、连接池状态等实时监控数据。
- Druid Filter:可自定义的过滤器链,支持监控、日志、SQL 防火墙等功能扩展。
1.3 主要优点
- 易用性:配置简单,集成方便。
- 高性能:对 JDBC 操作进行了多项优化,提升数据库访问速度。
- 强大的监控能力:内置监控功能,无需额外配置。
- 安全性:内置 SQL 防火墙,减少安全隐患。
1.4 Druid 的使用场景
- 大型互联网应用的数据库连接管理。
- 需要高并发访问数据库的分布式系统。
- 需要监控和优化 SQL 性能的企业级应用。
二、Druid未授权访问漏洞
在日常的威胁告警分析中经常看到有攻击者在使用扫描工具进行druid未授权访问的测试,所以想借机会学习一下该漏洞的成因、特征、危害、利用方法和修复方法。
2.1 漏洞成因
Druid未授权访问漏洞是由于当开发者配置不当、权限控制失效导致的。
2.2 漏洞特征
http://www.xxxx.com/druid/index.html
https://****.bl******.com.cn/***-***-service/druid/index.html
http://****.bl******.com.cn/***-****-view/#/
2.3 漏洞危害
通过DruidMonitor未授权访问可获取管理员信息。
2.4 漏洞利用
整体思路:通过Druid Monitor未授权访问找到SESSION监控页面下面的一些SESSION信息和URI监控下的路径,以及通过配合目标网站大数据产品平台的登录等一系列测试,可获得一起管理员以及其他注册成员信息。
1)未授权访问index.html界面
首先,是未授权的访问界面,主要关注Session监控和URI监控这两个地方,如图:
存在大量被泄漏的session信息及其对应访问的IP地址。不管是登陆成功的,没登陆成功的,还是失效的都会储存在这里。
优先选择暴露在互联网的进行利用。
2)通过session完成攻击面的扩展
例如有一些敏感的SessionId。
0b055336-85f8-4bdc-8008-d45dc23c6b2f
7a5681a1-a790-47fa-948b-a1f1a3532d09
3aaaa4d3-1259-4e64-835d-fb1f9bf35eda
同时,URI监控的页面会泄漏一些URI登录地址,通过session替换进行登录,观察效果。
如:membership/index 页面,构造数据包进行测试。
POST /********-service/me****ship/index/ HTTP/1.1
Host: *****.bl*******.com.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101Firefox/79.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 101
Origin: http://***p.********.com.c*
Connection: close
Referer: http://*****.bl*******.com.cn/******-view/
Cookie: Hm_lvt_ed752fa41bdfde359bfde28ccd27b888=1597904479,1597907505;sid=0b055336-85f8-4bdc-8008-d45dc23c6b2f;token=029d8a6ac03358de6e57c7254acbd017;
username=80560478&password=FSMBKxmUSkq9MfJjyAgyEA%3D%3D&isCookieLogin=Y&validationCode=anqr&brand=999
Cookie中的sid参数,即为session里面监控找到的数据。
BP分析请求和响应:
可以发现用在Session监控下收集的数据,替换过后,可以得到用户名和用户ID。
3)利用获取的信息登录管理后台
我们使用获取用户id,登录对应网站的后台/其他敏感系统。
密码随便填写,抓包,扔到repeater模块。
不出意外会提示密码错误。
此时,将sessionid(sid)替换为获取的session信息,username与之对应的账号。
最终可以看到成功登录到后台页面。
三、批量验证Druid未授权访问漏洞
3.1 域名收集
使用Oneforall(挂代理)或其他域名搜集工具收集域名,收集好的域名存入txt。
3.2 验证域名存活性
WFUZZ进一步验证子域名的存活性
wufzz -w 子域名.txt --hw 0 --hc 500,501,502,504,505,400 -Z -L -f 输出.txt --conn-delay 5 http://FUZZ
注意:
使用--conn-delay 5:为设置超时5秒后跳过,默认是90秒。
参数详解:
这条命令是使用
wufuzz
工具进行模糊测试(fuzzing)的命令行示例。wufuzz
是一个基于 Python 的网络模糊测试工具,用于自动化发现Web应用程序中的安全漏洞。下面是命令中各个参数的含义:
wufzz
:这是wufuzz
工具的命令行调用。-w 子域名.txt
:指定一个包含子域名的文件,wufuzz
将使用这些子域名作为测试的输入。--hw 0
:--hw
参数用于隐藏响应中字数符合指定条件的响应。具体来说,--hw
参数后面跟随的是一个数字或数字范围,表示如果响应内容的字数等于或超过这个数字时,该响应将被隐藏,不会被显示出来。--hw 0
表示隐藏所有响应内容字数为0的响应。这通常意味着服务器没有返回任何内容,可能是服务器错误或者请求没有成功到达服务器。这个参数对于在进行模糊测试时过滤掉那些没有实际意义的响应是很有用的,比如空响应或者非常常见的错误响应,从而使测试者能够更专注于那些可能表明潜在漏洞或配置错误的响应。--hc 500,501,502,504,505,400
:指定要忽略的 HTTP 响应代码。在这个例子中,wufuzz
将忽略 500、501、502、504、505 和 400 状态码的响应。-Z
:这个参数的作用是使wufuzz
在发现一个有效的响应时,不立即停止,而是继续测试,直到所有的测试用例都执行完毕。-L
:这个参数的作用是在发现一个有效的响应时,打印出请求和响应的详细信息。-f 输出.txt
:将发现的漏洞或有效响应保存到指定的文件中。--conn-delay 5
:设置两次连续请求之间的延迟时间为 5 秒。这有助于减少对目标服务器的压力,并避免因请求频率过高而被服务器限制。http://FUZZ
:这是要测试的 URL 模板,FUZZ
是一个占位符,wufuzz
会用子域名.txt
文件中的子域名替换它,生成完整的 URL 进行测试。综上所述,这条命令的作用是:使用
wufuzz
对一个或多个子域名进行模糊测试,测试过程中忽略特定的 HTTP 状态码,设置超时和请求延迟,并将发现的漏洞或有效响应保存到文件中。这种类型的测试通常用于发现 Web 应用程序中的安全漏洞,如路径遍历、信息泄露等。
预处理一下wufzz的输出结果:
def spl(filename,saveFile):
openFile = open(filename,"r")
saveFile = open(saveFile,"w")
lines = openFile.readlines()
for i in lines:
x = i.split('"')[1]
x1 = "http://" + x
saveFile.writelines(x1+'\n')
print(x1)
saveFile.close()
openFile.close()
if __name__ == "__main__":
filePath = input("Input your filepath: ")
savePath = input("Sava File name: ")
spl(filePath,savePath)
print("hey BOY,Fighiting@@@")
3.3 xray批量扫描
Xray单独开启Druid检测插件,进行批量检测:
把config.yaml中其他检测都关掉,比如SQL注入,XSS注入等等,可以更快的更有针对性只针对Druid未授权进行检测。
./xray webscan --poc poc-yaml-druid-monitor-unauth--url-file ./存活的子域名.txt --html-output test.html
命令详解:
xray
是一个安全评估工具,由长亭科技开发,用于自动化地发现和利用 Web 应用中的安全漏洞。下面是命令中各个参数的含义:
./xray
:这是调用xray
工具的命令行调用。webscan
:这是xray
的一个子命令,用于执行 Web 应用的安全扫描。--poc
:指定要使用的漏洞检测规则(Proof of Concept,简称 PoC),在这个例子中,poc-yaml-druid-monitor-unauth
是一个 YAML 文件,包含了针对 Druid 监控未授权访问漏洞的检测规则。--url-file
:指定一个包含 URL 的文件,xray
将使用这些 URL 作为测试的目标。./存活的子域名.txt
:这是包含存活子域名的文件路径,xray
将读取这个文件中的 URL 并针对它们执行安全扫描。--html-output
:指定输出结果的 HTML 文件路径。test.html
:这是输出结果的 HTML 文件名,xray
将把扫描结果以 HTML 格式保存到这个文件中。综上所述,这条命令的作用是:使用
xray
工具,配合 Druid 监控未授权访问漏洞的检测规则,对存活的子域名列表中的每个 URL 进行安全扫描,并将扫描结果以 HTML 格式输出到test.html
文件中。这种类型的扫描可以帮助发现 Web 应用中的安全漏洞,特别是针对 Druid 监控未授权访问的漏洞。
四、Druid未授权访问漏洞的修复
- 方法1:设置StatViewServlet(监控页面)为
false
,即禁用监控页面。
spring:
datasource:
druid:
stat-view-servlet:
enabled: true # 是否启用StatViewServlet(监控页面)
reset-enable: false # 禁用HTML页面上的"Reset All"功能
login-username: xxxx # 设置账户名称(增加登录权限)
login-password: xxxxxxxx # 设置账户密码
allow: 127.0.0.1 # IP白名单
deny: 10.0.0.1 # IP黑名单
url-pattern: '/druid/*' # 自定义Druid连接
- 方法2:给Druid的Web页面设置账户密码,增加访问Druid的权限。这种方法推荐使用,因为它允许在鉴权后仍然能够查看监控信息。