Книга «Все об уязвимости XSS»Глава 1: Введение — Добро пожаловать в мир XSS 🎯 • История: как XSS стал королём веб-уязвимостей
Cross-Site Scripting не появился в один момент как громкая уязвимость с патчем и CVE. Это была эволюция — от безобидных экспериментов с HTML до одной из самых опасных и распространённых веб-угроз. Чтобы понять, почему XSS до сих пор на троне, нужно вернуться назад, в те времена, когда веб был молодым, наивным и совершенно беззащитным.
Ранние годы: когда веб был простым (и уязвимым)
Середина 90-х. Интернет только набирает обороты. Netscape Navigator и Internet Explorer сражаются за души пользователей. Веб-страницы — это в основном статичный HTML с парой картинок и текста. Но затем появляется JavaScript, и всё меняется.
JavaScript был создан Бренданом Айком в 1995 году за 10 дней (да, за десять ёбаных дней), и это объясняет многие его странности. Язык был добавлен в Netscape Navigator 2.0, чтобы сделать страницы интерактивными. Разработчики получили возможность валидировать формы, создавать анимацию, манипулировать DOM’ом. Это было революционно.
Но никто тогда не думал о безопасности. Концепция “пользовательский ввод может быть вредоносным” ещё не устоялась. Разработчики брали данные из URL, форм, cookies и просто вставляли их в HTML. Почему бы и нет? Это же удобно!
Первые случаи того, что мы сейчас называем XSS, начали появляться в конце 90-х. Но тогда это не воспринималось как серьёзная угроза. “Ну да, можно показать alert, и что?” — думали многие. Концепция того, что JavaScript может украсть данные или захватить сессию, ещё не была очевидной для большинства.
2000-е: рождение термина и осознание проблемы
Термин “Cross-Site Scripting” появился примерно в 1999-2000 годах. Название немного вводит в заблуждение — атака не обязательно “cross-site” в современном понимании, но изначально фокус был на том, что злоумышленник может внедрить скрипт на одном сайте, который будет выполняться в контексте другого (через iframe’ы и редиректы).
Аббревиатура XSS (а не CSS) появилась, чтобы избежать путаницы с Cascading Style Sheets. Хотя иронично, что позже появились и CSS-injection атаки, но это уже другая история.
В начале 2000-х веб начал становиться интерактивным. Форумы, доски объявлений, гостевые книги — всё это требовало пользовательского контента. И везде были XSS. Классический сценарий: форум, где можно оставить комментарий с HTML-тегами, и никто не проверяет, что именно ты вставил.
Хакеры быстро поняли потенциал. В 2001-2003 годах начали появляться первые публичные эксплойты. Самый известный — черви для социальных сетей и форумов, которые через XSS копировали себя в профили других пользователей. Это были прото-вирусы эры Web 2.0.
MySpace и Samy: XSS-червь, который потряс мир
Если говорить о моменте, когда XSS вышел из тени и стал знаменитым, это 2005 год и червь Samy.
Самир Камкар (Samy Kamkar) был 19-летним хакером, который нашёл XSS-уязвимость в MySpace — тогда крупнейшей социальной сети. MySpace позволял пользователям кастомизировать свои профили с помощью HTML и CSS, но якобы фильтровал опасный контент.
Samy обошёл фильтры, используя комбинацию JavaScript, закодированного через CSS-свойства, и создал червя. Червь делал следующее: когда кто-то просматривал профиль Samy, JavaScript автоматически добавлял Samy в друзья, копировал себя в профиль жертвы с надписью “but most of all, samy is my hero”, и процесс повторялся.
За 20 часов червь заразил более миллиона профилей. MySpace был парализован. Это был первый массовый XSS-червь в истории, и он показал всему миру, что XSS — это не просто показать alert, а реальное оружие массового поражения.
Самого Samy арестовали, он получил условный срок и запрет на использование компьютеров (который позже был снят). Но червь Samy стал легендой и доказательством того, что XSS может масштабироваться до эпидемии.
Web 2.0 и золотая эра XSS
Середина и конец 2000-х — это расцвет Web 2.0. AJAX, динамический контент, пользовательский интерфейс, который обновляется без перезагрузки страницы. jQuery становится стандартом де-факто. Всё больше логики переносится на фронтенд.
И с каждым новым фреймворком, с каждой новой библиотекой появлялись новые способы облажаться. DOM-based XSS стал особенно популярным, потому что разработчики забывали, что JavaScript, обрабатывающий URL или данные из localStorage, тоже может быть уязвим.
В это же время XSS начал активно эксплуатироваться в реальных атаках:
Фишинг через XSS. Злоумышленники находили XSS на легитимных сайтах, внедряли поддельные формы логина и крали учётные данные. Пользователи видели знакомый домен в адресной строке и доверяли.
Кража cookie и session hijacking. С ростом количества веб-приложений, которые хранили сессии в cookie, XSS стал прямым путём к захвату аккаунтов.
Распространение малвари. XSS использовался для редиректа на страницы с эксплойтами браузеров. В эпоху Internet Explorer 6 это было особенно эффективно — браузер был дырявым, как сито.
OWASP и стандартизация угрозы
В 2003 году появился OWASP (Open Web Application Security Project), и XSS сразу попал в их первый список Top 10 самых критичных веб-уязвимостей. С тех пор XSS не покидал этот список ни разу, хотя его позиция менялась.
В OWASP Top 10 2007 XSS был на первом месте. В 2010 — на втором. В 2013 и 2017 — на седьмом, но с пометкой, что он всё ещё чрезвычайно распространён. В 2021 XSS был объединён с injection-атаками в категорию A03:2021 – Injection, но фактически остался одной из главных угроз.
OWASP не просто констатировал проблему — они создали стандарты защиты, библиотеки, чек-листы. Но проблема в том, что знание о XSS и умение защититься от него — это разные вещи.
Эра bug bounty: XSS как источник дохода
2010-е годы принесли новую эру — bug bounty программы. HackerOne, Bugcrowd, Synack и другие платформы дали хакерам легальный способ зарабатывать на поиске уязвимостей.
XSS стал одной из самых популярных находок. Почему?
Их много. В отличие от SQL injection, которые становятся всё реже благодаря ORM’ам, XSS продолжают плодиться.
Их легко найти. Базовые инструменты типа Burp Suite + немного мануального тестирования = высокие шансы на успех.
Они хорошо оплачиваются. Stored XSS на критичной функциональности может принести $5k-$20k, а иногда и больше.
Статистика HackerOne за 2020-2024 годы показывает, что XSS стабильно в топ-3 по количеству репортов. Некоторые исследователи специализируются исключительно на XSS и зарабатывают шестизначные суммы в год.
Громкие уязвимости: когда XSS попадал в заголовки
За последние 20 лет XSS находили везде, где только можно:
Twitter* (запрещен в РФ) (2010). XSS-червь, который автоматически ретвитил себя. Похоже на Samy, только для птички.
Facebook* (запрещен в РФ) (множество раз). Несмотря на огромные инвестиции в безопасность, XSS находили в мессенджере, на страницах профилей, в рекламной платформе.
Google (постоянно). Даже поисковый гигант с его армией security engineers не защищён. XSS находили в Gmail, Google Maps, YouTube, Google Drive.
GitHub (2019). Stored XSS в markdown-рендеринге. Учитывая, что на GitHub хранится код миллионов проектов, это была серьёзная проблема.
TikTok (2020). XSS позволял захватывать аккаунты пользователей через вредоносные ссылки. Учитывая миллиард пользователей, масштаб угрозы был огромен.
Каждая из этих находок показывала, что XSS — это не пережиток прошлого, а реальная и актуальная угроза.
Современность: почему XSS никуда не делся
Мы в 2025 году. У нас есть Content Security Policy, HTTPOnly cookies, современные фреймворки с автоматическим экранированием, статические анализаторы кода. Казалось бы, XSS должен был умереть.
Но нет. Вот почему:
Сложность растёт быстрее защит. Современные веб-приложения — это сотни тысяч строк кода, десятки зависимостей, микрофронтенды, GraphQL, WebAssembly. Каждая новая технология приносит новые векторы атак.
Легаси никуда не делся. Миллионы сайтов работают на старом коде. WordPress, Joomla, старые корпоративные порталы — всё это живёт десятилетиями и полно XSS.
Человеческий фактор. Разработчики делают ошибки. Один `dangerouslySetInnerHTML` в React, одна забытая проверка в Node.js — и готово.
Новые типы атак. Mutation XSS, DOM Clobbering, XS-Leaks — это эволюция классического XSS, которая обходит современные защиты.
Почему XSS — король
XSS держится на троне не просто потому, что он старый или распространённый. Он король потому, что:
Универсален. Работает на любой платформе, в любом браузере, на любом языке программирования.
Гибок. Может быть частью цепочки атак, может быть самостоятельным вектором.
Опасен. От простого defacement’а до полного захвата аккаунта.
Эволюционирует. Появляются новые техники, новые обходы, новые контексты.
История XSS — это история веба. От простых HTML-страниц до сложных SPA, от alert(1) до BeEF и XSS Hunter. И пока есть пользовательский ввод и JavaScript, XSS будет жить.
Добро пожаловать в игру, которая длится уже 25 лет и не собирается заканчиваться.
