Hello,各位小伙伴大家好~
这里是你们的小编Monster~
最近学习了XXE漏洞的基本原理,一起来看看吧!
Part.1
XML基础
XML语法
XXE漏洞是由于web应用程序解析了恶意的xml代码导致的。
因此,在学习之前,我们先来康康xml的基本原理。
与HTML相比:
我们先来看一个简单的例子:
DTD
为了方便开发和制定xml的格式,我们使用DTD来检查xml的合法性。
可以把DTD看作一套统一的格式,大家都按这个格式来交换数据。
(1)内部声明
即直接在xml文档中进行声明,格式为:
<!DOCTYPE 根元素 SYSTEM [元素声明]>
为上面的例子添加一个DTD内部声明:
(2)外部声明
如果DTD位于xml源文件的外部,那么可以使用外部声明,格式为:
<!DOCTYPE 根元素 SYSTEM "文件名">
xml文件修改为:
外部文件message.dtd内容:
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
DTD实体也可以内部声明或外部引用。
XXE就是由于xml引用了恶意的外部实体导致
(1)内部实体声明
<!ENTITY 实体名称 "实体的值">
因为DTD是一种快捷变量,因此可改写上面的例子为:
(2)外部实体声明
当然也可以从外部加载DTD实体,如下:
Part.2
XXE漏洞
漏洞实现
XXE(XML External Entity),即xml外部实体注入。引用外部实体时,不同的程序可支持不同的协议:
我们先来写一个简单的xml接收页面:
三个主要的函数说明:
(1)php://input
//用于读取POST的原生数据。
(2)file_get_contents()
//将读取到的内容放入字符串中。
(3)simplexml_load_string()
//用于将字符串转换为xml对象
访问该页面并使用xml传入数据:
服务器成功接收了参数:
现在我们尝试利用外部实体声明读一下本机文件:
成功读取到win.ini文件内容:
这就是一个简单的xxe漏洞利用。
pikachu平台
我们来看看pikachu平台上的xxe漏洞:
查看后端代码:
和我们的演示代码差不多,使用前面代码的尝试注入:
也能成功读取敏感文件:
如果需要读取php文件,需要经过base64加密后读取出来:
获取加密后的信息:
解密后即可获取源码:
XXE防御
(1)禁用外部实体
以php为例,可以通过以下函数禁用外部实体:
libxml_disable_entity_loader(ture)
(2)过滤敏感关键词
<!DOCTYPE、<!ENTITY、SYSTEM和PUBLIC等
(3)使用高版本
libxml2.9.1及以后的版本,默认不解析外部实体。
Part.3
结语
这就是今天的全部内容了,大家都明白了吗?
欢迎到公众号:一名白帽的成长史提问&留言~