Я думаю, что я не единственный, кто всегда получает вопрос «хорошо, но каково влияние» на отраженные результаты XSS, на который обычно трудно ответить и поместить его в контекст приложения. На этот раз особенно — это был загруженный информационный сайт, без входа в систему, даже без файлов cookie, ничего конфиденциального, что можно было бы украсть. Кроме того, поскольку это просто отражено, вы даже не можете правильно злоупотреблять тем, что сайт популярен.

TL DR:

скучный отраженный XSS + ошибка синтаксического анализа json локального хранилища + перекрестное кадрирование = отличный клиентский dos

С другой стороны, он запускал одну из хипстерских одностраничных фреймворков javascript для рендеринга большей части страницы, а также сохранял информацию о состоянии в локальном хранилище. Как и любой пентестер, я придерживался принципа запустить код, сначала получить постоянство, а потом выяснить, что можно с этим сделать”. Я возился с локальным хранилищем, и некоторые попытки фаззинга привели к ошибке синтаксического анализа json, которая не была обнаружена, поэтому это полностью сломало приложение.

Начнем с того, что с помощью XSS для записи искаженного json в локальное хранилище я мог бы создать DoS на стороне клиента, который будет действовать до тех пор, пока искаженный json не будет удален из локального хранилища, а сервер даже не узнает об этом (бонус пункт за тот факт, что контактная форма также обрабатывалась приложением).

Кроме того, на сайте разрешено междоменное фреймирование, поэтому, если вам удастся разместить полезную нагрузку html/js где-нибудь, вы даже можете загрузить сайт в невидимом iframe, чтобы пользователь ничего не заметил, пока не посетит сайт в следующий раз и замечает, что сайт не работает. Довольно неплохо для относительно безобидного XSS.

Я ожидал, что необработанные ошибки синтаксического анализа json не будут разовой проблемой, поскольку проблема на самом деле возникала очень редко при обычных условиях тестирования, поскольку JSON.parse обычно сопоставляется с JSON.stringify.

Поэтому я провел дополнительное исследование.

Я проверил несколько популярных модулей сохраняемости локального хранилища, связанных с реакцией/сокращением, и все они обрабатывали ошибки синтаксического анализа (ну, те, которые я проверял). Тем не менее, были некоторые популярные для vue.js, которые этого не сделали (на данный момент исправлено, поэтому, если вы их используете, вы можете обновить версии).

Короче говоря, похоже, проблема не банальная, но случается даже с более популярными модулями.

Короткое расследование с некоторыми крупными сайтами показало то же самое: очень популярные, огромные сайты полностью ломались, когда я добавлял случайную строку в локальное хранилище вместо json, большинство из этих случаев были (что не очень удивительно) связаны с некоторым состоянием или предпочтением пользовательский интерфейс.

Очевидно, что есть и другие кандидаты для того же типа эксплуатации. Вы можете использовать что-нибудь еще, что остается (например, файлы cookie), чтобы сделать его постоянным, а также любой другой тип необработанной ошибки (например, нулевые значения).

Для пентестеров

Просто чтобы быть уверенным: я хотел бы указать, что вам нужно иметь возможность модифицировать локальное хранилище, чтобы использовать такую ​​​​проблему, которая обычно может привести к чему-то худшему, чем DoS на стороне клиента в большинстве случаев. Тем не менее, это все же может стоить рассматриваю этот вариант.

Для разработчиков

Для использования этой проблемы требуется XSS, поэтому она может показаться не такой уж большой, но чтение этого абзаца занимает больше времени, чем добавление блока try/catch вокруг каждого вызова JSON.parse, который вы когда-либо писали в своей жизни. Особенно сейчас, когда я продолжаю добавлять ненужный текст! Поэтому, пожалуйста, убедитесь, что вы сделаете это в следующий раз, и просмотрите то, что у вас уже есть, и исправьте также существующие. В общем, также убедитесь, что вы в конечном итоге отлавливаете все ошибки в своем приложении.