网络安全是个大杂烩,啥都要接触,特别是渗透。这道题学到东西比较多。
1.nodejs 项目依赖下载 npm install --save xxx@version
2.nodejs 运行: node xxx.js
3.(function myTag(y){return ""[!y?"__proto__":"constructor"][y]})("constructor")("console.log(process.env)")()
简化(function f(y) {})(),function f(y) {}定义函数,(function f(y) {})为函数表达式(与函数声明效果类似) ,最后加(),调用函数表达式中定义的函数。
函数体{return ""[!y?"__proto__":"constructor"][y]} ""刚开始以为是"转义,后面看文章才发现是空字符,与"string"效果一致,转为string object。
[!y?"__proto__":"constructor"],当function myTag(y) 参数时,为["constructor"].否则是["__proto__"]。效果为 {return StringObject["construct"][y]} 返回object对应的construct(构造函数)==return string.construct.y
{return ""[!y?"__proto__":"constructor"][y]})("constructor")=string.construct.construct,构造函数实例化,返回ConstructFunction object。
最后 string.construct.construct("console.log(process.env)") = new string("console.log(process.env)"),使用 "console.log(process.env)"来构造string。
string.split为function object (class),spring.split.construct返回function object instance。
这道题还有另外一个漏洞CVE-2021-23334
"(function (x) { return `${eval(\"throw new Error(global.process.mainModule.constructor._load('child_process').execSync('ls ').toString())\")}` })()"
``为typescript template string ``之外及之内都为typescript。