查看文章
 
Javascript的输入输出,以及二次渲染问题
2009-03-17 19:05
这两天和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
<div >$var</div> => <div>&#x;3cscript&#x3e;alert&#x28;1&#x29;;&#x;3cscript&#x2f;&#x3e;</div>

<input value="$var" /> => <input value="&#x22;&#x3e;&#x;3cscript&#x3e;alert&#x28;1&#x29;;&#x;3cscript&#x2f;&#x3e;&#x3c;&#x22;" />


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="\<div onclick\=alert\(1\)\>eeeeeeeee\<\/div\>";

document.write("<div id='x' onclick='test(\""+HtmlEncode(x)+"\");' >dddddddddddddddd</div>");

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

类别:象牙塔||添加到搜藏 |分享到i贴吧|浏览(4136)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu