Сегодня пришло вот в голову что неплохо было бы рассказать о такой интересной особенности связки php и cgi (и fastcgi тоже).
В общем мало или много кто знает, что при подключении php к апачу через cgi, есть возможность конфигурировать чуть ли не каждый скрипт отдельно. А если более конкретно, то для каждой папки с php скриптами может быть создан свой файл php.ini со своими настройками, которые перезапишут глобальные настройки.
Сегодня мне подумалось, что эту фишку можно использовать в корыстных целях. К примеру в php есть несколько различных опций настроек, таких как сейфмод или опенбейсдир… Догадываетесь к чему я клоню? Дада, их в связке php+cgi можно легко обойти!
Обходим сейфмод
С помощью создания своего php.ini можно обойти кучу настроек безопасности, таких как:
- safe_mode
- open_basedir
- disable_functions
- memory_limit
- max_execution_time
И если с помощью последних двух можно немножко улучшить условия дешового хостинга, то с помощью первых трех можно обойти ограничения безопасности и возможно взломать весь сервер.
Для того чтобы изменить настройки php, надо создать файл php.ini в папке с вашими php скриптами, с приблизительно следующим содержанием:
; Обход сейфмода:
safe_mode = Off; Обход опен бес дира
open_basedir =; Включаем все функции
disable_functions=; Отключаем ограничение потребления памяти
memory_limit = -1; И убираем ограничение вермени выполнения каждого скрипта
max_execution_time = 0
Впринципе можно вписать любые другие настройки которые вам захочется, то есть полностью сконфигурировать PHP под ваши нужды)
UPD: кстати помимо указанного способа использования этой уязвимости, ее можно использовать при загрузке файлов и при удачном стечении обстоятельств это может привести к выполнению кода, см. подробнее мою статью: Безопасная загрузка файлов на сервер
Защита
Вообще эта фича (или баг, я даже не знаю как правильно назвать) очень опасна на хостингах, где защита пользователей друг от друга и всего сервера основывается на сейфмоде и опенбейсдире (дада, и такие бывают).
И самое смешное то, что единственный (по крайней мере мне известный) способ защититься от этого — это не использовать PHP в связке с CGI. То есть php следует подключать только через mod_php.
UPD: Решение найденно: Решаем проблему CGI и PHP.ini!
Если кто знает о нормальных способах защиты, то отпишитесь пожалуйста здесь в комментариях, не стесняйтесь.
Хм, интересная возможность сконфигурировать папку заливки файлов на сайтах с php+cgi) Если заливать php.ini, может проканает где?
Дело в том что конфигурируется только папка в которой этот php.ini и лежит. То есть надо суметь залить и php.ini и какой нибудь php скрипт, к которому и будут применяться настройки, в общем то особого смысла в этом нет (тогда уж проще сразу шелл залить).
НО! Ты подтолкнул меня на интересную мысль. Очень часто в папках куда загружаются файлы есть индексный файл (ну типа чтоб не было видно листинга дир), и если он вдруг называется index.php (то есть с расширением php), то если выйдет в эту папку залить свой php.ini то…
Пожалуй, я напишу еще одну статейку на эту тему…
php_value auto_prepend_file prepend.php
и нет проблем :D
Я про это как раз специально отдельной главой написал здесь ;)
А так проблема в том, что в дирректории куда льется php.ini должен быть уже хотябы один php скрипт.