闭包代码的提权漏洞
Code
ts
var o = (function() {
var obj = {
a: 1,
b: 2,
};
return {
get: function (k) {
return obj[k];
}
}
})();
// 如何在不改变上面代码的情况下
// 修改 obj 对象
解析
ts
// obj.valueOf() // 可以获取 { a: 1, b: 2 }
// o.get('valueOf')() // 这个会报错,由于不能正确获取this指向
// 给原型增加一个指向
Object.defineProperty(Object.prototype, 'hack', {
get() {
return this;
}
});
const obj = o.get('hack');
obj.c = 'aaaaa';
console.log('obj.c', o.get('c'))
防御
ts
var o = (function() {
var obj = {
a: 1,
b: 2,
};
// 设置没有原型,不让攻击
Object.setPrototypeOf(obj, null);
return {
get: function (k) {
if (obj.hasOwnProperty(k)) {
return obj[k];
}
}
}
})();