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

  • Другие методы

  • Листинг 3.7. Использование cookies для передачи данных

  • Инициализация переменных

  • Листинг 3.8. Ошибка инициализации переменной

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


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

    Inj ection test






    Read news



    if (isset($file))

    {

    print($dir."/".$file) ; include($dir."/".$file);

    }

    ?>





    Подобный сценарий мы рассматривали ранее (см. разд. 3.1.2). В качестве парамет­ров он получает две переменные методом get: имя каталога и имя файла, которые нужно подключить через функцию include. В самом начале сценария мы проверяем получаемые параметры на опасные символы, но при этом обращаемся к ним через массив $_get, а потом используем автоматически зарегистрированные переменные $dir и $file. По идее, эти переменные уже проверены, но это не так. Массив и пе­ременные — это абсолютно разные вещи, но это незаметно на первый взгляд. А если подкорректировать в строке URL передаваемые данные, то мы сможем уви­деть файл /etc/passwd. Дело в том, что на запрещенные символы проверяются толь­ко значения в массиве, но не переменные $dir и $file.

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

    Проблема может возникнуть и в этом случае:

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

    {

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

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

    }

    include($dir."/".$file) ;

    Проблема в том, что проверка произойдет только если параметр dir существует и отфильтрованные данные попадут в переменные $dir и $file. Но фильтрация будет только если параметр dir существует. А если его не передать, а дать только файл: http://www.sitename.domain/index.php?file=etc/passwd

    Параметра dir нет, и значит, проверки нет, а в переменной file оказываются не­проверенные данные.

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

    {

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

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

    }

    include($dir."/".$filename);

    В этом случае проверка происходит, если есть директория или файл. Казалось бы, фильтрация будет, но проблема в том, что имя параметра file, а переменная, кото­рую мы используем, — filename. Мы можем обойти проверку, если передадим не file параметр, а filename:

    http://www.sitename.domain/index.php?filename=etc/passwd

    Код ожидает параметр file, проверяет его, а мы обходим ее и сразу же за счет ав­томатического создания переменных создаем filename.

    1. Другие методы

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

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

    Итак, допустим, у нас есть код, приведенный в листинге 3.7.

    Листинг 3.7. Использование cookies для передачи данных


    setcookie("dir", "news", time()+5184000); setcookie("file", "netutils.html", time()+5184000);

    ?>







    Inj ection test







    if (isset($file))

    {

    print($dir."/".$file) ; include($dir."/".$file) ;

    }

    ?>





    В самом начале сценарий записывает в cookies два параметра — dir и file. Оба они сохраняются в специализированном файле на стороне клиента. После этого загру­жается файл, путь к которому указан через переменные $dir и $file. При первой загрузке web-страницы она ничего не отобразит, потому что переменные $dir и $file не существуют. Значения в этот момент записываются в cookies, но не загру­жаются, так как соответствующие переменные не созданы. При следующей загрузке web-страницы cookies уже существуют, и переменные будут автоматически созданы.

    Если лет двадцать назад работать с cookies было неудобно и приходилось обра­щаться к файлам напрямую, то сейчас в утилитах разработчика любого современ­ного браузера изменение значений стало тривиальной задачей. Рассмотрим это на примере самого популярного браузера Chrome, движок которого также использу­ет Microsoft. Открываем утилиты разработчика нажатием ++ (рис. 3.3). Здесь переходим на вкладку Application (Приложение).




    Рис. 3.3. Редактирование cookie в браузере Chrome




    Слева выбираем Cookies, где в виде дерева представлены различные URL-адреса. Почему их несколько? Самый первый — это основной адрес, с которого мы загру­жали сайт. В данном случае в качестве примера я использовал свой сайт www.flenov.info, поэтому он идет первым. Но у меня на сайте используются неко­торые функции, которые предоставляет Twitter и Google, поэтому с их серверов также загружались файлы, у которых также могут быть свои cookies.

    Файлы cookies и их значения могут быть видны только определенному сайту. Если сайт Google создал какой-то параметр, то только сайт Google может прочитать это значение. По умолчанию владелец значения определяется по домену, но можно так­же ограничить по поддомену или дать доступ только определенному пути на сайте.

    Чтобы изменить значение какого-то существующего параметра, можно дважды кликнуть в колонке Value (Значение) напротив нужного параметра и указать новое значение.

    1. Инициализация переменных

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

    Листинг 3.8. Ошибка инициализации переменной







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


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