Введение
sqlmap — это мощный инструмент для тестирования на проникновение с открытым исходным кодом, который автоматизирует процесс обнаружения и эксплуатации уязвимостей SQL-инъекций. По умолчанию sqlmap выполняет тесты последовательно, отправляя по одному запросу за раз. Хотя это надежно, это может быть медленно, особенно для сложных веб-приложений или при выполнении тестов на основе времени (time-based blind injection).
В этой лаборатории вы узнаете, как значительно ускорить сканирование sqlmap, используя опцию --threads. Этот флаг позволяет sqlmap выполнять несколько HTTP-запросов одновременно, значительно сокращая общее время, необходимое для завершения сканирования. Вы выполните серию сканирований с разным количеством потоков и сравните результаты, чтобы наглядно увидеть улучшение производительности.
Выполнение базового сканирования с одним потоком
На этом этапе вы выполните базовое сканирование sqlmap, используя настройку по умолчанию с одним потоком. Это послужит нашей базой для измерения улучшений производительности на последующих этапах. Мы будем использовать команду time для точного измерения продолжительности сканирования.
Сначала выполните следующую команду в вашем терминале. Эта команда указывает sqlmap сканировать предоставленный URL (-u), перечислять базы данных (--dbs) и работать в неинтерактивном режиме (--batch). Мы перенаправим вывод в лог-файл, а также используем команду time для измерения времени выполнения.
(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch) 2>&1 | tee baseline_scan.log
После завершения сканирования вы увидите много вывода от sqlmap, а затем в самом конце — измерение времени. Это будет выглядеть примерно так:
... (вывод sqlmap) ...
[22:30:00] [INFO] fetching database names
[22:30:00] [INFO] the SQL query used returns 2 entries
[22:30:00] [INFO] retrieved: information_schema
[22:30:00] [INFO] retrieved: acuart
[22:30:00] [INFO] available databases [2]:
[*] acuart
[*] information_schema
[22:30:00] [INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/testphp.vulnweb.com'
[*] ending @ 22:30:00 /2023-10-27/
real 0m45.123s
user 0m5.456s
sys 0m0.789s
Наиболее важным для нас значением является real, которое представляет общее затраченное время (wall-clock time). Теперь сохраним этот результат в наш файл сравнения scan_times.log.
echo "Baseline (1 Thread): $(grep real baseline_scan.log | awk '{print $2}')" >> scan_times.log
Наконец, просмотрите содержимое лог-файла, чтобы убедиться, что базовое время было записано.
cat scan_times.log
Ваш вывод должен показать записанное время:
Baseline (1 Thread): 0m45.123s
Понимание назначения флага --threads
На этом этапе мы уделим время пониманию ключевой особенности этой лаборатории: флага --threads в sqlmap. На этом этапе нет команд для выполнения; цель состоит в том, чтобы понять концепцию перед ее применением.
Опция --threads используется для установки количества одновременных HTTP(s) запросов, которые sqlmap будет выполнять во время сканирования. Значение по умолчанию — 1.
Как это работает: Вместо отправки одного запроса и ожидания ответа перед отправкой следующего, sqlmap может открыть несколько "потоков" для одновременной отправки нескольких запросов. Этот параллелизм особенно эффективен для задач, включающих множество запросов, таких как:
- Фаззинг (fuzzing) на уязвимости.
- Брутфорс (brute-forcing) символов в имени базы данных (слепые SQL-инъекции).
- Извлечение больших объемов данных.
Преимущества:
- Скорость: Основное преимущество — значительное сокращение времени сканирования.
- Эффективность: Позволяет более эффективно использовать ваше сетевое соединение и системные ресурсы.
Соображения:
- Использование ресурсов: Увеличение количества потоков приведет к большему потреблению ресурсов процессора и памяти.
- Стабильность цели: Очень большое количество потоков может перегрузить нестабильный или плохо сконфигурированный веб-сервер, потенциально вызывая отказ в обслуживании (denial of service).
- Обнаружение: Агрессивное многопоточное сканирование с большей вероятностью будет обнаружено и заблокировано межсетевыми экранами веб-приложений (WAF) или системами обнаружения/предотвращения вторжений (IDS/IPS).
sqlmap позволяет установить количество потоков от 1 до максимум 10. На следующих этапах вы увидите, как изменение этого значения влияет на производительность сканирования.
Повторное выполнение сканирования с увеличенным количеством потоков (--threads=5)
На этом этапе вы примените свои знания флага --threads. Давайте повторим то же сканирование, что и раньше, но на этот раз увеличим количество одновременных запросов до 5.
Выполните следующую команду в вашем терминале. Она идентична первой команде, с добавлением --threads=5.
(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch --threads=5) 2>&1 | tee 5_threads_scan.log
После завершения сканирования вы должны заметить, что время real значительно меньше, чем при базовом сканировании.
Теперь добавим этот новый результат в наш файл scan_times.log для сравнения.
echo "5 Threads: $(grep real 5_threads_scan.log | awk '{print $2}')" >> scan_times.log
Давайте снова проверим содержимое лог-файла, чтобы увидеть оба результата.
cat scan_times.log
Теперь вывод покажет время как базового сканирования, так и сканирования с 5 потоками.
Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
(Примечание: Ваше время будет отличаться, но вы должны увидеть заметное снижение.)
Повторное выполнение сканирования с максимальным количеством потоков (--threads=10)
На этом этапе мы доведем производительность до предела, используя максимальное количество потоков, разрешенное sqlmap, которое составляет 10. Это продемонстрирует максимальный прирост производительности, которого можно достичь с этой опцией в обычных условиях.
Выполните команду сканирования в последний раз, установив количество потоков равным 10.
(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch --threads=10) 2>&1 | tee 10_threads_scan.log
Это сканирование должно быть еще быстрее предыдущего. После его завершения запишите результат в наш лог-файл.
echo "10 Threads: $(grep real 10_threads_scan.log | awk '{print $2}')" >> scan_times.log
Теперь просмотрите файл scan_times.log, чтобы увидеть все три скомпилированных результата.
cat scan_times.log
Вывод теперь будет содержать все три записи, что облегчит их сравнение на следующем этапе.
Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
10 Threads: 0m9.789s
(Примечание: Ваше время будет отличаться.)
Сравнение длительности сканирования и анализ изменений производительности
На этом заключительном этапе вы проанализируете собранные данные, чтобы сделать вывод об эффективности многопоточности в sqlmap.
Отобразим окончательные результаты, сохраненные в scan_times.log.
cat scan_times.log
Вы увидите вывод, похожий на этот, который наглядно показывает длительность каждого сканирования:
Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
10 Threads: 0m9.789s
(Примечание: Точное время будет отличаться в зависимости от сетевых условий и загрузки системы, но тенденция должна быть очевидной.)
Анализ: Как видно из результатов, при увеличении количества потоков время сканирования значительно сокращается.
- Переход от 1 к 5 потокам, вероятно, дал наиболее существенный прирост производительности.
- Переход от 5 к 10 потокам по-прежнему показывает улучшение, но оно может быть менее выраженным. Это связано с тем, что другие факторы, помимо количества потоков, такие как сетевая задержка или способность сервера обрабатывать одновременные запросы, начинают становиться узким местом.
Этот эксперимент наглядно демонстрирует, что использование флага --threads является простым, но очень эффективным способом оптимизации сканирования sqlmap.
Резюме
Поздравляем с завершением этой лабораторной работы! Вы успешно научились оптимизировать производительность сканирования sqlmap с использованием параллельных запросов.
В этой лабораторной работе вы:
- Выполнили базовое сканирование с одним потоком для установления эталона производительности.
- Узнали о назначении флага
--threads, его преимуществах и особенностях. - Выполнили сканирование с 5 и 10 потоками, чтобы наблюдать за влиянием на длительность сканирования.
- Сравнили результаты и подтвердили, что увеличение количества потоков значительно сокращает время сканирования.
Овладение такими опциями, как --threads, имеет решающее значение для проведения эффективных и своевременных тестов на проникновение. Помните об ответственном использовании этой возможности, поскольку агрессивное сканирование может негативно сказаться на целевой системе.


