【疑难攻关】 | 您所在的位置:网站首页 › 漏洞时间是什么 › 【疑难攻关】 |
作者名:Demo不是emo 主页面链接:主页传送门 创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: 网络安全,数据结构 每日emo: 该怎么开口呢?今晚天气不错,但还是想你了 目录 一:初识XXE漏洞 1.XXE简介 2.XML概念 二:XML语法简析 1.XML基础语法 2.XML实体 [[1].XML的基本结构 ](#t6) [[2].一般实体 ](#t7) [[3].参数实体](#t8) [[4].预定义实体](#t9) [[5].内部实体和外部实体](#t10) [[6].实例演示](#t11) 三:漏洞演示 1.漏洞明析 [[1].例一. ](#t14) [[2].例二](#t15) 2.检测漏洞 3.漏洞利用 [[1].直接外部实体注入 ](#t18) [[2].间接外部实体注入 ](#t19) 四:漏洞防范 1.XXE简介XXE就是XML外部实体注入,当允许引用外部实体时, XML数据在传输中有可能会被不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。 那有的小伙伴可能就会问了,那XML又是什么呢? 2.XML概念XML是可扩展的标记语言(eXtensible Markup Language),设计用来进行数据的传输和存储, 结构是树形结构,有标签构成,这点很像HTML语言。 但是XML和HTML有明显区别如下: XML 被设计用来传输和存储数据。 HTML 被设计用来显示数据。 1.XML基础语法先来看一段简单的XML代码 //声明XML解析器版本来解析 //根元素,不一定是persontest //子元素,意思就是name变量的值是test 简单来说XML的语法中,标签就是变量名,标签里面的数据就是变量的值 但这里也存在一个问题,当数据里出现了尖括号时,就会造成XML数据的解析错误,如下 引用一般实体的方法:&实体名称; 来看看下面一段使用了一般实体的代码 // 声明XML解析器版本来解析 范围:普通实体可以在DTD中引用,可以在XML中引用,可以在声明前引用,还可以在实体声明内部引用。 [3].参数实体参数实体的声明: 引用参数实体的方法:%实体名称; 来看看下面一段使用了参数实体的代码,其实跟一般实体差不多知识%的区别 // 声明XML解析器版本来解析 %outer; //参数实体定义的变量必须先在dtd文件中引用 它必须定义在单独的DTD区域,这种实体相对灵活,这种功能在漏洞利用场景的外部实体注入(XXE)过程中非常有用 [4].预定义实体这玩意在XXE漏洞中一般用不到,有兴趣的同学可以去简单了解一下,我这里就不讲了 [5].内部实体和外部实体上面讲的那些都是内部实体,实体的值来源于内部,而外部实体顾名思义就是引用外部的值,两者的写法也差不多,外部实体仅仅是多了一个SYSTEM,给大家列了个表格这样大家可以更清楚一点,如下 注意:引入外部的DTD文件时,dtd文件中存放的就是xml代码,并且引用外部实体的时候还可以使用各种伪协议,而不是仅限于http协议 [6].实例演示可能有些人还是比较迷糊, 下面分别给出一个内部实体和外部实体的例子大家就能看懂了 来看一段内部实体的例子 再来看看外部实体 http://xx.com/aa.dtd”> 总结一下,内部实体就相当于自己编写DTD内容,而外部实体就相当于引入外部的DTD内容,类似于写JS代码时从外部引入JS文件,这样就能理解了吧,上面的一般实体和参数实体都可以化为外部实体 而XXE漏洞,就存在于外部实体中,我们将恶意代码写入DTD文件中再通过外部实体引入 1.漏洞明析在这里在复习一下XXE漏洞是什么 XXE漏洞就是XML外部实体注入。既然是外部实体注入,那么针对于XXE漏洞肯定就是XML外部实体了。 引入外部实体方式有很多种,比如: 实体ENTITY不仅能用来存储指定数值,他还能从本地文件或者远程文件中调用相关的数据作为后续实体引用。如外部实体(XML External Entity)就是其中之一。 下面举两个简单的外部实体攻击例子 [1].例一.
此时c变量读取的值便是/etc/passwd文件的内容 但这种方式也有问题,就是会涉及到敏感内容,所以还有下面这种攻击方法 [2].例二http://abc.com/evil.dtd”> 该方法通过引入外部的DTD文件,而文件中同样是读取敏感文件的恶意代码,这样被检测的可能性就大大降低 2.检测漏洞这里的漏洞环境我们使用的是pikachu这个靶场的XXE关卡,这个靶场应该都有吧,没有的也可以找我拿,打开该靶场的XXE关卡,如下 可以看到是一个输入框,提示可以接收xml数据 那我们该怎么判断是否存在XXE漏洞呢?其实就是看他是否能够解析XML数据,所以我们直接传入一段XML代码看他能否解析 我们放入下面这段代码 [ ]> 这段代码都能看懂吧,就是给name变量赋了一个test值,把代码放到输入框中,点击提交,结果如下 成功提取到test数据,说明有可能存在XXE漏洞 3.漏洞利用上面已经检测数来存在XXE漏洞了,那应该怎么利用呢,很简单,就是利用我们刚才讲到的,外部实体引用可以使用的——协议 这里也给大家准备了各种语言支持的协议 ,如下 直接外部实体注入,就是通过协议直接执行恶意命令 因为我是windows主机,这里我们以file协议来读取c:/windows/win.ini配置文件的内容,xml代码如下(注意这里的路径需要改变写法,不然会受到转义的影响) [ 将代码放入输入框提交,结果如下: 成功读取 [2].间接外部实体注入这个也比较简单,就会将恶意代码写在DTD文件中,再引入DTD文件,操作如下 1.构造外部dtd文件 打开虚拟机,这里我选择的是kali,进入根目录,创建一个xxx.dtd的文件,内容如下 2.使两台机器可以互相连接 这里直接打开apache服务就可以达到这个效果了,主要是为了使xml代码能成功引用到kali的dtd文件 3.构造XML代码 引用外部实体的xml代码如下(192.168..0.107是我的kali的ip地址),这里用参数实体给大家演示一下 [ 效果如下,成功读取 针对于XXE漏洞修复其实只有两点: 1、禁止使用外部实体,例如libxml disable_entity_loader(true) 。 2、过滤用户提交的XML数据,防止出现非法内容。 |
CopyRight 2018-2019 实验室设备网 版权所有 |