PHP之XXE漏洞靶场详解

PHP之XXE漏洞靶场详解

00x1 什么是XXE

简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

00x2 XML基础知识

XML是一种非常流行的标记语言,在1990年代后期首次标准化,并被无数的软件项目所采用。它用于配置文件,文档格式(如OOXML,ODF,PDF,RSS,…),图像格式(SVG,EXIF标题)和网络协议(WebDAV,CalDAV,XMLRPC,SOAP,XMPP,SAML, XACML,…),他应用的如此的普遍以至于他出现的任何问题都会带来灾难性的结果。

在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。

XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的,他就是长得下面这个样子。

//这一行是 XML 文档定义





上面这个 DTD 就定义了 XML 的根元素是 yzx,然后跟元素下面有一些子元素,那么 XML 到时候必须像下面这么写。


Myself
Someone
TheReminder
This is an amazing book

其实除了在 DTD 中定义元素(其实就是对应 XML 中的标签)以外,我们还能在 DTD 中定义实体(对应XML 标签中的内容),毕竟 ML 中除了能标签以外,还需要有些内容是固定的。



]>

这里 定义元素为 ANY 说明接受任何元素,但是定义了一个 xml 的实体(这是我们在这篇文章中第一次看到实体的真面目,实体其实可以看成一个变量,到时候我们可以在 XML 中通过 & 符号进行引用),那么 XML 就可以写成这样。


&xxe;
mypass

我们使用 &xxe 对 上面定义的 xxe 实体进行了引用,到时候输出的时候 &xxe 就会被 “test” 替换。

读取本地文件

本地搭建好的XXE靶场
PHP之XXE漏洞靶场详解_第1张图片本次实验的目的是读取本地C盘下1.txt (环境我是用win10搭建的)
PHP之XXE漏洞靶场详解_第2张图片我们开始构造payload,目的明确,我们只要payload输出在username里面,于是这样构造:



]>
&xxe;yzx

PHP之XXE漏洞靶场详解_第3张图片ok,我们在这里读到1.txt文件的内容
PS:第一次写博客哈,有点lou
XML部分写的不好,大家多多参考以下连接
参考:https://www.w3school.com.cn/
https://xz.aliyun.com/t/3357#toc-18
https://www.freebuf.com/

你可能感兴趣的:(PHP之XXE漏洞靶场详解)