Уязвимости, которые могут доставить вам хлопот

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Автор: Низамутдинов Марсель, специалист по информационной безопасности компании "1С-Битрикс"

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

Атаки непосредственно на веб приложения
Атаки на веб приложение осуществляются непосредственно, без всякого участия других клиентов.

SQL инъекция
Классическая уязвимость, которая связана с недостаточной фильтрацией данных, используемых в SQL запросах. Это критическая уязвимость приводит к тому, что нападающий может выполнить произвольные SQL запросы к базе данных. Например получить значение произвольных таблиц, изменить некоторые значения (сделать себя админом), удалить данные, и всю базу данных целиком.

Как защищаться
Для числовых данных, явно приводить значение к нужному типу (int, float и тп), для строковых данных, обрабатывать данные при помощи addslashes, mysql_escape_string и т.п.. А также, контролировать длину данных.

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

Одной из самых страшных разновидностей данной уязвимости считается PHP инъекция. Эта уязвимость связана с использованием внешних данных внутри функции include и т.п. Нападающий может изменить имя файла таким образом, чтобы включить и выполнить в контексте уязвимого сайта произвольный PHP файл. Существует "удаленный" вариант данной уязвимости, когда как PHP файл, на уязвимом сервере выполняется удаленный HTTP документ.

У нападающего есть ряд приемов, для того чтобы облегчить эксплуатацию уязвимости. Например символ (приведено url encoded значение) %00, в языке Си (на котором написан PHP), обозначает конец строки. И внедрение этого символа в имя файла, заставит PHP игнорировать часть имени файла, после этого символа.

Как защищаться
Лучше всего не использовать динамику в именах файлов. Но там, где ее использовать все таки необходимо, проводить явную проверку допустимости имени файла (или его части) из явно определенного разрешенного множества значений.
Например, разрешать только латинские буквы и цифры, и т.п. Множество должно быть задано исходя из поставленных задач.

Внедрение в system и т.п.
Уязвимость связана с недостаточно фильтрацией данных, вставляемый в аргумент функции system и т.п. Например system(“ping $_GET[host]”); Нападающий сможет выполнить произвольный код в системе.

Как защищаться
Проводить явную проверку допустимости значения таких переменных из явно определенного разрешенного множества значений. Например, разрешать только латинские буквы и цифры, и т.п. Множество должно быть задано исходя из поставленных задач. Также, можно использовать функции типа escapeshellcmd и escapeshellarg.

Подбор реквизитов доступа
Тут все просто. Нападающий может подобрать простые пароли. Нападающий сможет подобрать короткие идентификаторы сессии.

Как защищаться
Использовать сложные пароли. Использовать достаточно случайные, и достаточно длинные идентификаторы сессии.

Логические ошибки
Логические ошибки в коде, тип ошибок который наиболее тяжело диагностируется и имеет наибольшее разнообразие. Логическая ошибка в коде возникает, когда при некоторых ситуациях код работает не так как предполагается. Пример логической ошибки — использование неинициализированных переменных в коде. В зависимости от настроек PHP, такая переменная может быть проинициализирована из GET параметров, и выполнение кода становится непредсказуемым.

Как защищаться
Четко строить ТЗ. Писать простой, ясный, понятный, структурированный код.

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

XSS
Межсайтовый скриптинг (XSS) уязвимость возникает тогда, когда данные, принятые от пользователя, выводятся в броузер без надлежащей фильтрции. Уязвимость может быть использована для изменения вида HTML страниц уязвимого сайта в контексте браузера целевого пользователя, похищения COOKIE данных браузера целевого пользователя, с последующим внедрением в его сессию, под его учетной записью.

Существует отдельный вектор реализации XSS уязвимости (XSS proxy), при котором злоумышленник получает двухсторонний контроль над уязвимым сайтом, и может производить действия с уязвимым сайтом от имени администратора сервера, с его учетной записью и его IP адресом!

Как защищаться
Использовать htmlspecialchars. Параметры тегов с динамическими значениями ограничивать двойными кавычками. Принудительно добавлять протокол (http), где это необходимо, для значений параметров тегов, таких как href или src.

CSRF
Этот тип уязвимости связан с тем, что если каким либо образом заставить браузер целевого пользователя сделать запрос к уязвимому серверу, браузер сделает этот запрос с текущими куками этого пользователя, то есть в контексте авторизованного пользователя (если пользователь на тот момент был авторизован в системе)

А вот заставить сделать запрос можно очень просто. Например отправить форму через JS, или даже простая вставка «изображения» на форуме:

http://site.ru/admin/useradmin/setstatus.php?user=hacker&status=superadministrator
И самое главное, уязвимости описанные в разделе «Атаки непосредственно на веб приложения», могут быть эксплуатирование через привилегированного пользователя через CSRF (в том случае, если уязвимые скрипты доступны только им).

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

Социальная инженерия
Еще Кевин Митник писал, что если хочешь что то знать - просто спроси. Злоумышленник может представится администратором форума, и попросить пароль у пользователя, или изменить пароль на какой то заданный. Или узнать «любимое блюдо», и т.п.

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

Как защищаться
Проводить просветительскую работу среди пользователей.

Фишинг
Тут все просто. Создается подставной вебсайт, который повторяет дизайн целевого сайта, и имеет похожий URL. Например lc-bitrix.ru (тут первый символ — «эль» а не «один»), на него заманивается пользователь в надежде что он введет свои логин и пароль, котрые будут доступны злоумышленникам. Уязвимость может быть использована совместно с XSS и CSRF

Как защищаться
Проводить просветительскую работу среди пользователей.