і, також, конфігурацій серверу^ які закінчуються небезпечною установкою. Цей розділ пояснює різні комбінації опцій конфігурації і ситуації, в яких вони можуть бути вдало використані.
ЗЛ7 CGI binary
Використовування РНР як здійснимих файлів CGI - вибір для установок, які з деякої причини не хочуть упровадити РНР як модуль в програмне забезпечення серверу (подібно Apache), або РНР використовуватиметься з іншими типами оболонок CGI, щоб створити надійне оточення chroot і setuid для сценаріїв. Ця установка звичайно включає установку виконуваного(Ьтагу) РНР в каталог cgi-bin на веб-сервері. Бюлетень CERT СА-96.11 рекомендує крім того, встановлювати будь-які інтерпретатори в cgi-bin. Навіть якщо здійснимий РНР може бути використаний як автономний інтерпретатор, РНР розроблений для того, щоб оберегти від атаки, яку ця установка робить можливою:
* Доступ до системних файлів: http://my.host/cgi-bm/php7/etc/passwd
Інформація запиту в url після знака питання (?) проходить як аргументи командного рядка інтерпретатору через інтерфейс CGI. Звичайно перекладачі відкривають і виконують файл вказаний як перший аргумент в командному рядку.
Викликаний як виконуваний CGI-файл, РНР відмовляється інтерпретувати командні аргументи рядка.*
Доступ до будь-яких веб-документів на сервері: http://my.host/cgi-bin/php/secret/doc.html
Частина URL з інформацією про шлях, що стоїть після імені РНР-файлу /secret/doc.html звичайно використовується, щоб визначити ім'я файлу, який повинен відкриватися і інтерпретуватися CGI програмою. Звичайно деякі директиви конфігурації веб-серверу(Араспе: Action) використовуються, щоб перенаправити запити до документів подібно http://my.host/secret/script.php3 на РНР інтерпретатор. З такою установкою веб-сервер спочатку перевіряє дозволи доступу в каталозі /secret, і потім створює запит перенаправлення http://my.host/cgi-bin/php/secret/scriptphp3 . До нещастя, якщо запит не дається спочатку в цій формі, веб-сервер не перевіряє доступ до файлу /secret/scriptphp3, але тільки для файлу /cgi-bin/php . Таким чином будь-який користувач, що має доступ до /cgi-bin/php, дістає доступ до будь-яких захищених документів на сервері.
В РНР, опція compile»time конфігурації —enable-force-cgi-redirect і директиви пшите-конфігурації doc root і user^dir може використовуватися для того, щоб відобразити цю атаку, якщо дерево документів серверу має будь-які директорії з обмеженнями доступу. Дивіться нижче для повного пояснення інших комбінацій.
Варіант 1: обслуговуються тільки загальні(риЬ1іс) файли
Якщо ваш сервер не має якої-небудь інформації, яка не обмежується паролем або управлінням доступом на основі ір, немає потреби в цих опціях конфігурації. Якщо ваш веб-сервер не дозволяє вам проводити перенаправлення, або сервер не має шляху, щоб зв'язатися із здійснимим РНР, який запрошує благополучно перенаправлений запит, ви можете вказати опцію — disable-force-cgi-redirect для конфігурування сценарію. Ви все ще повинні переконатися, що ваші сценарії РНР не покладаються на цей або інший шлях виклику сценарію, ні безпосередньо http://my.host/cgi-bin/php/dir/scriptphp3, ні переадресацією http://my.host/dir/script.php3.
Перенаправлення може бути конфігуровано, наприклад в Apache, директивами AddHandler і Action (див. нижче).
Варіант 2: використовування — enable-force-cgi-redirect
Ця compile-time опція оберігає від виклику РНР напряму з URL подібно http://my.host/cgi-bin/php/secretdir/script.php3. Замість того щоб виконати запит, РНР виконує тільки граматичний розбір в цьому способі якщо він виконав правила перенаправлення веб-сервера.
Звичайно переадресація в конфігурації Apache зроблена з наступними директивами:
Action php3-script /cgi-bin/php AddHandler php3-script .php3
Ця опція була протестована тільки з веб-сервером Apache, і покладається на Apache щоб встановити не-стандартну зовнішню змінну CGI REDIRECT_STATUS для перенаправлених запитів. Якщо ваш сервер павутини не підтримує якого-небудь способу повідомляти що запит прямої або перенаправлений, Ви не можете використовувати цю опцію і Ви повинні використовувати один з інших шляхів запуску версії CGI, документованої тут.
Варіант 3: установка doc__root або userjiir
Розміщення активного змісту, такого як скрилти і модулі, в каталогах документів веб-серверу іноді є небезпечною практикою. Якщо при деякій помилці конфігурації сценарії не виконуються, вони відображаються як звичайні HTML документи, що може закінчитися витоком інтелектуальної власності або інформації безпеки подібно паролям. Тому багато хто сісадмини віддають перевагу встановлювати інші каталоги для сценаріїв, які будуть доступні тільки через РНР CGI і, отже, завжди проінтерпретовані і не
відображені як такі.
Також, якщо неприступний метод перенаправлення невпевнених запитів, як описано в попередньому розділі, необхідно встановити кореневий каталог(сіос_гооі) сценаріїв, який відрізняється від кореневого каталога веб-документів.
Ви можете встановити кореневий каталог для скриптів директивою конфігурації doc root у файлі php3.ini, або ви можете встановити змінну оточення PHP_DOCUMENT_ROOT. Якщо це встановлено, CGI-версія РНР завжди додаватиме docjroot і шлях до файлу в запитах, так що ви завжди будете впевнені що за межами цього каталога скрипти виконуватися не будуть (окрім user_dir //див.ниже).
Інша опція, що використовується, - user dir. Коли userjiir - не встановлена, відкриттям файлу управляє тільки docj-oot. Відкриття URL подібно http://my.host/~user/doc.php3 не дасть результату при відкритті файлу з каталога користувача, але викликається файл ~user/doc.php3 з каталога docjroot (так, ім'я каталога починається з тильди [~]).
Якщо userjiir встановлена, наприклад як publicj>hp, запит, подібний http://my.host/~user/doc.php3 відкриє файл doc.php3 в каталозі public_php домашнього каталога користувача. Якщо це /home/user, то виконується /home/user/publicjphp/doc.php3.
userjtir задається незалежно від docjroot, так що ви можете контролювати доступ до document root і user directory окремо.
Варіант 4: РНР синтаксичний аналізатор зовні дерева web
Дуже безпечна опція повинна встановити синтаксичний аналізатор РНР де-небудь зовні дерева файлів web. В /usr/local/bin, наприклад. Зворотна сторона цієї опції полягає в тому що ви повинні вставляти рядок подібно:
# !/usr/local/bin/php
в перший рядок будь-якого документа, РНР теги, що містить. Крім того, ви повинні зробити файли здійснимими. Точно так, як і Ви поступаєте з будь-яким іншим сценарієм CGI записаним в Perl або sh або будь-якому іншому язиці, який використовує #! shell-escape механізм для самозапуску.
Щоб РНР дістав можливість коректно оперувати з PATHJNFO і