什么是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 根元素 [元素声明]>
2,外部声明(引用外部DTD):
<!DOCTYPE 根元素 SYSTEM "文件名"> 或者 <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
为了声明这些实体,我们需要在文档类型定义(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进行抓包
先在burp抓的包xml任意标签随便命名一下,放包
这里说明存在回显式XXE漏洞
接下来我们进行内部实体进行注入
内部实体危害不大,不能读文件
<?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY cc "aa" > ]> <na>&cc;</na>
接下来外部实体就不一样了
外部实体可以读文件
<?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///C://windows//win.ini" > ]><x>&f;</x>
其中有些黑客就会利用这种漏洞更改实体内容file:///etc/passwd进行获取电脑的密码
其中file也可以更改为其他协议
支持的协议有哪些?
不同程序支持的协议如下图:
预防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
请登录后发表评论
注册