網(wǎng)絡(luò)安全是個(gè)大雜燴妻怎,啥都要接觸糙置,特別是滲透。這道題學(xué)到東西比較多鹰晨。
1.nodejs 項(xiàng)目依賴(lài)下載 npm install --save xxx@version
2.nodejs 運(yùn)行: node xxx.js
3.(function myTag(y){return ""[!y?"__proto__":"constructor"][y]})("constructor")("console.log(process.env)")()
簡(jiǎn)化(function f(y) {})()绿淋,function f(y) {}定義函數(shù)闷畸,(function f(y) {})為函數(shù)表達(dá)式(與函數(shù)聲明效果類(lèi)似) ,最后加()吞滞,調(diào)用函數(shù)表達(dá)式中定義的函數(shù)佑菩。
函數(shù)體{return ""[!y?"__proto__":"constructor"][y]} ""剛開(kāi)始以為是"轉(zhuǎn)義,后面看文章才發(fā)現(xiàn)是空字符裁赠,與"string"效果一致殿漠,轉(zhuǎn)為string object。
[!y?"__proto__":"constructor"],當(dāng)function myTag(y) 參數(shù)時(shí)组贺,為["constructor"].否則是["__proto__"]凸舵。效果為 {return StringObject["construct"][y]} 返回object對(duì)應(yīng)的construct(構(gòu)造函數(shù))==return string.construct.y
{return ""[!y?"__proto__":"constructor"][y]})("constructor")=string.construct.construct,構(gòu)造函數(shù)實(shí)例化失尖,返回ConstructFunction object啊奄。
最后 string.construct.construct("console.log(process.env)") = new string("console.log(process.env)"),使用 "console.log(process.env)"來(lái)構(gòu)造string掀潮。
string.split為function object (class)菇夸,spring.split.construct返回function object instance。
這道題還有另外一個(gè)漏洞CVE-2021-23334
"(function (x) { return `${eval(\"throw new Error(global.process.mainModule.constructor._load('child_process').execSync('ls ').toString())\")}` })()"
``為typescript template string ``之外及之內(nèi)都為typescript仪吧。