Разработчик запустил свой код на сервере, имея лишь возможность изменения содержимого комментария в Python-скрипте
Участник соревнования по информационной безопасности UIUCTF 2025 в техническом блоге подробно рассказал, что ему удалось успешно выполнить задание, требующее добиться исполнения стороннего кода на сервере, имея лишь возможность изменения содержимого текста комментария в коде Python-скрипта.
По информации OpenNET, в рамах этой задачи можно было отправить сетевой запрос к Python-скрипту, который создавал новый Python-скрипт cо случайными именем, добавлял поступившие от пользователя данные в текст комментария, вырезав символы "\n" и "\r", и запускал этот скрипт командой "python3 имя.py". Контролируя только содержимое комментария, участник должен был извлечь строку из файла "/home/ctfuser/flag". Скрипт создавался следующим кодом:
Вместо "{comment}" подставлялись данные, поступившие от участника, и в итоге запускался следующий код:
Задание было сформировано по мотивам уязвимости в парсере CPython, который обрабатывал символ с нулевым кодом как окончание строки (уязвимость, например, можно было использовать для скрытия вредоносных действий в тексте комментария). Проблема была устранена в выпусках CPython 3.12.0 и 3.11.4. В применяемом в конкурсе обработчике вырезались только символы «\n» и «\r», но при использовании уязвимой версии СPython участник мог использовать символ «\0» как разделитель. Тем не менее, этот трюк не сработал, так как в конкурсе использовалась уже исправленная версия CPython c расчётом, что в парсере могут оставаться ещё какие‑то похожие ошибки и участники смогут их выявить.
Разработчик не стал искать новые уязвимости в парсере, которые бы позволили разбить строку на части, а воспользовался особенностью выполнения в Python файлов по типу их содержимого. Например, вместо исходного кода в файл с расширением
Читать на habr.com