0x00 前言
大家好,
今天,我将分享一种非常有趣的利用XXE的技术,该技术是我通过https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/所发现的,且后面经过GoSecure团队研究。该方案是在不允许HTTP带外请求的情况下,仅根据DNS查询记录,通过应用程序抛出XML解析的详细错误消息来读取服务器上的本地文件。
0x01 发现过程
在用Burp测试应用程序时,我意识到app在每个端点都使用了基于JSON的REST API。接下来,我尝试将Content-Type转换为application/xml并重放了其中一个请求,然后发现应用回显里抛出了一些错误信息,该错误显示了应用服务器(JBoss)和其他一些错误详细信息,很明显,该应用希望解析某些XML,但是请求的body却是JSON。因此,我将请求的body由JSON转换为相应的XML。
0x02 绕过waf
该服务器使用了基于云的WAF,该WAF禁止使用<?xml version=1.0?>的XML声明,因此我不使用XML声明,而是直接放入XML正文。
..
..
我很惊讶地看到该应用程序愉快地接受了该请求,并且请求成功。
接下来,我快速使用了最简单的XXE payload来读取文件/ etc / passwd
]>
1
&x;
但是WAF再次被触发,我所要做的就是在协议之前放置一个空格(即“ file:/// etc / passwd”),然后就绕过了WAF!
0x03 利用之旅
但是,该应用程序会验证所有传递的数据,并且不允许“name”或任何其他元素使用如/ etc / passwd的值,只或多或少地允许使用[a-zA-Z0-9]。
如果我尝试读取不存在的文件,或者读取了/ etc / shadow之类的文件,则会抛出禁止访问或一些冗长的错误,但不会包含其文件内容,因此可以确认确实存在XXE漏洞,而且我还可以确认文件是否存在服务器上或是否可以在服务器上访问,只是我无法通过response来获取文件的内容。
0x04 XXE OOB
我想跳过所有的这些麻烦,并使用OOB技术来通过FTP检索文件,因为app服务器是JAVA技术的并为此使用了burp collaborator,而且还使用了参数实体而不是常规实体。
%x;
]>
1