OWASPtop10——XXE-XML漏洞
本文最后更新于 2024-07-26,文章内容可能已经过时。
TOP10-01
XXE-XML外部实体注入攻击漏洞
免责声明
⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠
一.XML和DTD基础
XML是一种用于标记电子文件使其具有结构性的可扩展型标记语言(类似于HTML)
但是没有固定的标签,所有标签都可以定义,其设计的宗旨是传输数据,而不是像HTML一样显示数据。
1.xml文档必须要有一个根元素
2xml元素必须有一个关闭标签
3.xml元素必须被正确嵌套
4.xml属性值必须加引号
DTD约束:就是用来约束xml文档定义语义约束
PCDATA:
PCDATA表示包含字符或文本数据,这些文本将被解析器检查实体以及标记。不过被解析的字符不应该包含任何&、<或者>字符;需要使用&、<以及>实体来分别替换他们
使用方法:
CDATA
CDATA指的是不因由XML解析器进行解析的文本数据
CDATA部分中的所有内容都会被解析器忽略
语法:
由<![CDATA[开始,]]>结束
使用方法:
二.DTD实体:
1.内部普通实体:
声明:
<!ENTITY实体名称 "实体的值">
引用:一个实体的引用由三部分构成;&符号,实体名称,分号。
内部实体漏洞–DDOS
2.外部普通实体:
外部普通实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
<!ENTITY 实体名称 PUBLC "DTD 标识名" "公用DTD的URI">
SYSTEM 及 PUBLC的区别
PUBLC指公用 DTD ,其是某个权威机构制定,供特定行业或公司。
SYSTEM是指该外部 DTD 文件是私有的,即我们自己创建的,没有公开发行,只是个人或在公司内部或者几个合作单位之间使用。
公用 DTD 使用 PUBLC代替了原来的SYSTEM,并增加了DTD 标识名
以上这些其实就是xxe漏洞的利用
xxe漏洞利用:外部实体利用
用法:
exepct://command
![image-20231115224905416](
特别声明:
xml规范不允许将内部实体和外部实体结合使用
3.参数实体:
声明:
内部:
<!ENTITY % 实体名称 "实体值">
外部:
<!ENTITY % 实体名称 SYSTEM "URI">
这里的
<!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 区。
解决方法:将参数引用放到外部来
三.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漏洞
4.XXE漏洞利用:
一.XXE本地文件读取:
有回显XXE:
无回显XXE:
如图:这里的start和file变为不同级的参数实体
但是还是出错,加入服务器中DTD文件
如图:引用外部实体cevil.dtd文件然后监听8998端口,成功读取到1.txt文件的内容。
二.XXE内网主机探测:
有回显XXE:
使用BurpSuite的爆破模块:
可以通过Length判断内网主机是否有存活
无回显XXE:
通过右下角的响应时间的时间差来判断内网内是否有存活主机
如图内网内有存活主机,响应时间只有1秒不到。
三.java中上传excel导致XXE
在线实验机:
https://www.hetianlab.com/expc.do?ce=b8a4e940-a5d2-4691-aad9-542f8836c5ac
漏洞发现
新建一个excel格式的文件将后缀的XLSX改为zip
将zip中的[Content_Types].xml文件里插入payload,改回xlsx后上传服务器
![image-20231116004311977](
攻击机监听9999端口,服务器成功解析上传的xlsx格式文件后,攻击机则会接收到服务器的请求。
5.XXE修复建议:
- 感谢你赐予我前进的力量