XML 基础知识 XXE 漏洞原理解析及实验(基础篇)

news2024/12/29 11:20:19

XML 介绍

XXE全称XML外部实体注入,所以在介绍XXE漏洞之前,先来说一说什么是XML以及为什么使用XML进而再介绍一下XML的结构。

XML全称 可拓展标记语言,与HTML相互配合后:

  • HMTL用来显示数据

HTML的焦点在于数据的外观(如何显示数据)

  • XML用来 传输和存储数据

XML的焦点在于数据的内容(如何存储传输数据)

总结来说: HTML提供了一个模板,XML动态的改变模板中对应数据位置中的数据。

为什么要将数据从 HTML 中分离

若要在HTML文档中显示动态的数据,每当数据需要改变的时候需要大量的时间编辑HTML。

通过XML将数据存储在独立的XML文件中,每次需要更新数据时只需通过发出XMLHttpRequest到服务端请求相应的数据(Ajax)即可。

HTML/CSS只需专注于显示与布局即可,底层的数据从XML文件中获取即可,这样修改底层的数据不会对HTML的结构发生任何改变。

XML 的其他优点

  • XML不仅可以用于简化HTML的数据传输于存储中,所有支持XML格式的应用都可以从XML文件中读取文件来使用。
  • 而且XML提供了一种数据的格式标准,所有支持该标准的应用之间都可以用该格式在本地或网络中传输数据。
  • XML可自定义标签, XML是没有预定义标签的。

XML DTD

既然前面说了XML是没有预定义标签的,也就是说无论想定义什么名字的标签都可以,这个标签有什么属性都可以,看似很自由,但在开发中显然是不合适的,而且在数据的传输过程中如果双方的XML结构不同也会出现问题,所以需要一个东西
来约束XML的格式,也就是DTD(文档类型定义)

所以通过DTD有如下优势:

  • 每一个XML文件均可携带一个有关其自身格式的描述,从而规范XML的结构
  • 一个通信过程中,可一致地使用规定的DTD来交换数据
  • 应用程序也可使用规定的DTD来验证从外部接收到的或自身的数据

如何定义 DTD

一般有两种方式:

  • 内部DOCTYPE声明
  • 外部文档声明(!!理解XXE的关键!!)

DTD(文档类型定义)被包装在DOCTYPE声明中 (无论外部还是内部)。

内部 DOCTYPE 声明

利用DOCTYPE声明内部DTD的格式为:

<!DOCTYPE root-element [element-declarations]>

  • root-element文档类型(根元素)

  • [element-declarations]其余的元素都包含在[ ]

    <?xml version="1.0" encoding="utf-8" ?>
        <!ELEMENT to (#PCDATA)>
        <!ELEMENT from (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body (#PCDATA)>
        ]>
    
    XXE LEARING hello My_friend
  • <!DOCTYPE note [规定该文档是 note 类型的文档 (根元素为<note>

对应<note> </note>

  • <!ELEMENT note (to,from,heading,body)>定义note中有四个元素,分别为:

    • <to> </to>
    • <from> </from>
    • <heading> </heading>
    • <body> </body>
  • <!ELEMENT to (#PCDATA)>定义to元素为#PCDATA类型

  • 其他的类似

#PCDATA表示名字里面可以放任意文本 - 这不是我们关注的重点。

外部文档声明( important )

DTD位于XML源文件的外部,则可以通过如下语法将其封装声明在DOCTYPE

<!DOCTYPE root-element SYSTEM "filename">记得该语法,XXE中会用到。

我们将这个外部的DTD文件命名为note.dtd

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

此时若是想在XML文件中声明该DTD约束,应声明为:

<!--xml声明-->
<?xml version="1.0" encoding="utf-8" ?>

<!-- 外部引入 dtd 文件 -->
<!DOCTYPE note SYSTEM "note.dtd">

<!--文档元素-->
<note>
    <to>XXE</to>
    <from>LEARING</from>
    <heading>hello</heading>
    <body>My_friend</body>
</note>

此时便会引入上述note.dtd``DTD约束文件,

而这个引入的文件,就是该漏洞的关键之一。

DTD - 实体

实体是用于定义XML文档中特殊字符的快捷方式,就类似于一个变量或一个宏(宏可能更好理解)。

内部实体

DTD中声明实体,则称为内部实体

<!ENTITY entity-name "entity-value">

  • entity_name是实体的名称,后跟双引号或单引号中的值
  • entity_value保存实体名称的值

同样是上面的例子,还可以定义成这样:

<!--xml声明-->
<?xml version="1.0" encoding="utf-8" ?>

<!--文档类型定义-->
<!DOCTYPE note [
        <!ELEMENT note (#PCDATA)>
        <!ELEMENT to "XXE">
        <!ELEMENT from "LEARING">
        <!ELEMENT heading "hello">
        <!ELEMENT body "my_friend">
        ]>
<!-- 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;) -->
<note>
    &to;
     &from;
     &heading;
     &body;
</note>

在上面的示例中,各个实体名称to``from``heading``body由它们在声明中的值替换。 通过向实体名称添加前缀&来取消引用实体值。

外部实体

如果在DTD之外声明实体,则称为外部实体。

<!ENTITY name SYSTEM "URI/URL">

  • name实体的名称
  • SYSTEM关键字
  • URI/URL是双引号或单引号中包含的外部源的地址

<!ENTITY writer SYSTEM "<http://www.shtwo.com/note.dtd>">

使用的方式与上述例子相同,只不过当前是从外部引入,可以是一个URL链接中的文件,也可以是本地的文件(这也就造成了安全的风险)。

可以使用 系统标识符公共标识符 来引用外部实体:

  • 系统标识符

系统标识符可以指定包含DTD声明的外部文件的位置:它包含关键字SYSTEM和指向文档位置的URI引用

<!DOCTYPE name SYSTEM "note.dtd" [...]>是不是很熟悉

  • 公共标识符

<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Address Example//EN">

XXE - XML 外部实体注入

利用 XXE 外部实体获取文件 - 有回显

通过刚才的介绍,可以明显看出若允许外部文档的声明,那么若请求放的 XML
数据可以被我们控制,就可以在其中加入一个用于包含目标机器本地文件的一个外部文档声明,并回显回来。

但注意,对于 有回显的XXE要满足这样几个条件:

  1. 必须存在使用XML传输数据的情况,且传输的数据我们可以控制;
  2. 通过外部文档声明的外部实体要放在一个可以回显到当前页面中的位置,这样被恶意读取的数据才返回显示给我们。

看了这些可能有点不太理解,下面以Vulnhub打靶过程中,一个环节存在的XXE漏洞为例:

Vulnhub - 打靶示例

当前访问到一个注册的页面,让输入个人信息并进行注册,所以我们打开Burp提交数据进行抓包。

1669440067_6381a2438d124778451ca.png!small?1669440065708

在抓到的 POST 请求包中,可以明显看出当前我们注册填写的信息就是通过 XML 形式提交的,所以满足了上面说的第一个条件:
必须存在使用XML传输数据的情况,且传输的数据我们可以控制。

1669440086_6381a25696adfb44e502c.png!small?1669440084498

且根据不断地尝试,发现无论email处填写什么,都会有is not available的提示,但仔细看,当提交的email不同时,返回的错误提示信息中的邮箱也会变化, 也就是说明我们在<email> </email>中提交的数据会被原封不动的拼接到Sorry, xxxxx is not available!!语句中xxxxx的部分,并返回来,这也就满足了上述说的第二个条件:通过外部文档声明的外部实体要放在一个可以回显到当前页面中的位置,这样才能被看到。

1669440098_6381a262c7dbb684dacc6.png!small?1669440104696

1669440108_6381a26ceae74fc7bf206.png!small?1669440122391

所以此时就可以尝试XXE了:

插入一个外部文档引用的声明,通过SYSTEM读取一个外部的位于Linux主机上的文件,并将引入的文档赋予deu这个实体(这个名字随便起)

<!DOCTYPE foo [<!ENTITY deu SYSTEM 'file:etc/passwd'>]>

并且要在<email> </email>中引用该外部实体deu

<!DOCTYPE foo [<!ENTITY deu SYSTEM 'file:etc/passwd'>]>
<email>
&deu;
</email>

这就完成了一个XML外部实体注入 -XXE

1669440117_6381a275c2c058cae8d14.png!small?1669440122391

什么?还不太理解,那再与XSS对比来说一下XXE的特征

XXE 与 XSS 的异同

  • XSS判断的条件一般是:通过浏览器(表单/变量)提交一个数据到服务器端,服务器端没有做任何变化过滤,就直接将我们输入的数据原封不动的返回到页面中。

XSS的攻击目标大多数是浏览器端

  • XXE判断的条件一般是:和XSS有些类似,也是通过浏览器(表单/变量)提交一个数据到服务器端,服务器端没有做任何变化过滤,就直接将我们要引用的服务器端的资源原封不动的返回到页面中。

XXE攻击的对象是服务器端

portswigger - XXE 靶场 - 1

再以 Burp 官网提供的第一个XXE的题为例:

1669440125_6381a27da799630ec6efd.png!small?1669440123575

网址:https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve- files

流程一致,我们要找到可能存在数据交互的位置,这样才有存在 XXE 的可能,所以一上来先点 Home
试了以下,看看有没有登录的界面,发现并没有,于是随便点开一个商品View details

1669440132_6381a2842d9a4ad1abd1e.png!small?1669440130381

在其中看到了一个Check stock好像是一个提交数据的位置,于是打开Burp进行抓包。

1669440137_6381a2899ebc4cb964d04.png!small?1669440136019

果然是XML数据的格式,这次也懒得在判断在哪个位置可以回显,直接扔进Repeater在每一个XML的标签中都放上我们声明的外部实体,果然会显出了/etc/passwd

1669440142_6381a28ea855df3b3d054.png!small?1669440140641

利用 XXE 外部实体获取文件 - 无回显

直接用实验说明

通过 DNSlog 回显数据

1669440148_6381a29449b51c9759b2b.png!small?1669440146171

可以看到本事的要求是确定 目标服务器是否存在 无回显的XXE

而确认的方式就是通过DNSlog看是否有DNSHTTP请求到来,但处于安全性原因不允许使用自己搭建的或外部的DNSlog服务器,要使用Burp中自带的由官方架设于默认公共服务器上的DNSlog服务器。

其在Burp的位置是:

1669440153_6381a299e0969360c8fb5.png!small?1669440151758

进入后点击Copy to clipboard生成一个子域名,接下来无论是通过DNS查询该子域名 还是通过HTTP范围该域名都会在下面的Poll Collaborator interactions中显示请求。

1669440159_6381a29f4c7e9bdeaae12.png!small?1669440157178

不过首先还是按常规的方式来测试一下XXE

1669440164_6381a2a429a68c57cc918.png!small?1669440162154

按照之前的套路,这次并没有返回/etc/passwd的内容,只是返回了 Invalid product ID的提示,所以此时还不能判断存在XXE漏洞(不能判断我们写的外部文档声明起作用了)。

为了进一步,确认到底是不存在XXE还是只是没有回显,此时将对我们自己定义的外部文档声明中的实体引用改为一个错误的变量名。

<storeID>
&de;
</sroreID>

1669440172_6381a2ac0c67d71ff6265.png!small?1669440170091

此时出现了有关XML解析错误的报错,说明若是XML解析失败是会单独报错的,所以大概率可以确认之前的语句已经被成功执行了,只不过没有回显。

由于没有回显,为了进一步确认到底是否存在 **无回显的XXE**此时将外部文档声明中所引入的外部文件指向各个生成的那个域名。

1669440178_6381a2b2c5df35c225c02.png!small?1669440177083

之后果然在本地看到了目标对 刚刚传入域名的DNS请求与HTTP请求。

1669440184_6381a2b81a660e62dcea9.png!small?1669440182010

利用 XXE 执行 SSRF 攻击

在刚刚基础中,介绍外部实体时,举了一个这样的例子:

<!ENTITY writer SYSTEM "<http://www.shtwo.com/note.dtd>">

不难发现,这后面明显包含的是一个URL,所以若将这部分换为一个内网的IP貌似也没问题喔,所以就有可能造成SSRF

及时我们不知道内网的IP,若存在SSRF也可以通过 在XXE中附加可能的内网IP对内网的资源进行一个探测。

P ortswigger - XXE 靶场 - 2

1669440190_6381a2be6b75d686f7d7e.png!small?1669440188333

网址:https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-perform- ssrf

该靶场只能说非常的贴心啊 … 连存在敏感信息的IP都给我们了。

那就直接开始吧,首先还是要找存在XML信息交互的位置,该题遇上一道的位置相同,所以就略过了,直接写入外部文档声明

<!DOCTYPE foo [<!ENTITY deu SYSTEM "<http://169.254.169.254>">]>

1669440194_6381a2c2f3038aba444cb.png!small?1669440192980

得到了一个目录,再继续向下遍历:

1669440200_6381a2c85fefc860e8432.png!small?1669440198345

最终成功获得到敏感信息:

1669440205_6381a2cdccaf2d482a818.png!small?1669440203803

由于最难的一步找到要攻击目标这一步被直接告诉了,所以很简单就找到了敏感的信息。

防御方式

  • 禁用外部实体(大多数都采用该方法)

PHP

    libxml_disable_entity_loader(true);
  • 黑名单过滤(不安全)

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双网卡(有线和wifi)同时连接内网和外网

双网卡&#xff08;有线和wifi&#xff09;同时连接内网和外网 Win10技巧&#xff1a;如何修改有线/WiFi网络优先级&#xff1a;https://www.ithome.com/html/win10/253612.htm双网卡实现两个网络的自由访问&#xff1a;https://blog.51cto.com/ghostlan/1299090Linux服务器安…

【Linux】网络编程 - 基础概念

目录 一.OSI七层模型vsTCP/IP五层模型 1.一些周边概念 2.OSI七层模型 3.TCP/IP五层模型 4.网络传输流程图 二.什么是MAC地址 三.什么是IP/IP地址 1.什么是IP 2.什么是IP地址 四.什么是端口号 一.OSI七层模型vsTCP/IP五层模型 1.一些周边概念 局域网vs广域网 网络互…

LeetCode——2341. 数组能形成多少数对

一、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、…

亚马逊云科技重磅发布《亚马逊云科技汽车行业解决方案》

当今&#xff0c;随着万物智联、云计算等领域的高速发展&#xff0c;创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径&#xff0c;推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。挑战无处不在&#xff0c;如何抢先预判&#xff1f;随着近年来…

31-Golang中的二维数组

二维数组的使用方式 使用方式一&#xff1a;先声明/定义再赋值 1.语法&#xff1a;var数组名 [大小] [大小]类型2.比如&#xff1a;var arr [2] [3]int,再赋值 package main import ("fmt" )func main() {//定义/声明数组var arr [4][6]int//赋初值arr[1][2] 1ar…

volatile,内存屏障

volatile的特性可见性: 对于其他线程是可见,假设线程1修改了volatile修饰的变量,那么线程2是可见的,并且是线程安全的重排序: 由于CPU执行的时候,指令在后面的会先执行,在指令层级的时候我们晓得volatile的特性后,我们就要去volatile是如何实现的,这个很重要&#xff01;&#…

金三银四面试必备的软件测试八股文,看完拿捏面试官

1、问&#xff1a;你在测试中发现了一个 bug&#xff0c;但是开发经理认为这不是一个 bug&#xff0c;你应该怎样解决&#xff1f;首先&#xff0c;将问题提交到缺陷管理库里面进行备案。然后&#xff0c;要获取判断的依据和标准&#xff1a; 根据需求说明书、产品说明、设计文…

蓝屏怎么办电脑蓝屏怎么办?蓝屏问题详细分析

蓝屏怎么办电脑蓝屏怎么办&#xff1f;最近很多小伙伴在咨询这个问题&#xff0c;其实电脑蓝屏了进不去&#xff0c;我们可以重新启动电脑&#xff0c;如果进入系统后还是直接蓝屏&#xff0c;那么你可以尝试一下&#xff0c;关机重启&#xff0c;然后在进入系统的时候&#xf…

路肩石水渠机在施工公路项目中工艺特点的匹配

新建公路路肩项目在目前公路项目中的技术手段和实现方式,大多数依靠机械设备来机械来进行,还有一部分通过人工传统的预制作业和安装模式来进行,两种工艺特点的对比来说对于补充完善建设手段和效果实现有很重要的意义. 其中采用了机械设备进行一次成型制作的过程,按照设计需求匹…

useRef 几种使用场景

图修改自 dev.to Demystifying React Hooks: useRef useRef神奇的地方除了可以在不重新渲染的状态下更有价值,也可以直接获取D加粗样式OM 进入而控制DOM的行为 Ref 有什么用? useRef返回一个可变的 ref 对象,其 .current 属性被初始化为传递的参数 ( initialValue)。返回…

常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件

常用vim命令和vim基本使用及Linux用户的管理&#xff0c;用户和组相关文件1. vim 的基本介绍和使用1.1 vim的三种模式1.2 常用vim命令【小白】1.3 Vim键盘图&#xff1a;2. Linux用户管理2.1 添加用户2.2 删除用户2.3 修改账号3. Linux系统用户组的管理4. 用户和组相关文件4.1 …

RuoYi-Vue部署(Nginx+Tomcat)

环境搭建RuoYi-Vue搭建、Linux安装Nginx、Linux安装JDK8、Linux安装MySql8、Linux安装Redis、Linux安装Tomcat9前端打包 1.ruoyi-ui鼠标右键-->打开于终端2.安装依赖&#xff1a;npm install --registryhttps://registry.npm.taobao.org-->node_modules3.编译打包&#x…

中国天气——西风带环流和寒潮

中国天气——西风带环流和寒潮 一. 西风环流概述 1. 概念 西风带&#xff1a;中高纬度地区平均水平环流在对流层盛行西风&#xff0c;称之为西风带西风带波动&#xff1a;西风带围绕极涡沿纬圈运动&#xff0c;平均而言表现为冬季三槽三脊&#xff0c;夏季四槽四脊&#xff…

盘点八个简单易上手的前端低代码框架项目

低代码近年来做为前端市场上火爆到不行的项目&#xff0c;其热度也是长久不衰&#xff0c;本文就为大家盘点了8个简单易上手的前端低代码框架项目&#xff0c;并各自都附上了体验链接&#xff0c;欢迎大家前往体验哦&#xff5e;&#xff5e;&#xff5e;&#xff5e; 1. Appsm…

elementUI-plus虚拟表el-table-v2 checkbox删除后,下一个复选框又被选中且无法删除

虚拟表种设置了checkbox&#xff0c;但是删除时&#xff0c;发现删除后&#xff0c;下一个checkbox自动被选中&#xff0c;且删除时&#xff0c;报错找不到id没有设置row-key每行的 key 值&#xff0c;如果不提供&#xff0c;将使用索引 index 代替2.row-key值设置成什么值&…

openwrt开发板与ubuntu nfs挂载

1.ubuntu需要安装nfs服务 sudo apt-get install nfs-common nfs-kernel-server2.修改 /etc/exports文件&#xff1a; /home/test *(rw,nohide,insecure,no_subtree_check,async,no_root_squash) 前面是挂载的目录&#xff0c;后边是相应权限 rw&#xff1a;读写 insecure&am…

Is ChatGPT a general-purpose natural language processing task solver?

声明&#xff1a;平时看些文章做些笔记分享出来&#xff0c;文章中难免存在错误的地方&#xff0c;还望大家海涵。搜集一些资料&#xff0c;方便查阅学习&#xff1a;http://yqli.tech/page/speech.html。语音合成领域论文列表请访问http://yqli.tech/page/tts_paper.html&…

Android常用9种自动化测试框架对比,Appium有哪些优势?

随着移动终端的普及&#xff0c;手机应用越来越多&#xff0c;也越来越重要。 App的回归测试用例数量也越来越多&#xff0c;全量回归也越来越消耗时间。移动 APP自动化测试 的难点移动 APP的UI自动化测试长久以来一直是一个难点&#xff0c;难点在于UI的”变”, 变化导致自动化…

【数据结构】动态顺序表的接口实现(附图解和源码)

动态顺序表的接口实现&#xff08;附图解和源码&#xff09; 文章目录动态顺序表的接口实现&#xff08;附图解和源码&#xff09;前言一、定义结构体二、每一个接口的实现原理&#xff08;附图解&#xff09;1.初始化顺序表2.增容顺序表3.尾插数据4.删除顺序表信息&#xff08…

git rebase 和 git merge,实际工作使用

概述 git rebase是用来处理git merge命令所处理的同样的问题。 这两个命令都用于把一个分支的变更整合进另一个分支——只不过他们达成同样目的的方式不同。 场景&#xff0c;你在feature分支上开&#xff0c;另一位团队成员更新了main分支。这将会造成一个分叉的提交历史&am…