Подтвердить что ты не робот

Блок eval && new Функция

Я просто работаю над написанием случайных головоломок на codewars.com, и мне любопытно, может ли кто-нибудь подумать о способе кода eval после выполнения следующего кода:

eval = function(){};
delete Function.prototype.constructor;
Function = undefined;

// the following are to block require('vm') -- if anyone wants to run this
// in production it may be better to block that one module (others?)
require = undefined;
module.__proto__.require = undefined; // added this due to alexpod answer, modified due to Fabrício Matté :)
module.constructor = undefined; // added this due to alexpod answer

Это находится в node.js, поэтому setTimeout( "string" ) не работает.

4b9b3361

Ответ 1

Ну, у вас есть переменная module в node. Таким образом, вы можете потребовать пакет vm и запустить код с помощью метода require:

var vm = module.require('vm');
vm.runInThisContext(' console.log("hello") ');

UPD Ну, вы обновили вопрос, но мы можем снова взломать его:

var vm = module.constructor.prototype.require('vm');
vm.runInThisContext(' console.log("hello") ');

UPD2 Другой вариант:

var vm = module.constructor._load('vm');
vm.runInThisContext(' console.log("hello") ');

UPD3 Снова условия меняются, поэтому следующий вариант:

module.constructor.prototype._compile(' console.log("again hacked") ');
// or
module.__proto__._compile(' console.log("again hacked") ');
// or
Object.getPrototypeOf(module)._compile(' console.log("again hacked") ');

Я думаю, лучше установить module = undefined, чтобы сделать вопрос более сложным:)

UPD4 Существует еще один вариант без module:)

process.stdin.push(' console.log("here we are") \n ');

Но он работает только в CLI ( "repl" )

UPD5 Также в iojs и в node с версией >= 0.11.x вы можете использовать привязку contextify:

var contextify = process.binding('contextify');
var script = new contextify.ContextifyScript(' console.log("im here, buddy") ');
script.runInThisContext();

В node с версией < 0.11.x вы можете использовать привязку evals:

var evals = process.binding('evals');
var script = new evals.NodeScript(' console.log("here I am") ')
script.runInThisContext();

Ответ 2

module.require = undefined; недостаточно, поскольку require наследуется от прототипа модуля:

module.require = undefined;

var vm = module.__proto__.require('vm');
vm.runInThisContext('console.log(1)');

Вместо этого вы должны:

module.__proto__.require = undefined;
// now this fails and you can't use the __proto__ trick:
var vm = module.require('vm');