浅谈XXE漏洞 – 作者:Zxl2605

什么是XXE漏洞

XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。

知道XXE漏洞前首先得先了解XML

XML(Extensible Markup Language),中文名可扩展标记语言。

XML 指可扩展标记语言

XML是一种很像HTML的标记语言,但是其语法比HTML更为严谨。

XML 被设计用来传输和存储数据,而不是显示数据。

XML标签没有被预定义。您需要自行定义标签。

注意点:XML不会做任何事情,它仅仅是包装在XML标签中的纯粹的信息。

XML文档结构

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

<?xml version="1.0"?>  //元数据,版本为xml解析器解析的版本<Person><Name>John</Name><Age>20</Age></Person>
<Person></Person>为根元素,有且仅有一个

< ,> ,” ,’ , &等符号不被允许直接出现在XML文档中,因为xml解析器会搞不清这些符号是数据还是标签

<Age>20 < > & ” ‘</Age>   ×

DTD(文档类型定义)

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可以在 XML 文档内声明,也可以外部引用。

1,内部声明:

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

1626270656_60eeebc06ba71143793c6.png!small?1626270656423

2,外部声明(引用外部DTD):

<!DOCTYPE 根元素 SYSTEM "文件名">
或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

1626270676_60eeebd4ae5670a7e4a1b.png!small?1626270676686

为了声明这些实体,我们需要在文档类型定义(DTD)中进行。DTD是一组标记声明,用于定义XML的文档类型。它定义了XML文档的合法结构块和具有合法元素和属性列表的文档结构。DTD可以在XML文档内部声明,也可以作为外部引用声明—使用SYSTEM标识符指向可解析位置中的另一组声明。ENTITY可以使用SYSTEM关键字,调用外部资源,而这里是支持很多的协议,如:http;file等,然后,在其他DoM结点中可以使用如:&test;引用该实体内容.

那么,如果在产品功能设计当中,解析的xml是由外部可控制的,那将可能形成,如:文件读取,DoS,CSRF等漏洞.

如果要引用一个外部资源,可以借助各种协议 几个例子:

file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php

这里我用的靶场是pikachu漏洞练习平台

1,首先判断如何存在XXE

点击提交,使用burp进行抓包

1626270700_60eeebec9c181d451d7d3.png!small?1626270700766

先在burp抓的包xml任意标签随便命名一下,放包

1626270710_60eeebf6ebbcaeaf728f2.png!small?1626270710915

这里说明存在回显式XXE漏洞

1626270726_60eeec06d15cdf8d868bd.png!small?1626270726762

接下来我们进行内部实体进行注入

内部实体危害不大,不能读文件

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY cc "aa" > ]>
<na>&cc;</na>

1626270743_60eeec17123fded7ea346.png!small?1626270743068

接下来外部实体就不一样了

外部实体可以读文件

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///C://windows//win.ini" >
]><x>&f;</x>

1626270761_60eeec29c2671a8cbf0cf.png!small?1626270761727

其中有些黑客就会利用这种漏洞更改实体内容file:///etc/passwd进行获取电脑的密码

其中file也可以更改为其他协议

支持的协议有哪些?
不同程序支持的协议如下图:

1626270781_60eeec3d256b3480d4b40.png!small?1626270781228

预防XXE注入漏洞

方案:使用开发语言提供的禁用外部实体的方法

1.PHP:
libxml_disable_entity_loader(true);
2.JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
3.Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案二、尽量不要让用户直接提交XML代码,如果要,过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

结语

需要注意的就是XXE的造成与PHP版本无关,与libxml库的版本有关。libxml <= 2.9.0中,默认启用了外部实体,libxml>2.9.0中默认仅用了外部实体。XXE并不是直接由libxml库造成的,libxml库提供了一些XML核心功能,包括禁用外部实体的libxml_disable_entity_loader()函数,SimpleXML库提供了解析XML的函数,SimpleXML库依赖于libxml库。

来源:freebuf.com 2021-07-14 21:57:21 by: Zxl2605

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享