Статьи Проверка надежности Web-приложений. Часть Третья

Discussion in 'Статьи' started by k00p3r, 13 Jun 2005.

  1. k00p3r

    k00p3r Banned

    Joined:
    31 May 2005
    Messages:
    430
    Likes Received:
    8
    Reputations:
    2
    Tecklord, по материалам SecurityFocus

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

    Файлы куки – это средство хранения постоянных данных на клиентской стороне HTTP обмена. Они не являются частью HTTP спецификации, но в то же время являются стандартом de-facto для браузера. Файлы куки представляют собой ответы на HTTP заголовки, и служат для установления определенного значение на клиентской стороне и передачи его серверу. Значение присваивается, используя заголовок 'Set-Cookie' и возвращается с помощью запроса 'Cookie'. Следующий пример иллюстрирует работу куки. Клиент запрашивает ресурс и получает ответ в виде заголовков:

    Set-Cookie: PASSWORD=g0d; path=/; expires=Friday, 20-Jul-03 23:23:23 GMT

    При обращении клиента к ресурсу по адресу «/» -- сервер отвечает:

    Cookie: PASSWORD=g0d

    Браузер отвечает за хранение и получение значений куки. В Internet Explorer и Netscape это реализовано с помощью маленьких временных файлов; безопасность такой реализации хранения данных не является темой данной статьи, мы попробуем сосредоточить наше внимание на проблеме самих файлов куки.

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

    Файлы куки должны рассматриваться разработчиком как другая форма ввода данных пользователем и подвергаться подобной проверке. Существует множество примеров SQL-инъекции и других уязвимостей, которые можно использовать посредством манипуляции значений файлов куки. (Пример уязвимости: Webware WebKit cookie overflow)
    Безопасность сессии и ID

    Большинство современных языков программирования для WEB включают в себя средства для управления сессиями. Это означает возможность установить значение таких переменных, как права доступа, настройки локализации, которые будут относится к каждому диалогу между пользователем и web-приложением до окончания сессии. Это реализуется web-сервером путем присвоения клиенту псевдо-уникальной строки – ID сессии. Затем сервер ассоциирует элементы данных с этим ID, а клиент сообщает ID каждый раз во время запроса к приложению. ASP и PHP имеют встроенную поддержку сессий. (PHP работает с переменными запросов GET и файлами куки, ASP только с файлами куки).

    Поддержка значений переменных сессии посредством запроса GET в PHP считается не самой лучшей реализацией, но поддерживается из-за того, что не все браузеры работают с куками, и не все пользователи принимают куки. Этот метод реализован посредством передачи GET запросом переменной PHPSESSID. PHP автоматически изменяет все ссылки в реальном времени, добавляя к ним PHPSESSID. Это не является единственной уязвимостью (поскольку ID сессии является частью ссылки), такой подход упрощает реализацию атаки: исследование логов прокси-сервера, просмотр истории браузера или социальная инженерия (просьба пользователя дать ссылку в том виде, в котором он это видит, включая PHPSESSID). Совмещая переменные сессии GET и межсайтовый скриптинг, можно расшифровать ID сессии. Этого можно достичь, внедрив javascript, который будет отсылать URL документа на удаленное аутентифицирующее приложение, таким образом позволяя атакующему собирать ID сессий.

    Метод с файлами куки работает точно так же, за исключением переменной PHPSESSID (или ID сессии в случае с ASP), использование которой предпочтительно в фалах куки, а не посредством GET запроса. На уровне протокола, это так же опасно, как и метод GET, так как ID сессии может быть записано, повторено или добыто путем обмана(социальная инженерия). И все же, намного труднее получить ID сессии, так как оно не является частью ссылки. Комбинация куки, сессий и межсайтового скриптинга небезопасна постольку, поскольку атакующему нужно всего лишь вставить свойство document.cokie на страницу аутентификации и получить ID сессии. Добавим, что как средство удобства для пользователя, ID сессии часто устанавливается на использования куки с неограниченным срока годности или без его указания. А это означает, что такой файл будет всегда существовать на клиентской стороне, и возможность заполучить его возрастет.

    Существует также много форм управления сессиями пользователей. Одна из них – это вставка строки ID сессии в тег <input type="hidden"> элемента <form>. Вторая – использование строк ID сессий, определяемых вебсервером Apache, для выявление пользователя и как средство аутентификации. Проект Apache никогда не подразумевал использование этих данных в иных случаях, кроме как выявления пользователя и статистических данных; алгоритм построения такой строки основан на взаимосвязи известных элементов данных на стороне сервера. Подробности о брутфорсе ID сессии и криптографическом алгоритме хешировании не рассматривается в этой статье. (Для желающих изучить этот вопрос подробно, можно воспользоваться этим документом).

    ID сессии являются ахиллесовой пятой web-приложений, поскольку они просто используются для управления структурой HTTP – по существу бесструктурной технологии. Пен-тестер должен особо тщательно изучить механизм, который используется для генерации ID сессии, способ создания ID и его взаимосвязь с ошибками на клиентской стороне (например, межсайтовый скриптинг), и возможность атак.
    Логические ошибки

    Логические ошибки – это большая категория уязвимостей, окружающая большинство уязвимостей, которые не подпадают под другие категории. Логическая ошибка – это ошибка в логике web-приложения правильно обрабатывать некоторые данные или обеспечивать безопасность. Примером служит следующий скрипт:

    <?php
    $a=false;
    $b=true;
    $c=false;
    if ($b && $c || $a && $c || $b)
    echo "True";
    else
    echo "False";
    ?>

    Выше приведенный код пытается удостовериться в том, что две из трех переменных принимают значение до того, как возвращается true. Логическая ошибка состоит в том, что заданное до этого значение переменной $b=true приведет к успешному завершению условия if. Это можно исправить, изменив условие if на следующее:

    if ($b && $c || $a && ($c || $b))

    if ($b && $c || $a && $c || $a && $b)

    Логические ошибки очень трудно обнаружить, используя метод «Черного ящика». Они обычно дают о себе знать при проверке другого вида уязвимости. Тщательный аудит кода является самым лучшим средством от логических ошибок, примером которых может послужить SudBox Boutique login bypass vulnerability
    Бинарные атаки

    Web-приложения, написанные на языках, использующих статические буферы (например C/C++) могут быть уязвимы к таким традиционным бинарным атакам, как переполнение буфера. Также часто встречаются манипуляция кодом и содержимым (SQL-инъекции и PHP-инклудинг).

    Переполнение буфера возникает вследствие попытки программы записать в статический буфер больше данных, чем предусмотрено. Дополнительные данные переписывают и повреждают соседние блоки в памяти и могут дать возможность атакующему контролировать выполнение и внедрять произвольные инструкции. Чаще всего переполнение буфера находят в приложениях, написанных на C/C++(программы на языке C# является защищенным от такого вида атаки, так как в C# существует дополнительная защита стэка от невнимательного разработчика). Частыми примерами такой уязвимости служат в web-приложениях mnoGoSearch и Oracle E-Business Suite.

    Переполнение буфера может быть обнаружено во время проверки методом «Черного ящика» путем ввода слишком большого количества данных в форму, заголовок или поле куки. В случае с ISAPI приложениями, сообщение об ошибке №500 (или тайм аут) в ответ на ввод длинной строки может говорить об ошибке сегментации на стороне сервера. Поскольку переполнение буфера более характерно для скомпилированных выполняемых файлов, чем для скриптовых приложений, окружение должно быть сперва протестировано для выяснения, является ли язык разработки уязвимым к атакам переполнения буфера. Обратим внимание, что наиболее популярные языки программирования для web (Java, PHP, Perl, Python) являются интерпретированными языками, в которых интерпретатор отвечает за распределение всей памяти.

    Атаки форматированной строкой возможны, когда определенная функция C обрабатывает ввод данных, содержащий символы форматирования (%). Известно, что функции printf/fprint/sprintf, syslog() и setproctitle() некорректно работают с этими символами. В некоторых случаях, это может привести к тому, что атакующий получит контроль над потоком выполнения программы (Примером использования этой уязвимости в web-приложении служит PWC.CGI vulnerability)
    Полезные утилиты для тестирования.

    Некоторые приложения изначально разрабатывались в помощь тестирующему методом “черного ящика” для обнаружения уязвимостей в web-приложениях. Хотя и анализ программного вывода, возможно, лучше всего выполнять вручную, большая часть методики тестирования может быть автоматизирована скриптами.

    AtStake WebProxy

    WebProxy работает между браузером клиента и web-приложением, перехватывает и декодирует запросы, чем позволяет разработчику анализировать действия пользователей, и измениять запросы на лету.

    Download: http://www.securitylab.ru/tools/31039.html

    SPIKE Proxy

    SPIKE proxy функционирует как HTTP/HTTPS прокси сервер и позволяет тестирующему автоматизировать некоторые тесы на уязвимость web-приложений (включая SQL инъекцию, обход катлога и брутфорс)

    Download: http://www.securitylab.ru/tools/30119.html

    Xspider

    Xspider содержит набор уникальных тестов, способных определять тип используемого ПО на Web сервере, определять уязвимости SQL инъекции в GET и Post переменных, XSS уязвимости и т.п. Все эти функции доступны только в зарегистрированной версии программы.

    Download: http://www.ptsecurity.ru



    KSES - это фильтр безопасности HTML написанный на PHP. Он фильтрует все “опасные” элементы формы и может защитить от SQL инъекции и XSS.

    Download: http://www.securitylab.ru/tools/41029.html

    Mieliekoek.pl

    Эта утилита, написанная [email protected], анализирует страницы и скрипты на предмет потенциально возможных SQL-инъекций.

    Download: http://www.securitylab.ru/tools/41031.html

    Sleuth

    Sleuth – это коммерческое приложение для обнаружения уязвимостей в безопасности web-приложений. Она включает элементы прокси сервера и возможности web-спайдера.

    Download: http://www.securitylab.ru/tools/39412.html

    Webgoat

    Целью проекта OWASP Webgoat является создание интерактивной среды обучения безопасности web-приложений. Она обучает разработчиков, используя практические упражнения, азам безопасности web-приложений и ошибкам дизайна. Она написана на Java и инсталляция возможна под *nix и Windows системы.

    Home Page: http://www.owasp.org/development/webgoat

    AppScan

    AppScan – это коммерческая утилита для проверки безопасности web-приложений разработанная Sanctum Inc. Она включает возможности проверки кода, оффлайн анализа и сканирования по расписанию.

    Home Page: http://www.securitylab.ru/tools/41033.html
    Заключение

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

    Мы надеемся, что в этой серии статей мы подчеркнули важность контроля над вводом данных пользователя и продемонстрировали, как основная часть вопросов по безопасности web-приложений связана с этой концепцией. Лучшая защита от атак, заключающихся в манипуляции ввода данных – это контроль над вводом данных и соблюдение правила: «Что четко не разрешено - запрещено». Легче будет справится с жалобами пользователей на запрещение ввода некоторых символов, нежели исправить последствия инцидента безопасности из-за непроверенного ввода данных.