Найти в Дзене
Кодовые решения

🔒 Мой опыт поиска и защиты от DOM XSS уязвимостей

Недавно я столкнулся с интересной и опасной уязвимостью — DOM-based XSS (межсайтовый скриптинг на основе DOM). Это не обычная XSS, которую ловят на сервере, а более хитрая атака, которая работает прямо в браузере жертвы. Расскажу, как я её обнаружил и что сделал, чтобы защитить свой проект. 🕵️‍♂️ DOM XSS возникает, когда JavaScript берёт данные из ненадёжного источника (например, из URL) и вставляет их в опасные места на странице (sinks), такие как: Пример уязвимого кода: Если злоумышленник подставит в URL что-то вроде: — то в браузере выполнится вредоносный скрипт. Обнаружил уязвимость в коде jQuery: Оказалось, если в хеше (#) передать <img src=x onerror=alert(1)>, то jQuery вставит его в DOM и выполнит код! DOM XSS — коварная уязвимость, потому что её не видно в исходном коде страницы (она работает уже в браузере). Но если проверять все места, где данные попадают в DOM, и использовать безопасные методы, риск можно минимизировать. Совет: всегда проверяйте сторонние библиотеки (jQuery
Оглавление

Недавно я столкнулся с интересной и опасной уязвимостью — DOM-based XSS (межсайтовый скриптинг на основе DOM). Это не обычная XSS, которую ловят на сервере, а более хитрая атака, которая работает прямо в браузере жертвы. Расскажу, как я её обнаружил и что сделал, чтобы защитить свой проект. 🕵️‍♂️

🤔 Что такое DOM XSS?

DOM XSS возникает, когда JavaScript берёт данные из ненадёжного источника (например, из URL) и вставляет их в опасные места на странице (sinks), такие как:

  • innerHTML
  • document.write()
  • eval()
  • и другие функции, которые могут выполнить код.

Пример уязвимого кода:

-2

Если злоумышленник подставит в URL что-то вроде:

-3

— то в браузере выполнится вредоносный скрипт.

🔍 Как я искал DOM XSS в своём проекте

  1. Проверил все места, где данные из URL попадают в DOM 🌐
    location.search, location.hash, document.referrer — всё это потенциальные источники атаки.
  2. Искал опасные функции (sinks) ⚠️
    innerHTML, outerHTML, document.write(), eval(), jQuery-методы (html(), append()) и другие.
  3. Тестировал с помощью простых payloads
    Вставлял
    "><script>alert(1)</script> и смотрел, сработает ли.

Обнаружил уязвимость в коде jQuery:

-4

Оказалось, если в хеше (#) передать <img src=x onerror=alert(1)>, то jQuery вставит его в DOM и выполнит код!

🛡️ Как я защитился от DOM XSS

  1. Экранировал данные перед вставкой в DOM 🛡️
    Использовал
    textContent вместо innerHTML, если не нужен HTML.
    Для динамического HTML применял санитайзеры, например
    DOMPurify.
  2. Отказался от опасных функций 🚫
    Заменил
    eval() на JSON.parse().
    Перестал использовать
    document.write().
  3. Настроил CSP (Content Security Policy) 🔒
    Добавил заголовок:
-5
  1. — это блокирует выполнение inline-скриптов.

💡 Вывод

DOM XSS — коварная уязвимость, потому что её не видно в исходном коде страницы (она работает уже в браузере). Но если проверять все места, где данные попадают в DOM, и использовать безопасные методы, риск можно минимизировать.

Совет: всегда проверяйте сторонние библиотеки (jQuery, AngularJS) — они тоже могут быть источником проблем!

А вы сталкивались с DOM XSS? Делитесь в комментариях! 👇

#Security #WebDev #XSS #Программирование