Node.js中GetObjectProperty的一个小trick

起因是HackTM中一道Node.js题(Draw with us),全文没有一点攻击性的东西,也不是漏洞详情

其中有一步黑名单检查

function checkRights(arr) {
  let blacklist = ["p", "n", "port"];
  for (let i = 0; i < arr.length; i++) {
    const element = arr[i];
    if (blacklist.includes(element)) {
      return false;
    }
  }
  return true;
}

而最终需要的object中必须要有n,试了好久没成功,5am3师傅直接把题秒了,tql。发现是用arr[["n"]],来绕过黑名单,去浏览器里试了下,woc,还真可以

image

上班中午午休的时候(强调:没有摸鱼)去探究了下为什么,首先在MDN上找到了这样的描述

请注意,方括号中的所有键都将转换为字符串类型,因为JavaScript中的对象只能使用String类型作为键类型。 例如,在上面的代码中,当将键obj添加到myObj时,JavaScript将调用obj.toString()方法,并将此结果字符串用作新键。

(全文完

探究源码

一般来说是全文完的,但是为了探究其原理,就去调一下源码,这里调的是v8

首先是获取object属性

getobjectproperty

38行的LookupIterator::PropertyOrElement传入了key,跟进该函数

propertyorelement

将key传入Object::ToName中,继续跟进

toname

IsName的作用为

  /**
   * Returns true if this value is a symbol or a string.
   */
  bool IsName() const;

所以,不是string类型就会进入ConvertToName

converttoname

调用了tostring,接下来的获取值的过程就不继续下去了,真·全文完

REF

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects

https://github.com/v8/v8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文纯属原创? 如有雷同? 纯属抄袭? 不甚荣幸! 欢迎转载! 原文收录在【我的GitHub博客】,觉得本文...
    微醺岁月阅读 2,160评论 2 11
  • 概述 JavaScript 原生提供Object对象。JavaScript 的所有其他对象都继承自Object对象...
    oWSQo阅读 288评论 0 1
  • (以下内容,参考自阮一峰es5) console.log(对象)时,页面弹出的就是[object,Object] ...
    黑色的五叶草阅读 243评论 0 0
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,961评论 0 5
  • 1、浏览器内核-2、css与js引入方式 1、浏览器内核 我们把浏览器中识别代码绘制页面的东西称之为浏览器的内核或...
    萌妹撒阅读 858评论 0 1

友情链接更多精彩内容