Всё новое — это хорошо забытое старое: помнится, несколько лет назад в ЖЖ был баг, который позволял вставляемым в текст комментария элементам назначать абсолютное позиционирование. Фактически, всё описанное в данном посте базируется на этой идее.
Описанная уязвимость касается любых форм ввода, допускающих ввод пользовательского HTML-кода.
Т.к. идея назначения свойства position с помощью inline-стилей не нова, большинство сервисов фильтрует такие стили.
Развивая эту идею, попробуем назначить элементу уже существующий в вёрстке класс, имеющий необходимое значение нужного нам свойства.
Найти класс с необходимыми свойствами не представляет никакого труда, воспользовавшись поиском на вкладке CSS в FireBug'е:
Если бы у класса были какие-нибудь лишние свойства, то их можно было бы перекрыть с помощью inline-стилей.
Рассмотрим следующий код письма:
При просмотре такого письма в веб-интерфейсе пользователь увидит прекрасное:
Таким образом, наш div имеет абсолютное позиционирование и заслоняет собой другие элементы интерфейса.
Очевидно, что самая большая опасность такой уязвимости заключается в возможности сделать фишинговую форму авторизации. Пользователь при этом никуда не уходит с сайта и видит в строке броузера совершенно легитимный адрес. В сочетании с имеющей место CSRF-уязвимостью, можно вставить картинку с URL выхода из почты, в результате открытие письма и впрямь будет приводить к необходимости авторизации.
Для предотвращения проблем нужно исключить возможность использования классов в пользовательском HTML-коде: почта Рамблера, к примеру, добавляет к названиям классов префикс, почта Яндекса просто удаляет свойство class.
UPD.: Сотрудники Mail.Ru сделали отчаянную, но неудачную попытку исправить баг. ;-)
UPD. 2: После непродолжительной борьбы баг был исправлен.
Описанная уязвимость касается любых форм ввода, допускающих ввод пользовательского HTML-кода.
Т.к. идея назначения свойства position с помощью inline-стилей не нова, большинство сервисов фильтрует такие стили.
Развивая эту идею, попробуем назначить элементу уже существующий в вёрстке класс, имеющий необходимое значение нужного нам свойства.
Найти класс с необходимыми свойствами не представляет никакого труда, воспользовавшись поиском на вкладке CSS в FireBug'е:
Если бы у класса были какие-нибудь лишние свойства, то их можно было бы перекрыть с помощью inline-стилей.
Рассмотрим следующий код письма:
<div class="pAbs" style="top: 0; left: 0; width: 100%; height: 100%; background-color: pink; z-index: 65535;">
<h1>Привет, %username%!</h1>
</div>
При просмотре такого письма в веб-интерфейсе пользователь увидит прекрасное:
Таким образом, наш div имеет абсолютное позиционирование и заслоняет собой другие элементы интерфейса.
Очевидно, что самая большая опасность такой уязвимости заключается в возможности сделать фишинговую форму авторизации. Пользователь при этом никуда не уходит с сайта и видит в строке броузера совершенно легитимный адрес. В сочетании с имеющей место CSRF-уязвимостью, можно вставить картинку с URL выхода из почты, в результате открытие письма и впрямь будет приводить к необходимости авторизации.
Для предотвращения проблем нужно исключить возможность использования классов в пользовательском HTML-коде: почта Рамблера, к примеру, добавляет к названиям классов префикс, почта Яндекса просто удаляет свойство class.
UPD.: Сотрудники Mail.Ru сделали отчаянную, но неудачную попытку исправить баг. ;-)
UPD. 2: После непродолжительной борьбы баг был исправлен.