Использование PHP как бинарного CGI-приложения
является одним из вариантов, когда по каким-либо причинам нежелательно
интегрировать PHP в веб-сервер (например Apache) в качестве модуля,
либо предполагается использование таких утилит, как 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, указывая во время компиляции опцию --enable-force-cgi-redirect,
а таке опции doc_root и user_dir во время выполнения скрипта,
можно предотвратить подобные атаки для директорий с ограниченным доступом.
Более детально приведенные опции, а также их комбинации будут рассмотрены ниже.