本文最后更新于 2024-07-26,文章内容可能已经过时。

TOP10-01

XXE-XML外部实体注入攻击漏洞

免责声明

⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

一.XML和DTD基础

XML是一种用于标记电子文件使其具有结构性的可扩展型标记语言(类似于HTML)

但是没有固定的标签,所有标签都可以定义,其设计的宗旨是传输数据,而不是像HTML一样显示数据。

image-20230822120901810

1.xml文档必须要有一个根元素

2xml元素必须有一个关闭标签

3.xml元素必须被正确嵌套

4.xml属性值必须加引号

DTD约束:就是用来约束xml文档定义语义约束

image-20230822142714845

image-20231115123729328

PCDATA:

PCDATA表示包含字符或文本数据,这些文本将被解析器检查实体以及标记。不过被解析的字符不应该包含任何&、<或者>字符;需要使用&、<以及>实体来分别替换他们

image-20231115124901171

使用方法:

image-20231115125706988

CDATA

CDATA指的是不因由XML解析器进行解析的文本数据

CDATA部分中的所有内容都会被解析器忽略

语法:

由<![CDATA[开始,]]>结束

image-20231115125306567

使用方法:

image-20231115125552083

二.DTD实体:

1.内部普通实体:

声明:

<!ENTITY实体名称 "实体的值">

引用:一个实体的引用由三部分构成;&符号,实体名称,分号。

image-20231115130144046

image-20231115130226549

image-20231115130242051

内部实体漏洞–DDOS

image-20231115130348556

image-20231115130402672

image-20231115130427543

2.外部普通实体:

外部普通实体声明

<!ENTITY 实体名称 SYSTEM "URI/URL">
<!ENTITY 实体名称 PUBLC "DTD 标识名" "公用DTD的URI">

SYSTEM 及 PUBLC的区别

PUBLC指公用 DTD ,其是某个权威机构制定,供特定行业或公司。

SYSTEM是指该外部 DTD 文件是私有的,即我们自己创建的,没有公开发行,只是个人或在公司内部或者几个合作单位之间使用。

公用 DTD 使用 PUBLC代替了原来的SYSTEM,并增加了DTD 标识名

image-20231115130506376

image-20231115130844566

image-20231115202756787

image-20231115203233832

image-20231115204853711

以上这些其实就是xxe漏洞的利用

xxe漏洞利用:外部实体利用

用法:

exepct://command

![image-20231115224905416](

特别声明:

xml规范不允许将内部实体和外部实体结合使用

image-20231115225059468

3.参数实体:

声明:

内部:

<!ENTITY % 实体名称 "实体值">

外部:

<!ENTITY % 实体名称 SYSTEM "URI">

image-20231115225755841

image-20231115230412751

这里的

<!DOCTYPE data [
<!EHTITY  % start "<![CDATA[">
<!ENTITY % file SYSTEM "file:///d:/xxetest. txt">
<!ENTITY % end "]]>">
<!ENTITY all "%start;%file;%end;">
]>
<data>&all;</data>

声明了内部参数实体和外部参数实体,最后通过all拼接start,file,end

在最后的all进行引用

参数实体必须定义在单独的 DTD 文档中或 XML 文档的 DTD区,前者为该 XML 文档的外部子集,后者为该 XML 文档的内部子集。但是引用只能在 DTD 文档中,即外部子集,而不能在 XML 文档的 DTD 区。

解决方法:将参数引用放到外部来

image-20231115234248879

三.XXE漏洞

1.XXE概述:

XXE定义:

​ XXE ( XML External Entity )即XML外部实体注入攻击,发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致攻击者可以通过 XML 的外部实体获取服务器中本应被保护的数据。

产生的原因:

在文档类型定义部分,可以引用外部的 DTD 文件,所以这里容易出现安全问题。XML解析器解析外部实体时支持多种协议,如:使用file协议可以读取本地文件内容,使用 http 协议可以获取 web 资源等因此攻击者可以构造恶意的外部实体,当解析器解析了包含恶意外部实体的XML类型文件时,便会导致XXE攻击。

2.利用场景:

1.有回显XXE

有回显的情况可以直接在页面中看到payload 的执行结果或现象。带内xml外部实体(xxe)即攻击者可以发送带有xxe有效负载的请求,并从包含某些数据的 web 应程序获取响应。

2.无回显XXE

无回显的情况又称为引 Blind XXE ,可以使用外带数据通道提取数据即带外XML 外部实体( OOB-XXE )。

3.漏洞发现:

a 首先寻找接受XML作为输入内容的端点。

可以通过修改 HTTP 的请求方法,修改 Conte-Type 头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有 XXE 攻击漏洞。

b. 如果站点解析xml,就可以尝试引用实体和 DTD.

c.如果可引用外部实体,则存在xxe漏洞

image-20231116000119814

image-20231116000200000

4.XXE漏洞利用:

一.XXE本地文件读取:

有回显XXE:

image-20231116000547846

无回显XXE:

image-20231116000649748

image-20231116000937859

image-20231116001006589

如图:这里的start和file变为不同级的参数实体

但是还是出错,加入服务器中DTD文件

image-20231116001226044

如图:引用外部实体cevil.dtd文件然后监听8998端口,成功读取到1.txt文件的内容。

二.XXE内网主机探测:

有回显XXE:

使用BurpSuite的爆破模块:

image-20231116002309750

image-20231116002438652

可以通过Length判断内网主机是否有存活

无回显XXE:

image-20231116002547560

image-20231116002725057

通过右下角的响应时间的时间差来判断内网内是否有存活主机

如图内网内有存活主机,响应时间只有1秒不到。

三.java中上传excel导致XXE

在线实验机:

https://www.hetianlab.com/expc.do?ce=b8a4e940-a5d2-4691-aad9-542f8836c5ac

漏洞发现

新建一个excel格式的文件将后缀的XLSX改为zip

image-20231116004125474

image-20231116004140281

image-20231116003803307

将zip中的[Content_Types].xml文件里插入payload,改回xlsx后上传服务器

![image-20231116004311977](

image-20231116004346683

攻击机监听9999端口,服务器成功解析上传的xlsx格式文件后,攻击机则会接收到服务器的请求。

5.XXE修复建议:

image-20231116012129188