Использование PHP как бинарного CGI-приложения
является одним из вариантов, когда по каким-либо причинам нежелательно
интегрировать PHP в веб-сервер (например, Apache) в качестве модуля,
либо предполагается использование различных CGI-оберток
и таких утилит, как chroot и setuid для организации безопасного
окружения работы скриптов.
Такая установка обычно сопровождается копированием исполняемого
файла PHP в директорию cgi-bin веб-сервера. CERT (организация,
следящая за угрозами безопасности)
» CA-96.11 рекомендует не помещать
какие-либо интерпретаторы в каталог cgi-bin. Даже если PHP используется
как самостоятельный интерпретатор, он спроектирован так, чтобы предотвратить
возможность следующих атак:
Доступ к системным файлам: http://my.host/cgi-bin/php?/etc/passwd
Данные, введенные в строке запроса (URL) после вопросительного знака,
передаются интерпретатору как аргументы командной строки согласно
CGI протоколу. Обычно интерпретаторы открывают
и исполняют файл, указанный в качестве первого аргумента.
В случае использования PHP посредством CGI-протокола он не
станет интерпретировать аргументы командной строки.
Доступ к произвольному документу на сервере:
http://my.host/cgi-bin/php/secret/doc.html
Согласно общепринятому соглашению, часть пути в запрошенной
странице, которая расположена после имени выполняемого модуля
PHP, /secret/doc.html,
используется для указания файла, который будет интерпретирован
CGI-программой. Обычно, некоторые конфигурационные
опции веб-серевера (например, Action для сервера Apache) используются
для перенаправления документа, к примеру, для перенаправления запросов
вида http://my.host/secret/script.php интерпретатору PHP.
В таком случае веб-сервер вначале проверяет права доступа к
директории /secret, и после этого
создает перенаправленный запрос http://my.host/cgi-bin/php/secret/script.php.
К сожалению, если запрос изначально задан в полном виде,
проверка на наличие прав для файла /secret/script.php не выполняется, она
происходит только для файла /cgi-bin/php.
Таким образом, пользователь имеет возможность обратиться к
/cgi-bin/php,
и, как следствие, к любому защищенному документу на сервере.
Если в PHP указать во время исполнения скрипта опции cgi.force_redirect, doc_root и user_dir, то можно предотвратить
подобные атаки для директорий с ограниченным доступом.
Более детально приведенные опции, а также их комбинации будут рассмотрены ниже.