linx2008IE是怎么处理meta steam的编码的  && 那100+个xss


【起源】

最近hei***放言在各个大网站都存在100+个xss。这是的确存在的,问题出在IE处理meta steam的编码策略上。

【原理】

IE是怎么处理meta steam的呢?我举个demo来说明:

[a.php]

<style src="a.php?file=a.css" charset="gbk"></style>

[a.php?file=a.css]

header:Content-Type: text/html; charset=big5

+/v8

body {

xxx: expressi+AG8AbgAoA-- (window.x==123456)?1:(x=123456) );

}

解释步骤:

1. IE渲染a.php时,遇到载入 <style src="a.php?file=a.css" 的请求,此时IE为a.css定义的编码是default:utf-8。

2. IE解释charset="gbk"时,a.css的编码从default:utf-8转为gbk。

3. IE读取a.php?file=a.css,遇到http头“Content-Type: text/html; charset=big5”时,a.css的编码从gbk转为big5。

4. IE获得a.php?file=a.css输出的正文后,检查头几个字节是fffe还是+/v*——如果是fffe,编码转换为unicode;如果是+/v*,编码转化为utf-7。

5. 如果该steam是由 style标签载入的css文档,就检测@charset标记——如果有,则转化为@charset对应的编码。

【导致的问题】

1.文本存储xss

+/v8

body {

xxx: expressi+AG8AbgAoA-- (window.x==123456)?1:(x=123456) );

}

(打开hi.baidu.com/linx2008/home,然后输入javascript:alert(x);)在heig**blog上也有demo

2.json的"callback"参数(100+个xss的源头)

?asyn=1&callback=【utf-7头】【utf-7数据流】......

【解决方案】


 方法1:对于json的场景,设置header:Content-Type: "json"


方法2:不要让正文输出的第一个符号是"+"。

eg:在数据输出的正文前加个空格or换回;或者过滤"+"开头的参数输出。