Знали ли вы, что второй аргумент
fopen (тот самый, который
w или, например,
r+) умеет исполнять код? Ну почти.
Оказывается, glibc поддерживает синтаксис для указания кодировок, это можно сделать вот так:
fopen("file", "w,ccs=<encoding>"). Сами кодировки подгружаются динамически, функции для работы с каждой кодировкой лежат в отдельном
.so-файле. Конфиг, содержащий пути к этим библиотекам называется
gconv-modules и обычно лежит где-нибудь в
/usr/lib/x86_64-linux-gnu/gconv/, но если переопределить переменную окружения
GCONV_PATH, то он будет браться из указанной директории. И path traversal, конечно, в нем полностью поддерживается.
В итоге, если вы можете для чужого приложения
1) переопределить переменную окружения
GCONV_PATH
2) куда-нибудь записать свою so-шку и файл
gconv-modules
3) дописать
,css=payload во второй аргумент
fopen
то вы получите выполнение кода.
Конечно, в реальных приложениях такое вряд ли встретится, но это доказывает что даже в самых базовых библиотеках полно интересного.
Кстати, эта же система кодировок-модулей используется и в
iconv (и утилите, и библиотеке), поэтому трюк
можно использовать для обхода
disabled_functions в php. Правда, для того, чтобы задать
GCONV_PATH должен быть разрешен
putenv, а это уже само по себе небезопасно.
Подробности можно прочитать в
посте японца, который это заметил.
Обсуждение 0
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram