Clickjacking (UI redressing)
Что такое Clickjacking?
Clickjacking — это атака на интерфейс, при которой пользователя обманывают, заставляя кликнуть по активному контенту на скрытом веб-сайте, кликая по какому-то другому контенту на сайте-приманке. Рассмотрим следующий пример:
Пользователь заходит на сайт-приманку (возможно, по ссылке из письма) и нажимает кнопку, чтобы выиграть приз. Не зная того, его обманули: он нажал альтернативную скрытую кнопку, и в результате произошла оплата счёта на другом сайте. Это пример атаки кликджекинга. Техника основана на встраивании невидимой, интерактивной веб-страницы (или нескольких страниц), содержащей кнопку или скрытую ссылку, например внутри iframe. Этот iframe накладывается поверх ожидаемого пользователем контента сайта-приманки. Эта атака отличается от межсайтовой подделки запросов (CSRF) тем, что от пользователя требуется действие, например нажатие кнопки, тогда как CSRF-атака зависит от подделки целого запроса без ведома пользователя и его участия.
Защита от CSRF-атак часто обеспечивается использованием CSRF-токена: сессионного одноразового числа (nonce). Атаки кликджекинга CSRF-токен не смягчает, поскольку целевая сессия устанавливается с контентом, загружаемым с подлинного веб-сайта, и все запросы происходят в рамках того же домена. CSRF-токены помещаются в запросы и отправляются на сервер как часть обычной сессии. Отличие от нормальной пользовательской сессии в том, что процесс происходит внутри скрытого iframe.
Лабораторные работы
Если вы уже знакомы с базовыми концепциями уязвимостей Clickjacking и просто хотите попрактиковаться в их эксплуатации на реалистичных, намеренно уязвимых целях, вы можете перейти ко всем лабораторным работам по ссылке ниже.
Как сконструировать базовую атаку Clickjacking
Атаки Clickjacking используют CSS для создания и манипулирования слоями. Атакующий встраивает целевой веб-сайт как слой iframe, наложенный на сайт-приманку. Пример с использованием тега style и параметров:
Iframe целевого сайта позиционируется в браузере так, чтобы целевое действие точно перекрывалось с сайтом-приманкой с помощью соответствующих значений ширины и высоты. Абсолютные и относительные значения позиционирования используются для обеспечения точного перекрытия целевого сайта и сайта-приманки независимо от размера экрана, типа браузера и платформы. Свойство z-index определяет порядок наложения слоёв iframe и сайта. Значение opacity задаётся как 0.0 (или близкое к 0.0), чтобы содержимое iframe было прозрачным для пользователя. Защита браузера от Clickjacking может применять пороговое обнаружение прозрачности iframe (например, Chrome версии 76 включает такое поведение, а Firefox — нет). Атакующий подбирает значения opacity так, чтобы добиться желаемого эффекта, не активируя защитные механизмы.
Clickbandit
Хотя вы можете вручную создать proof of concept Clickjacking, как описано выше, на практике это может быть довольно утомительно и отнимать много времени. При тестировании Clickjacking «в поле» мы рекомендуем использовать инструмент Burp Clickbandit. Он позволяет выполнить нужные действия на встраиваемой странице прямо в вашем браузере, а затем создаёт HTML-файл с подходящим Clickjacking-оверлеем. Вы можете сгенерировать интерактивный proof of concept за считанные секунды, не написав ни строки HTML или CSS.
Clickjacking с заранее заполненными полями формы
Некоторые веб-сайты, требующие заполнения и отправки формы, допускают предзаполнение полей формы с помощью параметров GET перед отправкой. Другие сайты могут требовать ввод текста до отправки формы. Поскольку значения GET являются частью URL, целевой URL можно модифицировать, чтобы включить значения по выбору атакующего, а прозрачная кнопка «submit» накладывается на сайт-приманку, как в базовом примере Clickjacking.
Скрипты защиты от фреймов (frame busting)
Атаки Clickjacking возможны всякий раз, когда сайты можно встраивать во фреймы. Следовательно, методы предотвращения основаны на ограничении возможности фреймирования для веб-сайтов. Распространённая защита на стороне клиента, реализуемая браузером, — использование скриптов «разрушения фреймов» (frame busting / frame breaking). Их можно внедрять через проприетарные браузерные JavaScript-дополнения или расширения, такие как NoScript. Скрипты часто создаются так, чтобы выполнять некоторые или все из следующих действий:
проверять и обеспечивать, что текущее окно приложения — главное (top) окно,
делать все фреймы видимыми,
предотвращать клики по невидимым фреймам,
перехватывать и сигнализировать пользователю о потенциальных атаках Clickjacking.
Техники frame busting часто зависят от браузера и платформы, и из-за гибкости HTML их обычно удаётся обойти. Поскольку frame busters — это JavaScript, настройки безопасности браузера могут препятствовать их работе, а то и вовсе браузер может не поддерживать JavaScript. Эффективный обходной путь против frame busters — использовать атрибут sandbox HTML5 iframe. Когда он установлен со значениями allow-forms или allow-scriptsи при этом значение allow-top-navigation опущено, скрипт frame buster можно нейтрализовать, поскольку iframe не может проверить, является ли он верхним окном:
И allow-forms, и allow-scripts разрешают указанные действия внутри iframe, но навигация верхнего уровня отключена. Это подавляет поведение frame busting, сохраняя функциональность в целевом сайте.
Комбинирование Clickjacking с атакой DOM XSS
До сих пор мы рассматривали Clickjacking как автономную атаку. Исторически Clickjacking использовался для действий вроде накрутки «лайков» на странице Facebook. Однако истинное влияние Clickjacking раскрывается, когда он используется как носитель для другой атаки, например DOM-based XSS. Реализация этой комбинированной атаки относительно проста при условии, что атакующий сначала выявил полезную нагрузку XSS. Полезная нагрузка XSS затем комбинируется с целевым URL iframe так, чтобы пользователь кликнул по кнопке или ссылке и тем самым исполнил атаку DOM XSS.
Многошаговый Clickjacking
Манипулирование вводом на целевом сайте может потребовать нескольких действий. Например, атакующий может захотеть обманом заставить пользователя что-то купить на розничном сайте, поэтому сначала нужно добавить товары в корзину, прежде чем разместить заказ. Эти действия атакующий может реализовать с помощью нескольких div или iframe. Такие атаки требуют высокой точности и аккуратности с точки зрения атакующего, чтобы быть эффективными и скрытными.
Как предотвращать атаки Clickjacking
Мы обсудили распространённый механизм предотвращения на стороне браузера — скрипты frame busting. Однако мы видели, что атакующему зачастую нетрудно обойти эти защиты. В результате были разработаны серверные протоколы, которые ограничивают использование iframe в браузере и смягчают Clickjacking.
Clickjacking — поведение на стороне браузера, и его успех или неудача зависят от функциональности браузера и соответствия действующим веб-стандартам и лучшим практикам. Защита на стороне сервера от Clickjacking обеспечивается определением и доведением до клиента ограничений на использование таких компонентов, как iframe. Однако эффективность защиты зависит от соблюдения браузерами и применения этих ограничений. Два механизма серверной защиты от Clickjacking — X-Frame-Options и Content Security Policy.
X-Frame-Options
Изначально X-Frame-Options был введён как неофициальный заголовок ответа в Internet Explorer 8 и был быстро принят другими браузерами. Заголовок предоставляет владельцу сайта контроль над использованием iframe или объектов, чтобы включение веб-страницы во фрейм можно было запретить директивой deny:
Либо фреймирование можно ограничить тем же origin, что и у сайта, используя директиву sameorigin
или конкретным сайтом, используя директиву allow-from:
X-Frame-Options реализуется непоследовательно в разных браузерах (например, директива allow-from не поддерживается в Chrome версии 76 или Safari 12). Однако при правильном применении в сочетании с Content Security Policy в рамках многоуровневой стратегии защиты он может обеспечить эффективную защиту от атак Clickjacking.
Content Security Policy (CSP)
Content Security Policy (CSP) — механизм обнаружения и предотвращения, обеспечивающий смягчение атак, таких как XSS и Clickjacking. Обычно CSP реализуется на веб-сервере как заголовок ответа следующего вида:
Где policy — строка с директивами политики, разделёнными точкой с запятой. CSP предоставляет браузеру клиента информацию о допустимых источниках веб-ресурсов, которую браузер может применять для обнаружения и перехвата вредоносного поведения.
Рекомендуемая защита от Clickjacking — включать директиву frame-ancestors в политику CSP приложения. Директива frame-ancestors 'none' по поведению подобна директиве deny в X-Frame-Options. Директива frame-ancestors 'self' в целом эквивалентна директиве sameorigin в X-Frame-Options. Следующая CSP разрешает фреймы только для того же домена:
Либо фреймирование можно ограничить именованными сайтами:
Чтобы использовать эффективную защиту против Clickjacking и XSS, CSP требует тщательной разработки, внедрения и тестирования и должна использоваться как часть многоуровневой стратегии защиты.
Last updated