XSS攻击向量


无防护的XSS测试

XSS定位器(Polygot)

以下是“ polygot测试XSS有效负载”。该测试将在多个上下文中执行,包括html,脚本字符串,js和url。

javascript:/*-->

使用JavaScript指令的图像XSS

(IE7.0在图像上下文中不支持JavaScript指令,但在其他上下文中支持JavaScript指令,但是以下内容也显示了在其他标记中也适用的原理:

"javascript:alert('XSS');">

没有引号,也没有分号

'XSS')>

不区分大小写的XSS攻击

'XSS')>

HTML实体要使用此功能,必须使用分号:

严重混淆

如果需要同时使用双引号和单引号,则可以使用重注释来封装JavaScript字符串-这也很有用,因为许多跨站点脚本过滤器都不知道注释:

"RSnake says, 'XSS'")`>

格式错误的A标签

\"alert(document.cookie)"\>xxs link\

IMG标签格式错误

""">"\>

从字符代码如果不允许任何形式的引号,则可以在JavaScript中eval()一个fromCharCode来创建所需的任何XSS向量:

88,83,83))>

默认SRC标记可获取过去检查SRC域的过滤器这将绕过大多数SRC域过滤器。在事件方法中插入javascript还将适用于使用诸如Form,Iframe,Input,Embed等元素的任何HTML标记类型注入。它还将允许替换所有与标记类型相关的事件,例如onblur,onclick

"alert('xxs')">

保留默认的SRC标签为空

"alert('xxs')">

通过完全省略默认SRC标签

"alert('xxs')">

错误提示时

"alert(String.fromCharCode(88,83,83))">

IMG onerror和JavaScript警报编码

"javascript:alert('XSS')">

十进制HTML字符引用

106;avascript:alert('XSS')>

十进制HTML字符引用,不带分号这在尝试查找“&#XX;”的XSS中通常很有效,因为大多数人都不知道填充-最多7个数字字符。这对于使用$ tmp_string =?s /.*\&#(\ d +);。* / $ 1 /;等字符串进行解码的人也很有用。这错误地假设终止HTML编码的字符串需要使用分号:

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

十六进制HTML字符引用,不带分号这也是对上述字符串$ tmp_string =?s /.*\&#(\ d +);。* / $ 1 /;的可行的XSS攻击。假设井号后面有一个数字字符-十六进制HTML字符则不正确)。

嵌入式标签用于跨站脚本攻击:

"jav  ascript:alert('XSS');">

嵌入式编码标签使用这个来分解XSS:

"jav	ascript:alert('XSS');">

嵌入式换行符分解XSS

"jav
ascript:alert('XSS');">

嵌入式托架返回将分解XSS

"jav
ascript:alert('XSS');">

Null分解JavaScript指令Null字符也可以用作XSS向量,但与上面不同,你需要使用Burp Proxy之类的东西直接注入它们,或者在URL字符串中使用%00,或者如果您想编写自己的注入工具,则可以使用vim(^ V ^ @将产生一个null)或以下程序将其生成为文本文件。好的,我再次撒谎,旧版本的Opera(在Windows上大约为7.11)容易受到另一个char 173(软hypen控制char)的攻击。但是null char%00更为有用,它帮助我绕过了某些真实世界的过滤器,并带有以下示例:

perl -e 'print "";' > out

XSS图像中JavaScript之前的空格和元字符如果模式匹配未考虑javascript单词中的空格,这将非常有用:-正确,因为它不会呈现-并做出错误的假设,即引号和javascript之间不能有空格:关键词。实际情况是,您可以使用1-32的任何十进制字符:

"   javascript:alert('XSS');">

非字母非数字XSSFirefox HTML解析器假定在HTML关键字之后非字母非数字无效,因此将其视为HTML标记后的空格或无效令牌。问题在于,某些XSS过滤器假定它们要查找的标签已被空格分隔。例如\ != \

但是,基于与上述相同的思想,使用Rnake模糊器对其进行了扩展。Gecko渲染引擎允许在事件处理程序和等号之间使用除字母,数字或封装字符(例如引号,尖括号等)之外的任何字符,从而更容易绕过跨站点脚本块。请注意,这也适用于字符,如下所示:

"XSS")>

IE和Gecko渲染引擎之间的行为略有不同,该行为仅允许标记和参数之间的斜线之间没有空格。如果系统不允许空格,这可能很有用。


多余的开放式括号由Franz Sedlmaier提交的XSS向量可以通过首先使用匹配的成对的开和关尖括号,然后通过对内部标签进行比较来击败某些工作正常的检测引擎,而不是像Boyer-Moore这样更有效的算法来寻找 尖括号和相关标签的完整字符串匹配(当然是去混淆后)。双斜杠注释掉末尾的多余括号,以阻止JavaScript错误:

<


没有结束脚本标签在Firefox和Netscape 8.1中,在Gecko渲染引擎模式下,您实际上不需要此跨站点脚本矢量的\> 部分。Firefox认为可以安全地关闭HTML标记并为您添加结束标记。考虑周全!与不影响Firefox的下一个不同,下一个不需要任何其他HTML。您可以根据需要添加引号,但通常不需要,尽管请注意,但我不知道一旦注入,HTML最终将变成什么样子:


脚本标签中的协议解析这个特殊的变体由?ukaszPilorz提交,部分基于以下Ozh的协议解析绕行。如果在末尾添加标记,则此跨站点脚本示例可在IE,IE呈现模式下的Netscape和Opera中运行。但是,这在空间有限的情况下尤其有用,当然,域越短越好。不管编码类型如何,“。j”都是有效的,因为浏览器在SCRIPT标记的上下文中知道它。


半开式HTML / JavaScript XSS向量与Firefox不同,IE渲染引擎不会向您的页面添加额外的数据,但可以在图像中使用javascript:指令。用作向量非常有用,因为它不需要尖括号。假设您在下面注入了任何HTML标记,您将在其中注入此跨站点脚本矢量。即使没有关闭“>”标签,它下面的标签也会将其关闭。注意:这确实弄乱了HTML,具体取决于它下面的HTML。它绕过以下NIDS正则表达式/((\\%3D)|(=))\[^\\n\]\*((\\%3C)|\<)\[^\\n\]+((\\%3E)|\>)/因为它不需要以“>”结尾。附带说明一下,这对我使用开放式

`('XSS')"


双开角支架在向量的末尾使用开括号而不是闭括号会导致Netscape Gecko渲染中的不同行为。没有它,Firefox将可以运行,但Netscape不能:


转义JavaScript转义编写应用程序以在JavaScript内输出一些用户信息时,如下所示:

结束标题标签这是关闭标记的简单XSS向量,可以封装恶意跨站点脚本攻击:</p> <pre class="code-snippet__js" data-lang="xml"><code><span class="code-snippet_outer">

输入图像

BODY image

IMG Dynsrc

IMG lowsrc

列表样式图像涉及为项目符号列表嵌入图像的深奥问题。由于JavaScript指令,这仅在IE呈现引擎中有效。不是一个特别有用的跨站点脚本编制载体:

  • XSS

图片中的VBscript

Livescript(仅旧版本的Netscape)

SVG对象标签

ECMAScript 6

Set.constructor`alert\x28document.domain\x29```

body标签方法不需要使用任何javascript变体:或 ...即可完成XSS攻击)。丹·克劳利(Dan Crowley)还指出,您可以在等号前放置一个空格(onload =!= onload =):

事件处理程序

它可以用于与上述类似的XSS攻击(在撰写本文时,这是网络上最全面的列表)。感谢Rene Ledosquet的HTML + TIME更新。

Dottoro Web参考还提供了JavaScript中的事件列表。