XSS тестирование с Playwright

Веб-приложения часто становятся мишенями для атак типа XSS (Cross-Site Scripting), когда злоумышленники вставляют вредоносный JavaScript код в страницы, которые потом выполняются на стороне клиента. Такая уязвимость может привести к краже данных, потере сессий пользователей или даже полной компрометации системы. Важно проверять защищенность приложений от таких атак во время тестирования. Использование Playwright для тестирования на уязвимость XSS позволяет эффективно автоматизировать эти проверки.

Основы XSS

XSS-атаки могут быть трех типов:

  • Stored XSS — вредоносный код сохраняется на сервере, и при запросе страницы выполняется в браузере у жертвы.
  • Reflected XSS — вредоносный код передается в URL или запросе и выполняется мгновенно.
  • DOM-based XSS — уязвимость возникает, когда код выполняется на основе манипуляций с DOM на стороне клиента.

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

Подготовка окружения для тестирования XSS с Playwright

Playwright — это мощный инструмент для автоматизированного тестирования веб-приложений, который позволяет имитировать действия пользователей в браузере. Он поддерживает все современные браузеры, включая Chromium, Firefox и WebKit, что позволяет тестировать приложения на разных платформах. Для работы с Playwright необходимо установить его и настроить окружение.

Установка Playwright

Для начала необходимо установить Playwright в проект:

npm install playwright

Затем создается базовый тестовый скрипт, который будет имитировать действия пользователя в браузере.

Основные техники для тестирования XSS

Playwright позволяет программно взаимодействовать с веб-страницами, подставлять данные в формы и отправлять их, а также манипулировать DOM. Это делает его идеальным инструментом для тестирования уязвимостей XSS. Рассмотрим несколько подходов к использованию Playwright для этой цели.

Автоматическое внедрение скриптов

Один из самых простых способов проверки на уязвимость XSS — это внедрение типичных вредоносных скриптов в поля ввода формы. Playwright позволяет автоматизировать этот процесс, создавая тесты, которые выполняют такие действия.

Пример кода для теста на внедрение скрипта:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com/login');

  // Внедрение вредоносного скрипта в форму
  await page.fill('#username', '<script>alert("XSS")</script>');
  await page.fill('#password', 'testPassword');
  await page.click('button[type="submit"]');

  // Ожидаем выполнения скрипта или проверки на его отсутствие
  page.on('dialog', dialog => {
    console.log(dialog.message());  // Вывод сообщения из диалога
    dialog.dismiss();
  });

  await browser.close();
})();

В этом примере внедряется простой XSS-скрипт (<script>alert("XSS")</script>) в поле для ввода имени пользователя. Если приложение уязвимо, при отправке формы будет выполнен JavaScript-код, что можно будет зафиксировать через события браузера, такие как dialog.

Тестирование на отраженные XSS

Для проверки отраженных XSS-уязвимостей важно подставить потенциально опасные строки в URL-адрес или параметры запросов. Для этого Playwright позволяет манипулировать URL и отслеживать, как веб-приложение отреагирует на введенные данные.

Пример кода для тестирования отраженных XSS:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  const maliciousInput = '<script>alert("Reflected XSS")</script>';

  // Отправка вредоносных данных через URL
  await page.goto(`https://example.com/search?q=${encodeURIComponent(maliciousInput)}`);

  // Проверка, что скрипт выполняется
  page.on('dialog', dialog => {
    console.log(dialog.message());  // Выводим сообщение из диалога
    dialog.dismiss();
  });

  await browser.close();
})();

В этом примере проверяется возможность внедрения скрипта через параметры URL (например, при поисковом запросе). Если приложение неправильно обрабатывает эти данные, то результатом будет выполнение JavaScript-кода.

Тестирование DOM-based XSS

Для тестирования DOM-based XSS важно проверять, как веб-приложение обрабатывает изменения в DOM. Злоумышленник может манипулировать параметрами URL или другим образом изменять страницу, что приведет к выполнению вредоносного кода. Playwright позволяет следить за изменениями в DOM и выполнять автоматические проверки.

Пример теста для DOM-based XSS:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  // Инъекция через URL
  await page.evaluate(() => {
    const maliciousInput = '<script>alert("DOM-based XSS")</script>';
    const searchParams = new URLSearchParams(window.location.search);
    const param = searchParams.get('q');

    if (param) {
      document.body.innerHTML += param;  // Потенциально опасная вставка
    }
  });

  // Ожидаем выполнения скрипта
  page.on('dialog', dialog => {
    console.log(dialog.message());  // Выводим сообщение из диалога
    dialog.dismiss();
  });

  await browser.close();
})();

Здесь мы изменяем содержимое страницы через манипуляции с параметрами URL и следим за выполнением скрипта, если приложение некорректно обрабатывает эти данные.

Дополнительные методы защиты от XSS

В процессе тестирования важно не только находить уязвимости, но и рекомендовать методы защиты от них. Вот несколько ключевых принципов, которые помогут предотвратить XSS-атаки:

  • Кодирование данных: Все данные, получаемые от пользователей, должны быть правильно экранированы перед выводом на страницу.
  • Content Security Policy (CSP): Использование CSP помогает ограничить выполнение нежелательных скриптов на странице.
  • Использование безопасных API: Использование методов типа textContent и innerText вместо innerHTML снижает риск внедрения JavaScript-кода.
  • Автоматизированные проверки: Регулярное проведение автоматических тестов с использованием Playwright или других инструментов помогает выявлять уязвимости на ранних стадиях разработки.

Заключение

Использование Playwright для тестирования на уязвимости XSS позволяет эффективно выявлять и устранять потенциальные угрозы на стадии разработки. С помощью автоматических скриптов можно проверять как стандартные XSS, так и более сложные типы атак, такие как DOM-based XSS. Важно помнить, что защита от таких атак требует комплексного подхода, включая корректное кодирование данных, использование безопасных API и внедрение механизмов защиты на сервере и в клиентском коде.