Size: a a a

2020 May 31

S

Snusmumriken in pro.lua
Alexander Berezin
кстати, _G = {} и _ENV = {} не работает
Я тебе только что дал такой рецепт, который ещё и не сломает тебе ничего если юзер попробует что-то грязное мутить, и его изменения не отразятся ни на чём после исполнения его куска.
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
Я тебе только что дал такой рецепт, который ещё и не сломает тебе ничего если юзер попробует что-то грязное мутить, и его изменения не отразятся ни на чём после исполнения его куска.
Спасибо, сохраню сейчас покурю, пока что в луа плохо разбираюсь.
Мне как раз нужно оставить юзеру возможность print всяких.
Правда, в do-end не смогу код поместить, т.к. у меня вызов кода идёт через php, последовательно выполняется сначала код песочницы, затем уже пользовательский код
источник

S

Snusmumriken in pro.lua
Alexander Berezin
Спасибо, сохраню сейчас покурю, пока что в луа плохо разбираюсь.
Мне как раз нужно оставить юзеру возможность print всяких.
Правда, в do-end не смогу код поместить, т.к. у меня вызов кода идёт через php, последовательно выполняется сначала код песочницы, затем уже пользовательский код
Мммм.
источник

S

Snusmumriken in pro.lua
Alexander Berezin
Спасибо, сохраню сейчас покурю, пока что в луа плохо разбираюсь.
Мне как раз нужно оставить юзеру возможность print всяких.
Правда, в do-end не смогу код поместить, т.к. у меня вызов кода идёт через php, последовательно выполняется сначала код песочницы, затем уже пользовательский код
&sandboxcode = <<<EOD
...
do
 local _ENV = userenv
 loadstring[====[$usercode]====]()
end
EOD;

Потом эвалишь это дело.
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
&sandboxcode = <<<EOD
...
do
 local _ENV = userenv
 loadstring[====[$usercode]====]()
end
EOD;

Потом эвалишь это дело.
А, да, спасибо 😅👍
источник

S

Snusmumriken in pro.lua
Не забудь добавить к пользовательскому коду что-то типа такого:
usercode = replace(usercode, "\r?\nEOD", "\r\n EOD"), чтобы не допустить инъекций. Простого пробела достаточно, пых уже не сломается и даст по жопе нехорошему человеку.
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
Не забудь добавить к пользовательскому коду что-то типа такого:
usercode = replace(usercode, "\r?\nEOD", "\r\n EOD"), чтобы не допустить инъекций. Простого пробела достаточно, пых уже не сломается и даст по жопе нехорошему человеку.
А, так пых и не должен ломаться в любом случае 🤔
источник

S

Snusmumriken in pro.lua
Если он сгенерит строку sandboxcode где внутри $usercode будет текст "EOD; db("DROP TABLE Students;");" что оно скажет?
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
Если он сгенерит строку sandboxcode где внутри $usercode будет текст "EOD; db("DROP TABLE Students;");" что оно скажет?
пых сначала читает блок EOD полностью, а затем уже заполняет его переменными
источник

S

Snusmumriken in pro.lua
Тогда ок, я видел где-то похожую уязвимость
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
Карочи, что ты такой делаешь.

1. Создаёшь табличку и пихаешь туда всё разрешённое:
local userenv = {
 print = print,
 table = {
   concat = table.concat,
   insert = table.insert,
   ...
 },
 string = string
 os = { -- допустим, разрешаем часть os-либы
   time = os.time,
 },
 ...
}
-- делаем похожим на _G
userenv._G = userenv

2. Потом делаешь особое пространство, в котором будет пользовательский код:

do -- скоуп для юзерспейса
 local _ENV = userenv -- переключаешь _ENV для этого скоупа
 loadstring(usercode)() -- исполняем код
end
-- на этой точке _G уже обратно то _G которое было ранее. Все пользовательские объявления глобалов и переопределения не играют роли, ибо остались в userenv.
вопрос, тут пользователь может в свой локальный _ENV нагадить, тем самым испортив userenv, этого можно как-нибудь избежать? Например, как-нибудь создать дубликат таблицы вместо присваивания
источник

S

Snusmumriken in pro.lua
local _ENV = {}

Она локальная. Уже никуда не нагадить.
источник

S

Snusmumriken in pro.lua
Испортить userenv — пускай портит, ему же хуже ))
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
local _ENV = {}

Она локальная. Уже никуда не нагадить.
но там

local _ENV = userenv -- переключаешь _ENV для этого скоупа
источник

S

Snusmumriken in pro.lua
А, ну да, создаёшь таблицу userenv для каждого пользовательского скрипта отдельно, можно в функцию завернуть, возвращающую копию таблички.
источник

AB

Alexander Berezin in pro.lua
Snusmumriken
А, ну да, создаёшь таблицу userenv для каждого пользовательского скрипта отдельно, можно в функцию завернуть, возвращающую копию таблички.
точно, спасибо
источник

АК

Александр Караев... in pro.lua
Snusmumriken
&sandboxcode = <<<EOD
...
do
 local _ENV = userenv
 loadstring[====[$usercode]====]()
end
EOD;

Потом эвалишь это дело.
Ну...
$usercode = "]==== .. ' end ; print('injected') do ' .. ====["
источник

AB

Alexander Berezin in pro.lua
А что это за конструкция такая странная? не получается нагуглить
loadstring[====[$usercode]====]

почему не
loadstring($usercode)
источник

АК

Александр Караев... in pro.lua
Alexander Berezin
А что это за конструкция такая странная? не получается нагуглить
loadstring[====[$usercode]====]

почему не
loadstring($usercode)
это неудачная попытка защититься от инжектов =)
источник

AY

Arslan Yulbirdin in pro.lua
Alexander Berezin
А что это за конструкция такая странная? не получается нагуглить
loadstring[====[$usercode]====]

почему не
loadstring($usercode)
Можешь из пыхи вызвать что-то типа:
Lua->call("loadstring",$usercode);
источник