Skip to content

闭包代码的提权漏洞

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];
      }
    }
  }
})();