Предыстория

В этой статье разбирем XSS уязвимость, обнаруженную в парсере Reddit, который при определенном условии (запланированных постах)  не очищал гиперссылки. Уязвимость была не в живом контенте — она скрывалась в редакторе. Эта находка принесла $5000 вознаграждения.

Уязвимость за 60 секунд  

  • Цель: Запланированные посты на Reddit

  • Вектор: Вредоносная гиперссылка, встроенная с использованием javascript

  • Триггер: Редактирование запланированного поста через интерфейс  

  • Влияние: XSS на привилегированных пользователей (администраторов/модераторов) в один клик

Это была не классическая XSS уязвимость. Она требовала перехвата, модификации и точного времени — но как только она была запущена, JavaScript выполнялся свободно.

Пошаговый разбор

1) Создание запланированного поста

Перейдите на Reddit, создайте новый запланированный пост и вставьте любую нормальную гиперссылку. Это сработает, потому что запланированные посты проходят через немного другой процесс обработки.

2) Перехват запроса

Используйте Burp Suite (или любой прокси), чтобы перехватить запрос на отправку.  

Внутри полезной нагрузки запроса найдите разметку ссылки и измените её следующим образом:

"[Click me](javascript:alert('XSS'))"

Да, это все еще действительный Markdown, а Reddit RichText парсер обычно фильтрует это... не не здесь.

3) Отредактируйте запланированное сообщение

Теперь перейдите в список запланированных сообщений и нажмите "Редактировать" то, которое вы только что создали.

Бум. Наша XSS нагрузка все еще там. Он отображается как кликабельная ссылка.

Почему это работает и почему это страшно

- Клиентская валидация на Reddit работала нормально, но серверная фильтрация пропускалась во время запланированной публикации.

- В обычных постах, когда RichText преобразуется в Markdown, а затем в HTML, некорректные ссылки (такие как javascript:) удаляются.

- Но этот процесс срабатывает только после публикации поста. Так что во время редактирования вредоносная ссылка выживает.

- Если администратор или модератор нажмет на подделанную ссылку во время редактирования запланированного поста, JavaScript выполнится мгновенно.

Теперь представьте:

- Пост, который выглядит безобидно

- Проверенный модератором перед публикацией

- Один неверный клик = компрометация аккаунта

Влияние

- Целевая аудитория: администраторы, модераторы или привилегированные пользователи, проверяющие запланированный контент

- Тип уязвимости: Хранимая XSS (ограничена интерфейсом редактирования до публикации)

- Вектор атаки: Социальная инженерия (заставить модератора кликнуть)

- Вознаграждение: ? $5000

Как находить подобные баги

Этот баг не бросается в глаза, он скрыт в специфических рабочих процессах функций. Вот как разобраться с подобными проблемами:

Сосредоточьтесь на краевых функциях:

- Запланированный контент

- Черновики

- Предварительный просмотр

- История версий

Используйте эти инструменты:

- Burp Suite для перехвата и манипуляции запросами

- Чек-листы по Markdown для изучения поведения ввода/вывода

- Interactsh или XSSHunter для обнаружения слепой XSS

Тестируйте на:

- Несогласованность валидации (клиентская vs. серверная)

- Неправильно отфильтрованные схемы ссылок (javascript:, data: и т.д.)

- Различия в отображении между созданием, редактированием и предварительным просмотром

Советы для охотников

- Не ограничивайтесь просмотром финальных постов — проверяйте каждый предварительный просмотр, черновик и редактор.

- Гиперссылки с javascript: все еще являются одним из самых простых векторов XSS.

- Всегда сравнивайте, как система ведет себя до и после отправки.

Итоги

- Охотник: LaRevoltage (la_revoltage)

- Вознаграждение: $5,000

- ID отчета: 1930763

Заключительные мысли

Этот баг не касался загрузки SVG или соединения багов до RCE. Это была ссылка в незащищенном поле — видимая только тем, кто редактирует.

Пусть это станет вам напоминанием: настоящие уязвимости часто скрываются не в том, что уже запущено, а в том, что запланировано.

Спасибо за чтение!

Еще больше познавательного контента в Telegram-канале — Life-Hack - Хакер

Комментарии (1)


  1. gev
    13.07.2025 15:58

    А с другого домена можно было js загрузить?