使用 sqlmap 针对特定数据库管理系统进行扫描

Kali LinuxBeginner
立即练习

引言

在本实验中,你将学习如何使用 sqlmap,一个强大的开源渗透测试工具,它可以自动化检测和利用 SQL 注入漏洞的过程。具体来说,你将专注于一项关键的优化技术:针对特定的后端数据库管理系统 (DBMS)。

默认情况下,sqlmap 会测试各种数据库系统,这可能会耗费大量时间。通过指定目标 DBMS(如 MySQL、PostgreSQL 或 MSSQL),你可以显著加快扫描过程,减少发送到服务器的请求数量,并使你的测试更有效率。

我们已经为你预先配置了一个易受攻击的 Web 应用程序供你练习。本实验的目标 URL 是:http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit#

让我们开始吧!

识别后端可能的 DBMS (例如 MySQL, PostgreSQL)

在此步骤中,你将运行一个基础的 sqlmap 扫描,让它自动识别后端数据库系统。这是渗透测试中常见的首要步骤。此处收集的信息将帮助我们在后续步骤中优化攻击。

我们将使用 --batch 标志,让 sqlmap 以其对所有问题的默认回答运行,使扫描过程非交互式。我们还需要提供一个会话 cookie 来访问易受攻击的页面。对于本实验,cookie 是 security=low; PHPSESSID=labex

在你的终端中执行以下命令:

sqlmap -u "http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=labex" --batch

sqlmap 将开始其测试过程。密切关注输出。经过一系列测试后,sqlmap 将打印出关于 Web 服务器操作系统、Web 服务器技术以及最重要的一点——后端 DBMS 的信息。

你应该会看到类似以下的输出(部分细节可能有所不同):

[INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: PHP 8.1.2, Apache 2.4.52
back-end DBMS: MySQL >= 5.0

如你所见,sqlmap 已将后端数据库识别为 MySQL。这是我们接下来将使用的关键信息。

使用 --dbms 标志指定目标系统

在此步骤中,你将学习 --dbms 标志,这是本实验的核心。既然我们已从上一步得知目标正在运行 MySQL,那么 sqlmap 就无需浪费时间去测试 PostgreSQL、Oracle 或 Microsoft SQL Server 等其他数据库系统。

--dbms 标志允许你告知 sqlmap 精确测试哪个数据库系统。这使得该工具的效率大大提高。

语法很简单:
--dbms=DBMS_NAME

DBMS_NAME 替换为目标数据库的名称。以下是一些常见的值:

  • MySQL
  • PostgreSQL
  • MSSQL (Microsoft SQL Server)
  • Oracle
  • SQLite
  • Access

通过提供此信息,你指示 sqlmap 只使用特定于指定 DBMS 的 payload 和技术。这是在实际场景中有效使用 sqlmap 的一项基本技能。在下一步中,你将把此标志应用于新的扫描。

使用 --dbms=MySQL 执行扫描

在此步骤中,你将再次执行 sqlmap 扫描,但这次会添加 --dbms=MySQL 标志。这将指示 sqlmap 根据我们在步骤 1 中收集到的信息,将其精力集中在 MySQL 特定的测试上。

在你的终端中运行以下命令。它与之前的命令相同,只是添加了新的标志。

sqlmap -u "http://localhost/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=labex" --dbms=MySQL --batch

扫描将立即开始。你会注意到 sqlmap 的初始输出确认它正在强制后端 DBMS 为 MySQL。

[INFO] forcing back-end DBMS to 'MySQL'

让扫描运行完成。在下一步中,我们将分析结果并与我们的第一次扫描进行比较。

观察到 Payload 数量减少和识别速度加快

在此步骤中,你将观察到使用 --dbms 标志的直接好处。主要优势是执行的测试数量显著减少,完成时间大大缩短。

如果将步骤 3 的扫描输出与步骤 1 的第一次扫描进行比较,你会注意到一个关键区别。第一次扫描花费时间尝试识别数据库,运行通用测试然后缩小范围。然而,第二次扫描跳过了所有这些步骤。

目标扫描的输出将显示 sqlmap 只运行与 MySQL 相关的测试。你不会看到它测试 PostgreSQL 或 Oracle 等其他系统。

例如,一次通用扫描可能会针对多种数据库的各种 SQL 注入类型测试数百个 payload。然而,目标扫描只会运行已知对 MySQL 有效的 payload。这会带来:

  • 更少的 HTTP 请求: 该工具发送给目标服务器的请求数量明显减少。
  • 更快的执行速度: 整体扫描时间大大缩短。

这种效率在渗透测试中至关重要,因为时间通常是有限的,并且最小化网络流量有助于避免被防火墙或入侵检测系统 (IDS) 检测到。

理解此方法如何通过减少测试用例来优化攻击

在最后一步,让我们巩固对为什么针对 DBMS 是优化最佳实践的理解。

sqlmap 被设计为一个全面的工具。在没有任何指导的情况下,其默认行为是假设它对目标一无所知。因此,它会运行大量的测试来覆盖多种可能性:

  1. 指纹识别 (Fingerprinting): 它首先尝试通过发送各种查询并分析响应来确定 DBMS 类型。每个数据库都有独特的函数、错误消息和行为,可以揭示其身份。
  2. 广泛测试: 然后它会测试不同的 SQL 注入技术(基于布尔的盲注、基于时间的盲注、错误注入、UNION 查询等)。
  3. 特定 DBMS 的 Payload: 对于每种技术,它会尝试适用于不同数据库系统的 payload。

这种“暴力破解”方法虽然彻底但如果目标已知或可以快速猜测后端,则效率低下。

通过使用 --dbms=MySQL,你是在告诉 sqlmap 完全跳过步骤 1,并且只使用步骤 3 中与 MySQL 相关的 payload。这从其工作流程中删除了大量的测试用例。

这种优化提供了三个关键优势:

  • 速度: 扫描完成得更快,因为它没有运行不必要的测试。
  • 隐蔽性: 更少的请求意味着 Web 服务器日志中的“噪音”更少,从而降低了触发警报的可能性。
  • 效率: 它将工具的强大功能集中在最可能的攻击向量上,增加了成功且快速发现的机会。

掌握 --dbms 等标志可以将 sqlmap 从一个简单的自动化扫描器转变为一个精确且具有手术刀般精准度的测试工具。

总结

在本实验中,你学习了一种优化 sqlmap 扫描的关键技术。你亲眼目睹了识别后端数据库管理系统 (DBMS) 然后使用 --dbms 标志如何能显著提高 SQL 注入测试的效率。

你首先运行了一个通用扫描来识别后端为 MySQL。然后,你了解了 --dbms 标志并使用它运行了一个目标扫描。通过比较这两种方法,你观察到目标扫描速度明显更快,因为它消除了大量不相关的测试用例。

这种聚焦工具的原则是有效渗透测试中的一个基本概念。恭喜你完成了这个实验,并在你的工具箱中增加了一项关键的 sqlmap 技能!