Twitter在不久前曾经爆了一个XSS,悲剧的是,程序员的patch方案有问题,结果再次被爆菊了。 详细的分析可以看 html " target=_blank> http://blog.mindedsecurity测试数据/2010/09/twitter-domxss-wrong-fix-and-something.html 我们姑且不去说这个patch方案中其他的问题,我们关注下javascript中replace()的使用。 当时twitter的程序员是这样patch的: var c = location.href.split("#!")[1]; if (c) { window.location = c.replace(":", ""); } else { return true; } 但是,javascript有个非常要命的地方,replace()函数的第一个参数,按照规范中的方式,是要用正则写的。如果第一个参数是一个字符串,怎么办? javascript默认只会替换掉他找到的第一个字符 这和很多其他语言都是不同的! 所以,twitter第二次被爆菊的POC里,使用两个:就绕过了这条patch http://twitter测试数据/#!javascript::alert(document.domain); Gareth Heyes为此写了一篇blog讲这个问题 http://HdhCmsTestthespanner.co.uk/2010/09/27/string-replace-javascript-bad-design/ 这是一个很细节的问题,很多程序员都会用错。 我review了一些国内大站的几个主要页面,发现qq、百度等暂时都未发现此问题,在下面几个站点发现了一些用错的情况(当然也可能是程序员心里明白,故意这样用): 优酷: common.js: window.nova_init_hook_initsearch = function() {
150 var fullPath = document.location.pathname.replace(_,/);
151 var path = fullPath.split(/);
152 var module=index;
153 if(path[1]){module=path[1];} 丁香园: function clicksum(objs, placeId){
468 var xhttp = getXmlhttp();
469 for (var i = 0; i < objs.length; i++) {
470 var obj = objs[i];
471 obj.onclick=function() {
472 if (this.href.indexOf("http://")==-1 || this.innerHTML.length == 0) return true;
473 var href = this.href.replace(":", "%3A").replaceAll("/","%2F").replace("#","%23");
474 var innerHTML = encodeURIComponent(this.innerHTML); 搜狐: adm2008.js: function _SoAD_DoFSCommand(a, b) { var c = null; if (a && (eval("typeof(_SoAD_" + a + ")") != "function")) { return; } if (_SoAD_DoFSCommand.caller) { c = _SoAD_DoFSCommand.caller.toString(); c = c.substring(9, c.indexOf("(")).replace("_DoFSCommand", ""); //hide suggestion div
1152 function Wb()
1153 {
1154 var hh= sug$(sugmaindivname);
1155 if(hh&&hh.style){
1156 hh.style.display="none";
1157 if (sug$(suggimg2))
1158 sug$(suggimg2).src = sug$(suggimg2).src.replace(up, down);
不过,并非是用错了就一定会产生安全问题,但是很可能会产生些不可预知的后果,俗称就是bug。 那什么情况下会产生安全问题呢?当replace是用于安全过滤的时候。 我在google codesearch上找到了很多这种例子: http://HdhCmsTestgoogle测试数据/codesearch?hl=en&lr=&q=lang%3Ajavascript+%22.replace%28%27%3Cscript%22&sbtn=Search 改变搜索条件还可以搜到更多,比如 lang:javascript ".replace(" lang:javascript ".replace(javascript" 等等 所以,要安全的在javascript中使用replace函数,最好还是要使用正则: .replace(//, ) 单个 .replace(//g, ) 全局 第一个参数使用字符串,是一个很不好的习惯,虽然我们经常犯 :D查看更多关于一个replace()引发的血案 - 网站安全 - 自学php的详细内容...