我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【web安全】——XXE漏洞快速入门

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【web安全】——XXE漏洞快速入门

作者名:Demo不是emo 

主页面链接主页传送门
创作初心:一切为了她
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,数据结构

每日emo:该怎么开口呢?今晚天气不错,但还是想你了

目录

 一:初识XXE漏洞

1.XXE简介 

2.XML概念

二:XML语法简析

1.XML基础语法

2.XML实体 

[1].XML的基本结构 

[2].一般实体 

[3].参数实体

[4].预定义实体

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

[6].实例演示

 三:漏洞演示

1.漏洞明析 

[1].例一. 

[2].例二

2.检测漏洞

3.漏洞利用

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

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

四:漏洞防范


1.XXE简介 

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

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

2.XML概念

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

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

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

HTML 被设计用来显示数据。 

1.XML基础语法

先来看一段简单的XML代码

//声明XML解析器版本来解析//根元素,不一定是persontest//子元素,意思就是name变量的值是test20                           //同理

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

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

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

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

那有什么办法能够保存这些带有特殊字符的数据呢?这就是下面我们要讲的实体 

2.XML实体 

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

[1].XML的基本结构 

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

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

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

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

[2].一般实体 

一般实体的声明

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

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

   // 声明XML解析器版本来解析 // 运用实体定义变量的写法 // 即声明一个name变量,值为john      ]>// 引用一般实体的写法,格式为"&实体名称;"      &name;   20

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

[3].参数实体

参数实体的声明

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

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

       // 声明XML解析器版本来解析 // 运用参数实体定义变量的写法 // 即声明一个outer变量,值为John        %outer;                     //参数实体定义的变量必须先在dtd文件中引用]>              // 引用参数实体的写法,格式为"%实体名称;"                  %name;                   20

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

[4].预定义实体

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

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

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

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

[6].实例演示

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

来看一段内部实体的例子

]>&hack3r;

再来看看外部实体

]>&name;

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

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

1.漏洞明析 

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

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

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

[1].例一. 

XML内容:        %d;]>%d;

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

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

[2].例二

XML内容%d;]>&b;Evil.dtd内容

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

2.检测漏洞

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

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

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

我们放入下面这段代码

  ]> &hacker;

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

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

3.漏洞利用

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

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

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

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

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

  ]> &hacker;

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

 成功读取

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

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

1.构造外部dtd文件

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

2.使两台机器可以互相连接

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

3.构造XML代码

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

      %a;]> %a;

 效果如下,成功读取

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

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

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

来源地址:https://blog.csdn.net/qq_63844103/article/details/128060556

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【web安全】——XXE漏洞快速入门

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

网络犯罪分子利用新的安全漏洞的速度有多快?

Skybox安全研究实验室的威胁情报分析师发现,2021年针对已知漏洞新的勒索软件程序增加了42%。该报告揭示了网络犯罪分子利用新的安全弱点的速度,并缩短了企业必须在网络攻击前修复漏洞的窗口。

安全漏洞随着公有云使用量的增加也在快速增长

行业专家表示,但是任何事物都有自己的缺点。值得注意的是,公有云中工作流程的增加可能会增加更多的安全漏洞。

Go 语言快速入门指南:TLS 安全传输层协议

传统环境有丰富的工具和既定的安全最佳实践,但对于云原生应用来说,情况就不一样了,云原生应用往往采取几个小的、往往是短暂的微服务的形式。
Go语言TLS2024-12-01

研究发现网络安全犯罪正朝向利用零日漏洞的方向快速发展

Kroll公司的最新威胁景观报告显示,CVE/零日漏洞利用现在已经占到安全事件案例的26.9%,表明攻击者越来越善于利用漏洞,在某些情况下,甚至在概念验证漏洞出现的同一天就利用了这些漏洞。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录