Автор: Сезар И. Сантьяго, Мериэн Хондо
Чаще всего атакам подвергаются Web-приложения. К этим атакам, направленным на самые распространенные уязвимости, относятся межсайтовый вызов скриптов (cross-site scripting), внедрение SQL (SQL injection), модификация параметров (parameter tampering), подделка cookie-файлов (cookie poisoning) и утечка информации. Традиционные системы защиты периметра, такие как сетевые экраны и системы обнаружения вторжений, не защищают от атак подобного рода, поскольку эти атаки используют уязвимость программ. В данной статье рассматриваются наиболее распространенные уязвимости и возможные контрмеры, а также объясняется значение автоматизированного сканирования системы безопасности в процессе разработки для создания безопасных приложений.
истемы управления доступом, сетевые экраны, системы обнаружения вторжений и системы предотвращения вторжений являются неотъемлемыми составными частями системы безопасности приложений, обеспечивающими защиту периметра. Однако эти механизмы не полностью защищают Web-приложения от атак. Поскольку эти приложения используют Web-технологии, сами принципы взаимодействия Web-пользователей с ними позволяют напрямую атаковать приложения и обходить установленные системы защиты периметра. Злоумышленники знают об этом, и именно поэтому большинство атак – это прямые атаки на Web-приложения.
Чтобы выровнять баланс, разработчики приложений должны изучать стратегии защиты против атак. Также они должны учитывать несколько факторов, являющихся причиной целого ряда атак:
Вышеперечисленные факторы диктуют правила, которые следует соблюдать каждому разработчику для написания более качественного кода.
Эта статья призвана повысить уровень информированности разработчиков. В ней рассказывается о наиболее распространенных уязвимостях Web-приложений, использующих технологию Web 2.0. Также приводится краткая информация о проблемах безопасности, свойственных мобильным устройствам.
Мобильные Web-приложения во многом подвержены тем же уязвимостям, которые присущи настольным Web-приложениям. Более подробная информация об уязвимостях и контрмерах приведена в проекте Top 10 Project на Web-сайте Open Web Application Security Project (OWASP), ссылку на который можно найти в разделе Ресурсы.
В следующих подразделах рассматривается несколько основных уязвимостей, о которых должны знать разработчики.
При этой распространенной атаке вредоносный код внедряется в аутентичный Web-сайт. Если в HTML-код отображаемой страницы можно вставить входные данные HTTP-запроса, сайт открыт для таких атак.
Например, сервис принимает параметр image для извлечения из файловой системы изображения и его обработки:
http://somedomain/myImageProcessor?image=myimage.jpg
Злоумышленник может исследовать это приложение, вставляя JavaScript-код в параметр image. Цель – обнаружить неправильную обработку ошибок. Если получится сгенерировать сообщение об ошибке, содержащее вредоносный скрипт, злоумышленник может использовать это в своих интересах:
http://somedomain/myImageProcessor?image=myimage.jpg(script)..вредоносный код ..(/script)
Если сообщение об ошибке возвращает содержимое параметра image без фильтрации, выполняется код, заключенный в теги (script). Скрипт потенциально может получить доступ к локальным cookie-файлам атакуемой Web-страницы или даже изменить содержимое отображаемой страницы. Эту уязвимость можно использовать для рассылки инфицированных ссылок по электронной почте или включения их в злонамеренные Web-страницы.
Эта концепция показана на Web-сайте Altoro Mutual, который демонстрирует возможности программы IBM® Rational® AppScan® Standard Edition по сканированию приложений на наличие уязвимостей
Рисунок 1. Демонстрационный Web-сайт Altoro Mutual AppScan
На рисунке 2 показано, что элемент поиска "pineapples" отображается в результатах поиска независимо от того, найден он или нет.
Рисунок 2. В результатах поиска всегда отображается элемент поиска
Это говорит о том, что приложение восприимчиво к атакам посредством выполнения межсайтовых скриптов. На рисунке 3 показан результат поиска выражения (script)alert('attack')(/script). Код сценария возвращается в результатах поиска и выполняется, после чего отображается окно с предупреждением.
Рисунок 3. Ввод JavaScript-кода в качестве выражения поиска приводит к выполнению этого кода
Для предотвращения выполнения межсайтовых скриптов (XSS):
В случае с Altoro Mutual простым решением мог бы стать запрет на возврат элемента поиска.
Более подробное обсуждение межсайтовых скриптов и защиты от них приведено в статье developerWorks® IBM Rational AppScan: подробно о межсайтовых скриптах, а также на странице Cross-site Scripting сайта OWASP
Эта атака тоже связана с использованием уязвимостей в запросах и направлена на вставку SQL-выражений в поля Web-приложения, предназначенные для ввода данных. Возможность вставлять запросы в поля ввода позволяет злоумышленнику обойти механизмы аутентификации Web-сайта и получить доступ к базе данных. Эта атака, наряду с выполнением межсайтовых скриптов, является одной из самых распространенных.
Приведенный ниже пример демонстрирует плохо сконструированную процедуру входа, в которую внедряется SQL: Web-приложение запрашивает имя пользователя и пароль, для чего используется следующее SQL-выражение:
String query = "SELECT * FROM users WHERE user ='"username+"' AND password ='"passwd"'";
Переменные username и password никак не очищаются, и им присваиваются значения, введенные пользователем в приложении. Это позволяет злоумышленнику в качестве username ввести, например, следующее:
anything' OR 1=1 --
Пароль может быть любым. В данном случае предположим, что это * (звездочка).
После подстановки этих данных в переменные username и password сформированный запрос будет выглядеть следующим образом:
SELECT * FROM users WHERE username ='anything' OR 1=1 -- AND password ='*'
Это выражение преобразовывает пароль в комментарий и вставляет условие 1=1, которое всегда истинно. Злоумышленник будет определен как разрешенный пользователь, хотя он не предоставил никаких данных, подтверждающих его полномочия.
Эта атака демонстрируется Web-приложением Altoro Mutual (см. рисунок 4). Перейдите на страницу входа, введите в качестве имени пользователя anything' OR 1=1 --, и любой введенный в качестве пароля символ предоставит вам административный доступ к приложению (рисунок 5). Эта учетная запись может управлять учетными записями других пользователей.
Рисунок 4. Попытка входа с произвольным паролем и фрагментом SQL-кода в качестве имени пользователя
Рисунок 5. После выполнения атаки с использованием внедрения SQL злоумышленник входит в систему как администратор
Аналогично атаке с применением межсайтовых скриптов, данная атака является следствием плохой (или отсутствующей) очистки и проверки вводимой информации.
Для предотвращения этой атаки:
В случае Altoro Mutual возможным решением является фильтрация всех поступающих из полей Username и Password символов, отличных от цифр и букв.
Подробная информация о внедрении SQL и возможных мерах противодействия приведена на странице SQL Injection сайта OWASP
Настойчивый злоумышленник может исследовать приложение, пытаясь обнаружить уязвимости. Это можно сделать разными способами:
Приложение Altoro Mutual допускает утечку существующих в системе имен пользователей. Например (см. рисунок 6), ввод неправильного имени и пароля пользователя приводит к появлению следующего сообщения об ошибке "Login Failed: We're sorry, but this user name was not found in our system. Please try again" (Во входе отказано: к сожалению данный пользователь не найден в системе. Попробуйте еще раз).
Рисунок 6. Приложение явно указывает, что такого пользователя нет
Далее злоумышленник вводит имя jsmith, и Web-приложение Altoro Mutual выдает следующее сообщение: "Login Failed: Your password appears to be invalid. Please re-enter your password carefully" (Во входе отказано: ваш пароль неверен. Введите пароль повторно). Из этой информации злоумышленник узнает о существовании учетной записи jsmith. Следовательно, он может сконцентрироваться на взломе пароля и попытаться угадать его, выполняя так называемую атаку методом "грубой силы" (brute force attack).
Рисунок 7. Приложение Altoro Mutual сообщает о существовании пользователя jsmith
Данную ситуацию можно исправить, выводя стандартное сообщение, не указывающее конкретно, что произошло, например: "Login failed: User name or password invalid. Please re-enter your credentials carefully" (Во входе отказано: имя пользователя или пароль введены неверно. Попробуйте еще раз).
Утечку информации необходимо рассматривать в контексте приложения, и лучшей защитой является компетентность разработчика. Существуют различные меры по смягчению последствий утечки информации, которые следует рассмотреть разработчикам.
Этот список никоим образом не претендует на полноту. Необходимо учитывать специфику приложения и рабочей среды.
Дополнительная информация об утечке информации приведена на странице Information Leakage сайта OWASP.
Эта атака нацелена на управление параметрами, передаваемыми в приложение. Рассмотрим плохо написанное приложение, позволяющее клиенту устанавливать стоимость покупаемого товара. Такое приложение может отправлять следующий запрос:
http://somedomain/myStore?item=1234&price=$200
Если бизнес-логика не выполняет двойную проверку на стороне сервера, злоумышленник может изменить стоимость, чтобы получить товар по меньшей цене. В данном случае разрешение установки цены со стороны клиента является явной ошибкой.
Дополнительная информация о модификации параметров и возможных контрмерах приведена на странице Web Parameter Tampering сайта OWASP
Cookie представляет собой информацию, хранящуюся в виде пар ключ/значение в текстовом файле или в памяти и отправляемую сервером в браузер. Содержимое cookie используется создавшим его Web-приложением. Подделка cookie – это изменение его содержимого после выполнения Web-приложения. Эта атака аналогична модификации параметров.
Подделка cookie обсуждается на странице OWASP, посвященной уязвимостям из-за ввода непроверенных данных
У Web 2.0-приложений, предназначенных для настольных и мобильных устройств, есть много общих проблем безопасности и, следовательно, много одинаковых способов их решения. Разработчики должны знать о наиболее распространенных уязвимостях и бороться с ними на протяжении всего цикла разработки. Для обеспечения безопасности приложения также необходимо постоянное автоматическое сканирование на наличие уязвимостей в процессе разработки и развертывания. Мобильные устройства имеют свой собственный уникальный набор проблем, поскольку по своей природе являются персонализированными и переносимыми. Заранее, еще до развертывания мобильных решений, продумайте защиту данных при краже или потере устройства.