XXE(xml external entity -injection")
是xml的外部文档的一种注入漏洞。
首先来看一下xml的大体结构:
DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。
主要出问题的大多是从DTD这部分出的。
DTD大体框架:
- DTD 内部声明
<! DOCTYPE 根元素 [元素声明]> - DTD 外部引用
<! DOCTYPE 根元素名称 SYSTEM “外部DTD的URI”> - 引用公共DTD
< !DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI ”>
外部实体引用payload:
<?xml version = "1.0"?>< !DOCTYPE ANY [
< !ENTITY f SYSTEM “file:///etc/passwd”>
]>
< x>&f;< /x>
利用这个来访问敏感文件。
外部引用可以支持http,file,ftp等协议。
如果一个接口支持接收xml数据,且没有对xml数据做任何安全上的措施,就可
能导致XXE漏洞
simplexml_load_string()
函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象
在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外
部实体内容的。
所以在2.9以上版本的这个漏洞很难利用
漏洞发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致攻击者构造恶意的xml。