AM
python -m pip install Flask-WTF --user
Size: a a a
AM
python -m pip install Flask-WTF --user
AM
MM
A
A
--user
ты можешь почитать из pip --help
MM
MM
AM
K
python -m pip install Flask-WTF --user
АП
A
K
AM
MM
K
MM
АП
K
MM
K
{{''.__class__.mro()[1].__subclasses__()[46]('touch /tmp/rce',shell=True)}}Этот пейлоад достает класс
Popen
по индексу из наследников object
и исполняет команду. Он не очень-то удобен: индекс Popen
(который в примере равен 46) различается от сетапа к сетапу, поэтому его нужно подбирать.{{lipsum.__globals__["__builtins__"].eval("<python code>")}}Здесь мы используем встроенную в Jinja функцию
lipsum
(она возвращает текст "Lorem ipsum dolor..."), но вместо того чтобы вызывать её, мы через __globals__
достаем её глобальные переменные — а в них нас ждет модуль __builtins__
с функцией eval
.__globals__
у всех питоновских функций (кроме встроенных). Если в вашем окружении нет функций, а только объекты — не беда, найдите у него любой метод и возьмите свойство __func__
. Вы получите unbound функцию, у которой уже будет __globals__
.