Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1175469
  • 博文数量: 272
  • 博客积分: 3899
  • 博客等级: 中校
  • 技术积分: 4734
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-15 14:53
文章分类

全部博文(272)

文章存档

2012年(272)

分类: 网络与安全

2012-06-26 13:28:04

这两天和luoluo在搞javascript的安全编码问题,为的是能够制定出解决DOM XSS的方案和开发规范。luoluo还顺带在这个过程中发现了一个常见htmldecode函数的漏洞

这两天最大的成果就是:我们应该把javascript看做一个单独的层来处理安全问题。

这一点是以往跨站师们没有认识到或者没有总结出来的,所以导致很多安全问题都没有最终彻底的解决方案。

而把javascript看做是一个后,很多问题就变得很透彻和明朗了。

luoluo
大致总结了这些过程,制定了区分输入和输出的标准

JavaScript的数据输入:

服务器端动态混合JS代码输出

页面的URL

AJAX

JSON

上一层的JS代码动态混合JS代码输出

读取cookie

由上述的各种输入方式获取的数据拼接、截取形成的数据

JavaScript 的数据输出:

通过document.write(ln)方式写入页面的输出流

调用dom方法和属性输出到dom

通过指定location属性或者window.open方式作为导致新的url请求

输出到JavaScript脚本形成下一层JS执行

写入cookie


我画了下面这张图来表述

 

从服务端脚本可以直接输出到 HTML,或者是javascript

输出到 HTML,需要使用的是htmlencode

输出到javascript,则是jsencode (即使用 “\” 转义特殊字符的方式)

对于现代的MVC框架来说,一般都能做到数据分离,比较有代表性的如velocity

上面两种情况类似于:
1. Server2Html 

$var
=>
&#x;3cscript>alert(1);&#x;3cscript/>


=>


2. Server2JS
var x='$var'; => var x='\'alert\(\/try to xss\/\)\;';

错误的写法: var x=$var;


3. Server2HtmlEvent
或者是Server2Html2JS
这种情况需要先进行htmldecode,再jsencode

我在htmlencode 二三事的最后举过一个例子,但是这个例子实际上是错误的。因为它就是这种情况。

修正方法就不在这里说了

4. JS2HTML
这种情况比较复杂,我们把他看做一个js渲染到html的过程。
主要由 document.write(), document.writeln()DOM节点的innerHTML 来完成这个过程

但是html里又可以通过script标签或者是事件包含js,所以情况相对较复杂。

4.1 JS2HtmlEvent
htmldecode, jsencode, htmlencode

4.2 JS2HtmlAttribute
htmldecode, htmlencode

4.3 JS2Html2JS
jsencode


上面的类型比较复杂,实现防御方案的思想基本是这样。

但是思想虽然有了,还是需要规范来保证的。

参考以下例子
function test(dd){
    var ddd=document.createElement("div");
    ddd.innerHTML = dd;
    document.body.appendChild(ddd);    
};

var x="\
eeeeeeeee\<\/div\>";

document.write("
dddddddddddddddd
");

看起来貌似对于 x 即做了 jsencode ,又做了htmlencode,好像安全了,可是其实在test函数中还会再次输出,所以这里XSS还是会执行。怎么用规范去保证上面的方案得以顺利执行就留给看这篇blog的人了。

阅读(1801) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~