1. Druid未授权访问漏洞初探
第一次遇到Druid未授权访问漏洞是在去年的一次企业安全评估中。当时我正在用xray对目标网站进行常规扫描,突然在报告里看到一个奇怪的URL:/druid/weburi.html。点开一看,好家伙,整个网站的后台接口路径全都暴露出来了。这就像不小心拿到了别人家的户型图,虽然还没进门,但已经知道每个房间的位置了。
Druid是阿里巴巴开源的一个数据库连接池组件,很多Java Web项目都会用到。它的监控页面本意是给管理员查看系统状态的,但如果配置不当就会变成未授权访问漏洞。常见的泄露点有两个:
/druid/weburi.html:会显示网站所有的URI访问记录/druid/websession.html:会暴露所有用户的Session信息
我遇到过最夸张的情况是,一个电商平台的Druid页面直接暴露了支付接口的调用参数。攻击者甚至不需要登录,就能看到完整的订单流水和用户手机号。不过当时客户觉得这只是个"低危漏洞",直到我演示了如何利用这些信息完成账户接管...
2. 从信息泄露到会话劫持
2.1 Session信息的提取与利用
拿到websession.html页面后,你会看到满屏的JSESSIONID。这些会话标识就像临时通行证,有些可能已经过期,但总有几个还在有效期内的。我的处理流程一般是:
- 用浏览器开发者工具直接复制整个表格内容
- 在Sublime Text里用正则表达式提取JSESSIONID:
JSESSIONID=([^\s;]+) - 把提取出的Session保存为字典文件
这里有个小技巧:不同系统的Session有效期差异很大。金融类系统通常15分钟就过期,而一些内部管理系统可能保持登录状态好几天。我曾经在某OA系统里发现过存活超过48小时的Session。
2.2 会话有效性验证
有了Session字典后,我会先用Burp Intruder做个快速筛查。选择任意一个需要登录的接口(比如/user/profile),设置Payload为Session字典,然后观察响应:
- 返回200:Session有效
- 302跳转到登录页:Session已失效
- 403错误:Session有效但权限不足
GET /api/user/info HTTP/1.1 Host: target.com Cookie: JSESSIONID=xxxxxx去年在某次渗透中,我用这个方法扫出了87个有效Session,其中有3个居然还是管理员权限。最离谱的是,其中一个Session对应的账号竟然是系统运维负责人...
3. 权限提升的实战技巧
3.1 URI路径的深度利用
光有Session还不够,我们需要知道能访问哪些功能。这时候weburi.html就派上用场了。这个页面会显示所有被访问过的URI路径,包括:
- 后台管理接口(如
/admin/user/add) - API端点(如
/api/v1/account/delete) - 特殊功能页面(如
/export/database)
我的做法是把这些URI也做成字典,配合有效的Session进行二次爆破。重点找以下关键词的路径:
- admin/manager/root
- user/add/delete
- config/export/import
- password/reset/change
3.2 管理员权限的获取
当发现权限不足的接口时(比如返回403的/admin/user/list),我会用之前收集的所有Session对这个接口单独测试。根据经验,以下Session更容易获得高权限:
- 来自内网IP的访问记录
- 最近24小时内的活跃Session
- User-Agent包含"Admin"、"Manager"等关键词的
在某次实战中,我通过这种方式找到了一个财务系统的超级管理员Session。更可怕的是,这个系统竟然没有二次验证,直接允许通过Session修改所有用户的密码。
4. 漏洞防御方案
4.1 基础防护措施
如果你们的系统用了Druid,请立即检查:
- 是否开启了鉴权配置:
<servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <init-param> <param-name>loginUsername</param-name> <param-value>admin</param-value> </init-param> <init-param> <param-name>loginPassword</param-name> <param-value>complex_password</param-value> </init-param> </servlet> - 是否限制了访问IP:
@Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean reg = new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings("/druid/*"); // 只允许本地访问 reg.addInitParameter("allow", "127.0.0.1"); return reg; }
4.2 进阶安全建议
对于已经上线的系统,建议额外增加:
- 访问频率限制(比如1分钟内超过10次访问就封IP)
- Session绑定IP机制
- 关键操作的多因素认证
- 定期审计Druid监控页面的访问日志
有次我给客户做安全加固,发现他们的Druid页面虽然加了密码,但用的居然是admin/admin这种弱口令。更糟的是,这个密码在三个环境(开发、测试、生产)全都一样...