千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > XXE漏洞快速入门

XXE漏洞快速入门

来源:千锋教育
发布人:wjy
时间: 2023-01-05 10:19:00 1672885140

  一:初识XXE漏洞

  1.XXE简介

  XXE就是XML外部实体注入,当允许引用外部实体时, XML数据在传输中有可能会被不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。

  那有的小伙伴可能就会问了,那XML又是什么呢?

  2.XML概念

  XML是可扩展的标记语言(eXtensible Markup Language),设计用来进行数据的传输和存储, 结构是树形结构,有标签构成,这点很像HTML语言。

  但是XML和HTML有明显区别如下:

  XML 被设计用来传输和存储数据。

  HTML 被设计用来显示数据。

  二:XML语法简析

  1.XML基础语法

  先来看一段简单的XML代码

XXE漏洞快速入门1

  简单来说XML的语法中,标签就是变量名,标签里面的数据就是变量的值

  但这里也存在一个问题,当数据里出现了尖括号时,就会造成XML数据的解析错误,如下

XXE漏洞快速入门2

  所以xml语法中也对这种写法最初了规定,即

  在XML中某些单独字符,如引号” ‘ & 和 尖括号 都是不允许直接出现在XML文档中(也就是不能直接用刚才那种写法保存这些带有这些单独字符的数据)的,因为XML 解析的时候会分辨不清这种输入到底是数值还是标签 那有什么办法能够保存这些带有特殊字符的数据呢?这就是下面我们要讲的实体

  2.XML实体

  上面的问题必须要解决,所以出现了实体Entity来解决这个问题 实体Entity是一种简单的存储单元就好比xml变量一样可以对它进行赋值﹐并在xml文档中不同的地方对他引用。实体在XML文档中的文档类型定义部分(DTD)被单独定义描述。

  [1].XML的基本结构

  上面有一些词可能大家还比较陌生,先简单介绍一些XML基本的结构,由XML声明,DTD部分,XML部分,三部分组成,示意图如下

XXE漏洞快速入门3

  DTD部分就是用来定义 XML 文档的合法构建模块的,继续往下看你就明白了

  上面讲到了实体,我们继续来看看

  而实体又分为三种,一般实体(通用实体),参数实体,预定义实体

  [2].一般实体

  一般实体的声明:

  引用一般实体的方法:&实体名称;

  来看看下面一段使用了一般实体的代码

XXE漏洞快速入门4

  范围:普通实体可以在DTD中引用,可以在XML中引用,可以在声明前引用,还可以在实体声明内部引用。

  [3].参数实体

  参数实体的声明:

  引用参数实体的方法:%实体名称;

  来看看下面一段使用了参数实体的代码,其实跟一般实体差不多知识%的区别

XXE漏洞快速入门5

  它必须定义在单独的DTD区域,这种实体相对灵活,这种功能在漏洞利用场景的外部实体注入(XXE)过程中非常有用

  [4].预定义实体

  这玩意在XXE漏洞中一般用不到,有兴趣的同学可以去简单了解一下,我这里就不讲了

  [5].内部实体和外部实体

  上面讲的那些都是内部实体,实体的值来源于内部,而外部实体顾名思义就是引用外部的值,两者的写法也差不多,外部实体仅仅是多了一个SYSTEM,给大家列了个表格这样大家可以更清楚一点,如下

XXE漏洞快速入门6

  注意:引入外部的DTD文件时,dtd文件中存放的就是xml代码,并且引用外部实体的时候还可以使用各种伪协议,而不是仅限于http协议

  [6].实例演示

  可能有些人还是比较迷糊, 下面分别给出一个内部实体和外部实体的例子大家就能看懂了 来看一段内部实体的例子

XXE漏洞快速入门7

  再来看看外部实体

XXE漏洞快速入门8

  总结一下,内部实体就相当于自己编写DTD内容,而外部实体就相当于引入外部的DTD内容,类似于写JS代码时从外部引入JS文件,这样就能理解了吧,上面的一般实体和参数实体都可以化为外部实体

  而XXE漏洞,就存在于外部实体中,我们将恶意代码写入DTD文件中再通过外部实体引入

  三:漏洞演示

  1.漏洞明析

  在这里在复习一下XXE漏洞是什么

  XXE漏洞就是XML外部实体注入。既然是外部实体注入,那么针对于XXE漏洞肯定就是XML外部实体了。引入外部实体方式有很多种,比如:实体ENTITY不仅能用来储存指定数值,他还能从本地文件或者远程文件中调用相关的数据作为后续实体引用。如外部实体(XMLExternal Entity)就是其中之一。

  下面举两个简单的外部实体攻击例子

  [1].例一.

XXE漏洞快速入门9

  此时c变量读取的值便是/etc/passwd文件的内容

  但这种方式也有问题,就是会涉及到敏感内容,所以还有下面这种攻击方法

  [2].例二

XXE漏洞快速入门10

  该方法通过引入外部的DTD文件,而文件中同样是读取敏感文件的恶意代码,这样被检测的可能性就大大降低

  2.检测漏洞

  这里的漏洞环境我们使用的是pikachu这个靶场的XXE关卡,这个靶场应该都有吧,没有的也可以找我拿,打开该靶场的XXE关卡,如下

XXE漏洞快速入门11

  可以看到是一个输入框,提示可以接收xml数据

  那我们该怎么判断是否存在XXE漏洞呢?其实就是看他是否能够解析XML数据,所以我们直接传入一段XML代码看他能否解析

  我们放入下面这段代码

XXE漏洞快速入门12

  这段代码都能看懂吧,就是给name变量赋了一个test值,把代码放到输入框中,点击提交,结果如下

XXE漏洞快速入门13

  成功提取到test数据,说明有可能存在XXE漏洞

  3.漏洞利用

  上面已经检测数来存在XXE漏洞了,那应该怎么利用呢,很简单,就是利用我们刚才讲到的,外部实体引用可以使用的——协议

  这里也给大家准备了各种语言支持的协议 ,如下

XXE漏洞快速入门14

  [1].直接外部实体注入

  直接外部实体注入,就是通过协议直接执行恶意命令

  因为我是windows主机,这里我们以file协议来读取c:/windows/win.ini配置文件的内容,xml代码如下(注意这里的路径需要改变写法,不然会受到转义的影响)

XXE漏洞快速入门15

  将代码放入输入框提交,结果如下:

XXE漏洞快速入门16

  成功读取

  [2].间接外部实体注入

  这个也比较简单,就会将恶意代码写在DTD文件中,再引入DTD文件,操作如下

  构造外部dtd文件

  打开虚拟机,这里我选择的是kali,进入根目录,创建一个xxx.dtd的文件,内容如下

XXE漏洞快速入门17

  使两台机器可以互相连接

  这里直接打开apache服务就可以达到这个效果了,主要是为了使xml代码能成功引用到kali的dtd文件

XXE漏洞快速入门18

  构造XML代码

  引用外部实体的xml代码如下(192.168..0.107是我的kali的ip地址),这里用参数实体给大家演示一下

XXE漏洞快速入门19

  效果如下,成功读取

XXE漏洞快速入门20

  四:漏洞防范

  针对于XXE漏洞修复其实只有两点:

  禁止使用外部实体,例如libxml disable_entity_loader(true) 。

  过滤用户提交的XML数据,防止出现非法内容。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT
开班信息
北京校区
  • 北京校区
  • 大连校区
  • 广州校区
  • 成都校区
  • 杭州校区
  • 长沙校区
  • 合肥校区
  • 南京校区
  • 上海校区
  • 深圳校区
  • 武汉校区
  • 郑州校区
  • 西安校区
  • 青岛校区
  • 重庆校区
  • 太原校区
  • 沈阳校区
  • 南昌校区
  • 哈尔滨校区