起因是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