PHP и CGI. Обход ограничений безопасности

5 комментариев

Сегодня пришло вот в голову что неплохо было бы рассказать о такой интересной особенности связки 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!

  1. Дмитрий Амиров Автор

    Если кто знает о нормальных способах защиты, то отпишитесь пожалуйста здесь в комментариях, не стесняйтесь.

  2. Bo0oM

    Хм, интересная возможность сконфигурировать папку заливки файлов на сайтах с php+cgi) Если заливать php.ini, может проканает где?

    1. Дмитрий Амиров Автор

      Дело в том что конфигурируется только папка в которой этот php.ini и лежит. То есть надо суметь залить и php.ini и какой нибудь php скрипт, к которому и будут применяться настройки, в общем то особого смысла в этом нет (тогда уж проще сразу шелл залить).

      НО! Ты подтолкнул меня на интересную мысль. Очень часто в папках куда загружаются файлы есть индексный файл (ну типа чтоб не было видно листинга дир), и если он вдруг называется index.php (то есть с расширением php), то если выйдет в эту папку залить свой php.ini то…

      Пожалуй, я напишу еще одну статейку на эту тему…

        1. Дмитрий Амиров Автор

          Я про это как раз специально отдельной главой написал здесь ;)

          А так проблема в том, что в дирректории куда льется php.ini должен быть уже хотябы один php скрипт.

Добавить комментарий

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.