Secur1ty just lik3 a girl. B0th of th3m h4ve s0me h0les. Y0u alw4ys try to t0uch the h0le, but n0t 3very tim3 y0u c4n 3xpl0it it!
查看文章 |
Javascript的输入输出,以及二次渲染问题
2009-03-17 19:05
这两天和luoluo在搞javascript的安全编码问题,为的是能够制定出解决DOM XSS的方案和开发规范。luoluo还顺带在这个过程中发现了一个常见htmldecode函数的漏洞。 这两天最大的成果就是:我们应该把javascript看做一个单独的层来处理安全问题。 这一点是以往跨站师们没有认识到或者没有总结出来的,所以导致很多安全问题都没有最终彻底的解决方案。 而把javascript看做是一个“层”后,很多问题就变得很透彻和明朗了。 luoluo 大致总结了这些过程,制定了区分输入和输出的标准 JavaScript的数据输入:
JavaScript 的数据输出:
我画了下面这张图来表述 ![]() 从服务端脚本可以直接输出到 HTML,或者是javascript 输出到 HTML,需要使用的是htmlencode 输出到javascript,则是jsencode (即使用 “\” 转义特殊字符的方式) 对于现代的MVC框架来说,一般都能做到数据分离,比较有代表性的如velocity 上面两种情况类似于: 1. Server2Html <div >$var</div> => <div>&#x;3cscript>alert(1);&#x;3cscript/></div> <input value="$var" /> => <input value="">&#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="\<div onclick\=alert\(1\)\>eeeeeeeee\<\/div\>"; document.write("<div id='x' onclick='test(\""+HtmlEncode(x)+"\");' >dddddddddddddddd</div>"); 看起来貌似对于 x, 即做了 jsencode ,又做了htmlencode,好像安全了,可是其实在test函数中还会再次输出,所以这里XSS还是会执行。怎么用规范去保证上面的方案得以顺利执行就留给看这篇blog的人了。 |
最近读者:


