Last updated
Last updated
- (Python 2.7.16/3.7.2 <= ) пример эксплуатации: таск , SharkyCTF 2020: кратко, ошибка в парсинге unicode в url, в следствие чего можно было обратиться к локальному ресурсу:
Способы добиться исполнения кода на Python:
Через десер в pickle
Если используется subprocess
Через File Upload, если можем писать в директорию с модулями. Если успеем переписать какой-то модуль до его первого импорта, то будет RCE. Mitigation: использовать zipap и определять директории, где могут находиться модули через sys.path
В Python возврат каретки \r
то же самое, что и перенос строки \n
.
Интерпретатору python все равно на unicode символы, он их попытается привести к ascii:
Пусть наш код запускается следующим образом (у нас ограничен globals
)
Без __build_class__
в builtins
нельзя создать класс:
Декораторы — это функции, которые в питоне могут быть представлены почти к чему угодно. Например, фунциям. С помощью декораторов можно организовать вызов какой-либо функции, не используя круглых скобок. Ограничение: вызвать можно только функции, которые принимают 1 аргумент (хорошо, что некоторые функции настроены на непозиционные аргументы или на кортежи аргументов). Пример:
Другая форма вызова функции через декораторы:
Зачем нужен builtins? — это ключ к свободному выполнению кода в Python и за пределами контекста Python.
Допустим вас запустили в контексте, где нет builtins. Как до него добраться без __subclasses__()
и не имея ни одного объекта из внешнего контекста? (все методы во всех гайдах опираются на метод subclasses)
Выбираемся (здесь как-то связано с pickle; пример без использования круглых скобок => без возможности вызова функций обычными способами):
reduce_ex принимает номер версии протокола pickle. Прием выше будет работать с протоколом 2 и выше.
Пример, что можно сделать, через builtins – например, получить доступ к переменным основного контекста. Пусть наш код запускается следующим способом:
И пусть мы уже получили каким-либо способом builtins. Тогда, через пакет inspect мы можем получить доступ ко всему стеку вызова основного скрипта:
HackTricks Gitbook:
Таск на выход из песочницы python и его решение: