Поиск по этому блогу

воскресенье, 13 февраля 2011 г.

PHP Include. Что это, с чем едят, что же делать?

PHP Include - столь же опасная уязвимость, как и SQL-инъекция, да и примерно такая же популярная. Если данные, используемые как параметры функцией include, не проверяются, это может привести к печальным последствиям (или радостным, для кого-то).


Что за функция include? Какая тут вообще уязвимость?

Все просто. Функция include подключает к PHP сценарию любые дополнительные модули, исполняя их (будет выполнено все между тегами <?php (<?) и ?>, если есть что-то вне этих тегов - просто вывод на экран).
Зачастую вызов функции выглядит так: include($filename), где параметр функции - имя (и путь) модуля, который внезапно оказался необходим. При этом в качестве параметра можно передавать не только путь, но и URL.






Представим себе такую картину. Гений IT (где-то 5-6 класс) поднял свой веб-сервер, красота и так далее. С помощью функции include он подгружает следующие модули:
  home.php 
  aboutme.php
  againaboutme.php
  contacts.php
  ...
Идея проста. Нужна домашняя страница? Вот твой home.php. Срочно нужны контактные телефоны? Contacts.php. Все просто.

Такой же гений ИТ, только немного почитавший про то, как стать кулхацкером, меняет запрос на все тот же пресловутый index.php?file=/etc/passwd.  Бинго! Ему выведется файл passwd на экран (на самом деле, процесс этот слегка труднее, но для понимания процесса сойдет).
А если он введет URL, по которому будет расположен некий вредоносный скрипт? А судя по всему, он его введет.

В общем, уязвимость достаточно опасная. Напрашивается вопрос:

Как с ней бороться?

Ну методов то много. Но два самых первых, напрашивающихся - это:

  1. Экранируй кавычки, слэши, тире, любые спецсимволы, быть которых не должно в параметре. Это уже сильно порадует кулхацкера. Разумеется, все твои модули тогда будут в одной папке, иначе зачем экранировал?
  2. Можно, конечно, поступить более жестко: составить список модулей, если пытаются запустить модуль, которого тут нет, рисуем пативен на всю страницу. 
Хоть уязвимость и известная, но о ней почему-то забывают. Парадокс.



1 комментарий: