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