Автор: Низамутдинов Марсель, специалист по информационной безопасности компании "1С-Битрикс"
Статья подготовлена с целью дать разработчикам общие понятия об уязвимостях, с помощью которых можно создать для вас проблемы в нормальной работе сайта. Так же даются рекомендации по защите от этих уязвимостей.
Атаки на веб приложение осуществляются непосредственно, без всякого участия других клиентов.
Классическая уязвимость, которая связана с недостаточной фильтрацией данных, используемых в SQL запросах. Это критическая уязвимость приводит к тому, что нападающий может выполнить произвольные SQL запросы к базе данных. Например получить значение произвольных таблиц, изменить некоторые значения (сделать себя админом), удалить данные, и всю базу данных целиком.
Для числовых данных, явно приводить значение к нужному типу (int, float и тп), для строковых данных, обрабатывать данные при помощи addslashes, mysql_escape_string и т.п.. А также, контролировать длину данных.
Уязвимость связана с использованием в качестве части имени файла недостаточно фильтруемого значения, принятого от пользователя. В общем случае, уязвимость может быть использована злоумышленником для чтения произвольных файлов в системе. Например, файлов с паролями.
Одной из самых страшных разновидностей данной уязвимости считается PHP инъекция. Эта уязвимость связана с использованием внешних данных внутри функции include и т.п. Нападающий может изменить имя файла таким образом, чтобы включить и выполнить в контексте уязвимого сайта произвольный PHP файл. Существует "удаленный" вариант данной уязвимости, когда как PHP файл, на уязвимом сервере выполняется удаленный HTTP документ.
У нападающего есть ряд приемов, для того чтобы облегчить эксплуатацию уязвимости. Например символ (приведено url encoded значение) %00, в языке Си (на котором написан PHP), обозначает конец строки. И внедрение этого символа в имя файла, заставит PHP игнорировать часть имени файла, после этого символа.
Лучше всего не использовать динамику в именах файлов. Но там, где ее использовать все таки необходимо, проводить явную проверку допустимости имени файла (или его части) из явно определенного разрешенного множества значений.
Например, разрешать только латинские буквы и цифры, и т.п. Множество должно быть задано исходя из поставленных задач.
Уязвимость связана с недостаточно фильтрацией данных, вставляемый в аргумент функции system и т.п. Например system(“ping $_GET[host]”); Нападающий сможет выполнить произвольный код в системе.
Проводить явную проверку допустимости значения таких переменных из явно определенного разрешенного множества значений. Например, разрешать только латинские буквы и цифры, и т.п. Множество должно быть задано исходя из поставленных задач. Также, можно использовать функции типа escapeshellcmd и escapeshellarg.
Тут все просто. Нападающий может подобрать простые пароли. Нападающий сможет подобрать короткие идентификаторы сессии.
Использовать сложные пароли. Использовать достаточно случайные, и достаточно длинные идентификаторы сессии.
Логические ошибки в коде, тип ошибок который наиболее тяжело диагностируется и имеет наибольшее разнообразие. Логическая ошибка в коде возникает, когда при некоторых ситуациях код работает не так как предполагается. Пример логической ошибки — использование неинициализированных переменных в коде. В зависимости от настроек PHP, такая переменная может быть проинициализирована из GET параметров, и выполнение кода становится непредсказуемым.
Четко строить ТЗ. Писать простой, ясный, понятный, структурированный код.
Атаки на клиентов веб приложения, это атаки на веб-приложения, которые проходят не непосредственно, а через других пользователей веб-приложения. Например через администраторов форума.
Межсайтовый скриптинг (XSS) уязвимость возникает тогда, когда данные, принятые от пользователя, выводятся в броузер без надлежащей фильтрции. Уязвимость может быть использована для изменения вида HTML страниц уязвимого сайта в контексте браузера целевого пользователя, похищения COOKIE данных браузера целевого пользователя, с последующим внедрением в его сессию, под его учетной записью.
Существует отдельный вектор реализации XSS уязвимости (XSS proxy), при котором злоумышленник получает двухсторонний контроль над уязвимым сайтом, и может производить действия с уязвимым сайтом от имени администратора сервера, с его учетной записью и его IP адресом!
Использовать htmlspecialchars. Параметры тегов с динамическими значениями ограничивать двойными кавычками. Принудительно добавлять протокол (http), где это необходимо, для значений параметров тегов, таких как href или src.
Этот тип уязвимости связан с тем, что если каким либо образом заставить браузер целевого пользователя сделать запрос к уязвимому серверу, браузер сделает этот запрос с текущими куками этого пользователя, то есть в контексте авторизованного пользователя (если пользователь на тот момент был авторизован в системе)
А вот заставить сделать запрос можно очень просто. Например отправить форму через JS, или даже простая вставка «изображения» на форуме:
[IMG]http://site.ru/admin/useradmin/setstatus.php?user=hacker&status=superadministrator[/IMG]
И самое главное, уязвимости описанные в разделе «Атаки непосредственно на веб приложения», могут быть эксплуатирование через привилегированного пользователя через CSRF (в том случае, если уязвимые скрипты доступны только им).
Все запросы к критически важным действиям подписывать при помощи параметра, связанного с куками данного пользователя.
Еще Кевин Митник писал, что если хочешь что то знать - просто спроси. Злоумышленник может представится администратором форума, и попросить пароль у пользователя, или изменить пароль на какой то заданный. Или узнать «любимое блюдо», и т.п.
У злоумышленников существует ряд методов для введение в заблуждение пользователей, с целью получения нужных им данных.
Проводить просветительскую работу среди пользователей.
Тут все просто. Создается подставной вебсайт, который повторяет дизайн целевого сайта, и имеет похожий URL. Например lc-bitrix.ru (тут первый символ — «эль» а не «один»), на него заманивается пользователь в надежде что он введет свои логин и пароль, котрые будут доступны злоумышленникам. Уязвимость может быть использована совместно с XSS и CSRF
Проводить просветительскую работу среди пользователей.