Главная
 

Как бороться с PHP-инъекциями

Дата публикации: 
Пнд, 2011-09-19 01:38

Сайты, использующие php могут быть подвержены такому виду атак, как php-инъекции. Данный вид атак очень похож на описанные ранее "SQL - инъекции".
Атака заключается в выполнении произвольного кода на стороне сервера. Атака может быть возможной, если следующим функциям передаются неконтроллируемые данные:

eval(),
preg_replace(),
include() или include_once(),
require() или require_once(),
create_function().

Методы борьбы
Для борьбы с данной уязвимостью необходимо произвести контроль входных данных, где любым из доступных способов сделать так, чтобы в качестве аргументов этих функций были данные, которые не могут нарушить логику работы скрипта. Под “доступными способами” подразумевается фильтрация с помощью регулярных выражений, явный выбор из всех допустимых значений (если их не много), запрет спецсимволов (для того чтобы злоумышленник не мог подключить удаленный скрипт к вашему) и др.
Так же можно прописать в .htaccess:

php_value allow_url_fopen Off

Или в php.ini

allow_url_fopen Off

Это запретит вашим скриптам подключать файлы извне.
Если вы используете CMS – необходимо своевременно устанавливать все обновления безопасности. Если вы обнаружили уязвимость, а патча-заплатки для CMS еще не выпущено – сообщите в ее техподдержку. Так же, если это разрешено лицензией – можете попробовать
самостоятельно закрыть уязвимость (но делать это необходимо предельно осторожно).

Методы диагностики
Сначала необходимо проанализировать, есть ли в ваших скриптах потенциально уязвимые функции, перечисленные выше. Если их нет, либо они есть, но их аргументы – константы, то ваши скрипты не подвержены данному типу атак.
В противном случае необходимо проверить каждый аргумент данных функций. Откуда он в нее попадает, как он проверяется. В случае обнаружения необрабатываемых аргументов – дописать их обработку, так как они являются потенциальной уязвимостью.
После этого можно пойти другим путем:
В качестве аргументов функций include(), include_once(), require() или require_once() попробовать передать всеми возможными способами удаленный (находящийся на другом сервере) скрипт. Если скрипт удалось подключить – то это уязвимость, которой может воспользоваться потенциальный злоумышленник.
В качестве аргументов остальных функций попробовать передать какую-нибудь безобидную, но заметную функцию, например die('Ups'). Если функцию получится передать – это уязвимость.
Если фильтрация аргументов проводится – необходимо попробовать обойти ее. Если это удастся – то это опять же уязвимость.

Связаться с нами