![91f49e3db66dbc7c6e31c37c8ea3bb3c.png](https://i-blog.csdnimg.cn/blog_migrate/22f98cf62173e84194d0e49bcdd98e65.jpeg)
XEE:XML External Entity(XML外部实体)
(注意:XEE与XML注入、XPATH注入漏洞不一样的!)
XML:可扩展标记语言,用来结构化,存储以及传输信息!
XML文档结构:
- XML声明
- 文档类型定义(Document Type Definition,DTD,可选项)
- 文档元素
![d04ab310454817b8b9b7badf85754fb6.png](https://i-blog.csdnimg.cn/blog_migrate/2648a99e95ce627d274d17db5df327a0.jpeg)
DTD:用来约束一个XML文档的书写规范!
- 定义元素
(对应XML中的标签)
- 定义实体
(对应XML标签中的内容)
内部定义:将文档类型定义直接放在XML文档中
![45c75c3e77a02bf82ab91ee51726b876.png](https://i-blog.csdnimg.cn/blog_migrate/b059f48a68ba09579dbec0f646a45ad2.jpeg)
DOCTYPE note:定义此文档是note类型的文档!
ELEMENT note(to,from,heading,body)定义note有4个元素:
to,from,heading,body!
ELEMENT to(#PCDATA)定义to元素为#PCDATA类型
......
假如DTD文档位于XML源文件的内部:
通过引用【外部文档说明】的方式进行引用!
![ecedfda071dc62cfbaac8a406be413e1.png](https://i-blog.csdnimg.cn/blog_migrate/e85432d546c2afc69c4288dd2c67db46.jpeg)
外部引用:
文档类型定义的内容可以保存为单独的DTD文档
- DTD文档在本地
用SYSTEM标识,并写上”DTD的文件路径”,如下:
- DTD文档在公共网络上
用PUBLIC标识,如下:
称" "DTD文件的URL">
![b1e66da5ce4ead81413ab597d312a9ef.png](https://i-blog.csdnimg.cn/blog_migrate/6060c8447cb6a2052cae2ae7be478e39.jpeg)
DTD实体声明
- 内部实体声明
![059feb9acf15610e395e971ba5a3fba9.png](https://i-blog.csdnimg.cn/blog_migrate/dd3284ef31cfb1d221a4439f2b7a019a.jpeg)
- 外部实体声明
![e2d96432d695b55fb793ff46826d44c6.png](https://i-blog.csdnimg.cn/blog_migrate/a9502427146a5930d4cee7430dadceb4.jpeg)
![ff6de33ae71af44011597a707f700cce.png](https://i-blog.csdnimg.cn/blog_migrate/6b3ba68c373d92e2cef7e5f4fcc2dcbe.jpeg)
- 参数实体声明
![68e0f6d2cd45099638d727d37280529c.png](https://i-blog.csdnimg.cn/blog_migrate/6fb0def1b447181aa3c17f798d5a3fee.jpeg)
- 引用公共实体
漏洞产生的原因
XXE是一种针对应用程序的解析XML输入的攻击,当输入包含外部实体引用的XML文件到未进行安全配置的XML解析器中时,易产生此类攻击!
XXE的利用
- 泄漏本地文件
// 通过加载外部实体,利用file://、php://等伪协议读取本地文件
![c766feb657160bc2359d306e17679dc3.png](https://i-blog.csdnimg.cn/blog_migrate/54d595f045c48687ba28c0a95dd37a74.jpeg)
![c07f44f349b7ce66ef59fb92dd3f0c81.png](https://i-blog.csdnimg.cn/blog_migrate/363c0f0fba283d0775275326e3aaefc9.jpeg)
- CSRF/SSRF攻击
// 攻击者使用受信任的应用程序来攻击内部的其他系统,通过HTTP请求或内部服务发起SSRF攻击
- 命令执行
expect://系统标识符执行系统命令
- 拒绝服务
// 执行特定的操作占用系统大量内存,从而造成系统瘫痪!
- 内网端口探测
// 访问特定的端口,来探测端口是否开放!
![d6ecdcaf30a777a8e14590bab3d07407.png](https://i-blog.csdnimg.cn/blog_migrate/edcafd88d07e6325a0bdb5ce910cb8f5.jpeg)
注意:具体实例,会在<>篇详解!
XEE防御
- 禁用DTD中外部实体
防止外部实体的注入!
libxml_disable_loader(true)
- 过滤用户提交的XML数据
过滤关键字:
SYSTEM
PUBLIC
......
补充
XML解析器
DOM解析方式
SAX解析方式
JDOM
DOM4J
各种解析方式的工作原理,都支持外部实体的引用,因此防御过程中,一般都禁用对DTD的支持,需要支持的话,一定要禁用对DTD中外部实体引用的支持!