Остаточний посібник з безпеки веб-додатків
У сучасному цифровому світі все — від ваших фінансів до медичної історії — зберігається в онлайні. Великі сервери зберігають ці дані, і вони легко доступні для будь-кого, хто має погані наміри і може їх використовувати, якщо тільки ви не подбали про їх належну безпеку.
Отже, як програмісту, забезпечити, щоб вебсайт, над яким ви працюєте, не став причиною втрати таких важливих даних? Цікаво? Читайте далі...
Щоб належним чином захистити дані, пов'язані з нашими веб-додатками, спочатку потрібно зрозуміти, які існують 8 різних типів веб-атак і які методи можна застосувати для захисту наших додатків від них, починаючи з:
Різні типи веб-атак, які можуть загрожувати вашому вебсайту
1.
Атаки на перевірку введених даних та ін’єкції
Ці атаки експлуатують те, як веб-додаток обробляє ненадійний ввід, з метою маніпулювати запитами або виконувати шкідливі команди. Вони мають 3 підтипи:
a. Атака SQL-ін’єкцією
b. Атака командною ін’єкцією
c. Атака No-SQL ін’єкцією
a. Атака SQL-ін’єкцією: Виникає, коли зловмисник маніпулює SQL-запитом додатка, щоб виконати небажані команди. Наприклад, якщо в
SELECT * FROM users WHERE email = 'email-input' AND password = 'pass-input';
користувач вводить email-input = ‘ OR ‘1’=’1, то результат буде повернуто всі значення, оскільки умова where завжди повертає true.
ПЕРЕДОПЕЧЕННЯ: Використовуйте параметризовані запити, уникайте інтерполяції рядків у SQL, перевіряйте та очищайте ввід.
b. Атака командною ін’єкцією: Дозволяє зловмиснику виконувати довільні системні команди на сервері.
Якщо:
system("ping #{params[:host]}")
і користувач вводить params[:host] = “127.0.0.1; rm -rf /”, то це може призвести до видалення всіх файлів на сервері.
ПЕРЕДОПЕЧЕННЯ: Уникайте використання системних команд з ненадійним ввідним даними, використовуйте бібліотеки, такі як Open3
, які відокремлюють ввід від команд.
c. Атака NoSQL ін’єкцією: Спрямована на бази даних NoSQL (наприклад, MongoDB) шляхом ін’єкції шкідливих запитів. Зловмисник може використати наступну команду для обходу аутентифікації.
User.where({"$where" => "this.name == 'admin' || true"})
ПЕРЕДОПЕЧЕННЯ: Використовуйте ORM, такі як ‘Mongoid’, для параметризованих запитів.
Запобігання атакам на аутентифікацію та авторизацію для вашої системи
2. Атаки на аутентифікацію та авторизацію
Ці атаки націлені на механізми, що перевіряють та авторизують користувачів. Вони мають 3 підтипи:
a. Атаки методом "грубої сили"
b. Перехоплення сесії
c. Ескалація привілеїв
a.
Атаки методом "грубої сили": Зловмисник намагається вгадати паролі за допомогою повторних спроб. Наприклад, зловмисник перевіряє всі можливі комбінації паролів для існуючого користувача вашого додатка.
ПЕРЕДОПЕЧЕННЯ: Обмежте кількість спроб входу за допомогою rack-attack
, блокуйте акаунти після кількох невдалих спроб, використовуйте CAPTCHA після кількох невдач.
b. Перехоплення сесії: Зловмисники викрадають токени сесії (через XSS або sniffing), щоб видавати себе за користувачів. Наприклад, справжній користувач увійшов у ваш додаток, а зловмисник викрадає токен сесії з заголовків, щоб отримати прямий доступ до додатка, використовуючи акаунт справжнього користувача.
ПЕРЕДОПЕЧЕННЯ: Використовуйте HTTPS та захищені cookies типу HttpOnly, регенеруйте ідентифікатори сесій після входу, скидайте сесії при виході або зміні пароля.
c. Ескалація привілеїв: Зловмисники отримують доступ до вищих рівнів привілеїв, часто маніпулюючи ролями.
Припустимо, що "Адміністративна панель" вашого додатку повинна бути видима тільки для адміністраторів, але зловмисник, який отримав доступ до акаунта звичайного користувача, намагається викликати API, призначений тільки для адміністраторів, і отримує дані.
ПЕРЕДОПЕЧЕННЯ: Забезпечте контроль доступу на основі ролей (наприклад, Pundit, CanCanCan), перевіряйте дозволи користувачів на рівні контролерів та моделей.
Атаки типу Cross-Site Scripting (XSS) та їх запобігання
3. Атаки Cross-Site
Ці атаки передбачають маніпулювання або використання веб-запитів та відповідей. Вони мають 2 підтипи:
a. Cross-Site Scripting (XSS)
b. Cross-Site Request Forgery (CSRF)
a. Cross-Site Scripting (XSS): XSS відбувається, коли зловмисник вставляє шкідливі скрипти на веб-сторінки, які переглядаються іншими користувачами.
Ці скрипти виконуються в контексті браузера жертви і можуть викрасти cookies або іншу чутливу інформацію, або навіть виконати дії від імені жертви.
Підкатегорії:
=> Stored XSS: Шкідливий скрипт зберігається в базі даних і відображається пізніше.
=> Reflected XSS: Шкідливий скрипт вбудовується в URL і виконується відразу.
=> DOM-based XSS: Скрипт інжектується в клієнтський JavaScript.
ПЕРЕДОПЕЧЕННЯ: Екрануйте та очищайте ввід за допомогою sanitize
або escape
, уникайте raw
у виглядах, реалізуйте Content Security Policy (CSP).
b. Cross-Site Request Forgery (CSRF): CSRF маніпулює увійшовшим користувачем, змушуючи його виконати небажану дію на довіреному сайті.
Зловмисник використовує автентифіковану сесію користувача для виконання небажаних дій, таких як зміна налаштувань акаунта або переказ коштів.
ПЕРЕДОПЕЧЕННЯ: Увімкніть захист від CSRF за допомогою protect_from_forgery
, використовуйте csrf_meta_tags
для включення CSRF токена на сторінці в `, перевіряйте заголовок
Origin` в API запитах.
Атаки на витік даних та доступ до об'єктів
4. Атаки на витік даних та доступ до об'єктів
Ці атаки використовують порушення контролю доступу та неналежне оброблення чутливих даних. Вони мають 3 підтипи:
a. Небезпечні прямі посилання на об'єкти (IDOR)
b. Уразливості масового призначення
c. Витік даних
a. Небезпечні прямі посилання на об'єкти (IDOR): Зловмисники маніпулюють посиланнями на об'єкти (наприклад, ID), щоб отримати доступ до несанкціонованих даних.
URL на кшталт /users/1234
може дозволити змінити ID на /users/1235
, щоб отримати доступ до даних іншого користувача.
ПЕРЕДОПЕЧЕННЯ: Перевіряйте право власності на об'єкт за допомогою current_user.id == User.find(params[:id]).id
, використовуйте непередбачувані ідентифікатори (наприклад, UUID).
b. Уразливості масового призначення: Зловмисники використовують масові оновлення для зміни чутливих атрибутів. Наприклад, зловмисник змінює роль вже скомпрометованого користувача на адміністратора, оновлюючи інші дані користувача.
ПЕРЕДОПЕЧЕННЯ: Використовуйте сильні параметри, наприклад, params.require(:user).permit(:name, :email)
, для версій до Rails 3.2 використовуйте attr_protected
.
c. Витік даних: Чутливі дані, такі як паролі або API ключі, можуть бути витікнуті.
ПЕРЕДОПЕЧЕННЯ: Шифруйте чутливі дані за допомогою шифрувальних API Rails і маскуйте чутливі дані в логах.
Атаки типу Distributed Denial of Service (DDoS) та їх запобігання
5.
Атаки типу Distributed Denial of Service (DDoS)
Ці атаки спрямовані на порушення доступності сервісу за допомогою різних технік. Вони мають 2 підтипи:
a. HTTP-флудинг
b. Витрачання ресурсів
a. HTTP-флудинг: Зловмисники перевантажують сервери великою кількістю запитів. Чи пам'ятаєте, коли сайт BookMyShow впав, як тільки стартував продаж квитків на концерт ColdPlay? Так, атака була схожа на ту.
ПЕРЕДОПЕЧЕННЯ: Використовуйте middleware для обмеження кількості запитів, як-от rack-attack
, кешуйте відповіді за допомогою механізмів кешування Rails.
b. Витрачання ресурсів: Зловмисники виснажують ресурси сервера, використовуючи операції з високою вартістю. Дуже свіжим прикладом є уразливість CVE-2022–20426 в операційній системі Android.
Виявлена в 2022 році, ця вразливість призводила до аварійного завершення роботи Android-пристрою, коли користувач обирав обліковий запис телефону, що створювало кілька копій і виснажувало пам'ять пристрою.
ПЕРЕДОПЕЧЕННЯ: Обмежуйте розмір файлів для завантаження за допомогою config.active_storage
, перевіряйте введені дані, щоб уникнути надмірного використання ресурсів.
Атаки на завантаження файлів та десеріалізацію
6. Атаки на завантаження файлів та десеріалізацію
Веб-додатки часто обробляють вміст, створений користувачами, наприклад, завантаження файлів, або десеріалізують дані для підвищення продуктивності та гнучкості. Однак ці процеси можуть призвести до серйозних вразливостей безпеки, якщо їх неправильно обробляти. Щоб краще зрозуміти, давайте розглянемо їх 2 підтипи:
a. Зловмисне завантаження файлів
b. Небезпечна десеріалізація
a. Зловмисне завантаження файлів: Зловмисник завантажує файли, що містять шкідливі скрипти або віруси, для пошкодження системи.
Припустимо, що в систему було завантажено файл, який містив вірус, здатний пошкодити всю систему.
ПЕРЕДОПЕЧЕННЯ: Перевіряйте типи та розміри файлів за допомогою гемів, таких як carrierwave
або shrine
, зберігайте завантажені файли в безпечному місці, а не в кореневому каталозі.
b. Небезпечна десеріалізація: У цьому типі атаки експлуатується небезпечна десеріалізація для виконання шкідливих payload. У 2017 році критична вразливість у Apache Struts 2, популярному відкритому веб-фреймворку, дозволила зловмисникам виконати віддалений код через небезпечну десеріалізацію.
Ця вразливість стала причиною масового витоку даних компанії Equifax, що призвело до розкриття особистої інформації 147 мільйонів людей.
ПЕРЕДОПЕЧЕННЯ: Уникайте десеріалізації ненадійних введень і використовуйте парсери JSON або YAML, які не виконують код.
Помилки в налаштуваннях та їх використання зловмисниками
7. Помилки конфігурації та вразливості безпеки
Як випливає з назви, ці атаки відбуваються, коли відсутнє необхідне налаштування або є неправильне налаштування в додатку.
Наприклад:
a. Відсутність заголовків, таких як X-Content-Type-Options
та CSP, дозволяє атаки типу XSS.
b. Чутливі дані для налагодження (наприклад, стек-трейси) залишаються в консолі, що дозволяє користувачам бачити ці дані.
ПЕРЕДОПЕЧЕННЯ: Вимикайте детальні повідомлення про помилки в продакшн-середовищі, використовуючи config.consider_all_requests_local = false
, використовуйте власні сторінки помилок для продакшн.
Атаки на бізнес-логіку
У цьому випадку зловмисник використовує слабкі місця або крайні випадки, які не були належним чином оброблені в логіці додатку.
Наприклад: Купон на знижку може використовуватись безкінечно через відсутність валідації.
ЗАПОБІЖЕННЯ: Тестуйте крайні випадки в бізнес-логіці, перевіряйте робочі процеси та забезпечуйте виконання переходів станів у моделях.
Загальні найкращі практики:
- Регулярно оновлюйте Rails і залежності: Залишайтеся захищеними від відомих вразливостей.
- Проводьте аудити безпеки: Використовуйте інструменти, такі як Brakeman для статичного аналізу.
- Використовуйте безпекові геми: Використовуйте геми, такі як
rack-attack
,rack-cors
,secure-headers
іbrakeman
для забезпечення безпеки ваших додатків. - Навчайте свою команду: Обізнаність про загальні вразливості забезпечує кращу профілактику.
Щоб дізнатися більше про безпеку додатків, ознайомтесь з rails-guides, rack-attack, rack-cors, secure-headers і brakeman для інформації, специфічної для Rails, а також XSS для атак Cross-Site Scripting.
Резюме:
Залишатися в курсі актуальних оновлень та перевіряти ваші додатки на наявність різних загроз безпеці дуже важливо.
Ми ніколи не знаємо, як найменша недбалість може забрати роки роботи та призвести до правових наслідків. Тому,
Будьте обізнаними, будьте пильними!
Ми тут, щоб зміцнити спільноту, ділячись нашим знанням. Слідкуйте за мною та моєю командою, щоб бути в курсі найновіших досягнень у світі веб- та мобільних технологій.
Перекладено з: The Ultimate Guide to Web Application Security: Types of Attacks, Prevention Techniques, and Best Practices