起因是HackTM中一道Node.js題(Draw with us),全文沒有一點(diǎn)攻擊性的東西,也不是漏洞詳情
其中有一步黑名單檢查
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。發(fā)現(xiàn)是用arr[["n"]],來繞過黑名單,去瀏覽器里試了下,woc,還真可以

image
上班中午午休的時(shí)候(強(qiáng)調(diào):沒有摸魚)去探究了下為什么,首先在MDN上找到了這樣的描述
請(qǐng)注意,方括號(hào)中的所有鍵都將轉(zhuǎn)換為字符串類型,因?yàn)镴avaScript中的對(duì)象只能使用String類型作為鍵類型。 例如,在上面的代碼中,當(dāng)將鍵obj添加到myObj時(shí),JavaScript將調(diào)用obj.toString()方法,并將此結(jié)果字符串用作新鍵。
(全文完
探究源碼
一般來說是全文完的,但是為了探究其原理,就去調(diào)一下源碼,這里調(diào)的是v8
首先是獲取object屬性

getobjectproperty
38行的LookupIterator::PropertyOrElement傳入了key,跟進(jìn)該函數(shù)

propertyorelement
將key傳入Object::ToName中,繼續(xù)跟進(jìn)

toname
IsName的作用為
/**
* Returns true if this value is a symbol or a string.
*/
bool IsName() const;
所以,不是string類型就會(huì)進(jìn)入ConvertToName

converttoname
調(diào)用了tostring,接下來的獲取值的過程就不繼續(xù)下去了,真·全文完
REF
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects