![]() |
Укрощение magic_quotes_gpc
Укрощение magic_quotes_gpc [INTRO] В настоящей статье пойдет речь об одном из конфигурационных параметров языка программирования PHP — magic_quotes_gpc. Этот параметр играет важную роль, касающуюся, прежде всего, безопасности функционирования любого веб-приложения, обрабатывающего данные, полученные от пользователя и использующего для их хранения базу данных MySQL. [At that affect?] Параметр magic_quotes_gpc влияет на то, как будут обрабатываться специальные символы, содержащиеся в данных, передаваемых пользователем (массивы $_GET, $_POST, $_COOKIE). При magic_quotes_gpc = 1 эти спецсимволы [одиночные (') и двойные кавычки ("), обратный слеш (\), байт NULL] автоматически экранируются интерпретатором PHP (перед каждым таким символом добавляется обратный слеш). При magic_quotes_gpc = 0 все данные передаются в таком виде, в каком их ввел пользователь. В последнем случае в целях безопасности требуется обрабатывать передаваемые данные (в противном случае возможна атака SQL-injection) непосредственно в коде приложения. Для этого в PHP существует функция addslashes (выдержка из документации):PHP код:
[magic_quotes_gpc 0 or 1?] Все, вроде бы, просто. Использование в коде приложения функции addslashes в случае, если заведомо известно, что директива magic_quotes_gpc равна 0, вполне обосновано. Но что если администратор хостинга решит установить ее значение в единицу? Будет происходить двойное экранирование спецсимволов! Поэтому, функцию addslashes необходимо применять только в том случае, когда magic_quotes_gpc = 0. Получить текущее значение данного конфигурационного параметра можно при помощи стандартной функции get_magic_quotes_gpc. Таким образом, более универсальный код будет иметь следующий вид:PHP код:
[Create function] Если писать каждый раз такую конструкцию, то код разрабатываемого веб-приложения становится достаточно громоздким. Гораздо эффективней использовать в начале каждого файла PHP универсальный код, осуществляющий при необходимости описанную выше обработку. Он будет иметь следующий вид:PHP код:
fix_magic_quotes_gpc(); Следует заметить, что описанный код учитывает также тот факт, что в переменных $_GET, $_POST, $_COOKIE могут передаваться не только строки, но и многомерные массивы строк. [End of] В ходе проведенного недавно нашей компанией исследования некоторых веб-сайтов выяснилось, что многие достаточно известные веб-разработчики не учитывают параметр magic_quotes_gpc. А жаль... [Example] Программа: TutorialCMS 1.02 (возможно и более ранние версии) Цитата:
Условие: magic_quotes_gpc = off (при magic_quotes_gpc=1 код не уязвим.) Уязвимый код: PHP код:
Скачать TutorialCMS 1.02 http://www.wavelinkmedia.com/scripts/tutorialcms/ Прмеры запросов: 1. Читаем /etc/password PHP код:
PHP код:
PHP код:
|
Проще всего проверить gpc и если оно включено, то обработать все, убрав его.
Дальще действовать как и в случае, если админ не долбостук ) |
Тупое добавление слешей во все параметры это бред. Каждый параметр нужно обрабатывать индивидуально в соответствии с предполагаемым типом. Например, строку перед добавлением в базу прогнать через mysql_escape_string. перед выводом в браузер порезать теги, если это нужно. а это - вырезание гланд через ж..
|
Я так понял в статье рассматривался вариант написания независимого кода от заначения параметра magic_quotes_gpc, т.е. чтоб код одинаково работал как при magic_quotes_gpc=0, так и при magic_quotes_gpc=1. Всё это касательно получаемых данных из массивов $_GET, $_POST, $_COOKIE.
PS Цель статьи показать лишь, то что надо не забывать об этом важном параметре, так как видим скрипты пишут в надежде что magic_quotes_gpc=1, а при magic_quotes_gpc=0 скрипт уязвим... |
Мда..как Great сказал тут нужно к каждому параметру подходить индивидуально
PHP код:
|
Честно говоря, пример с TutorialCMS не слишком удачный. В коде в запросе SELECT стоит выбор одной колонки - activated, в примерах запросов аж по 13 штук. /etc/passwd можно прочитать лишь сами знаете при каких привилегиях. Данные из базы можно прочесть далеко не всегда. И еще возникло впечатление, что прочитав mysql.user и расшифровав пароль, мы получим пасс на админку TutorialCMS o_O
И, кстати говоря, указанная уязвимость приводит к слепой скуле - на экран ничего не выводится - ни /etc/passwd мы не прочитаем, ни пароли из базы не выцепим. |
Цитата:
Скачал эту cms, запустил на локалхосте, действительно колонка одна и вывода нет, откуда взялись такие запросы на милворме, для меня загадка... по поводу паса на админку - он хранится в таблице users см. exploit. |
хе, наверно, скопипастили не то, что хотели на милворм :)
|
Как-то тут всё сложно...
PHP код:
$var = array_map('addslashes', $_REQUEST); И как было замечено - к каждому параметру нужен индивидуальный подход, исходя из типа параметра и того, где он будет использоваться... |
omg, subj...
Код:
<?phpКод:
<?php |
| Время: 11:05 |