网站地图    收藏   

主页 > 后端 > 网站安全 >

一个replace()引发的血案 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-17 15:08 作者: 阅读:

[导读] Twitter在不久前曾经爆了一个XSS,悲剧的是,程序员的patch方案有问题,结果再次被爆菊了。详细的分析可以看http://blog.mindedsecurity.com/2010/09/twitter-domxss-wrong-fix-and-something.html我们姑且不去...

Twitter在不久前曾经爆了一个XSS,悲剧的是,程序员的patch方案有问题,结果再次被爆菊了。

详细的分析可以看
html" target=_blank>http://blog.mindedsecurity.com/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.com/#!javascript::alert(document.domain);

Gareth Heyes为此写了一篇blog讲这个问题

http://www.thespanner.co.uk/2010/09/27/string-replace-javascript-bad-design/

这是一个很细节的问题,很多程序员都会用错。

我review了一些国内大站的几个主要页面,发现qq、百度等暂时都未发现此问题,在下面几个站点发现了一些用错的情况(当然也可能是程序员心里明白,故意这样用):

优酷:
common.js:
window.nova_init_hook_initsearch = function() { 不过,并非是用错了就一定会产生安全问题,但是很可能会产生些不可预知的后果,俗称就是bug。

那什么情况下会产生安全问题呢?当replace是用于安全过滤的时候。

我在google codesearch上找到了很多这种例子:

http://www.google.com/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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论