使用 sqlmap 枚举目标服务器上的数据库

Kali LinuxBeginner
立即练习

引言

在本实验中,你将学习如何使用 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_schemamysqlperformance_schemaacuart

解析返回的数据库名称列表

在此步骤中,你将解析 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_schemamysqlperformance_schema 这样的数据库通常是系统级别的数据库。它们是数据库管理系统核心功能的一部分,通常包含元数据、数据库管理系统自身的账户以及性能统计信息。虽然它们有时可能被利用,但它们很少包含攻击者通常寻找的特定于应用程序的敏感数据。

另一方面,名称不是标准系统名称的数据库(例如,在我们示例中的 acuart,或者 webapp_dbusersproducts 等)通常是用户创建的数据库。这些数据库存储 Web 应用程序的实际数据,例如:

  • 用户凭据(用户名、哈希密码)
  • 客户信息
  • 产品目录
  • 财务记录
  • 其他专有业务数据

在进行渗透测试时,枚举完数据库后,你的重点应该转移到这些用户创建的数据库上。下一个合乎逻辑的步骤是枚举这些用户数据库中的表,然后是表中的列,最后是转储数据。

通过理解这种区别,你可以有效地定位后续的 sqlmap 命令,以提取最有价值的信息。例如,要枚举 acuart 数据库中的表,你将使用类似以下的命令:

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

此命令演示了你将如何进行到下一个数据提取阶段,专注于已识别的用户数据库。

总结

在这个实验中,你已成功学会如何使用 sqlmap 枚举目标服务器上的数据库。你首先了解了确认 SQL 注入成功的必要性。然后,你使用了 --dbs 标志来列出所有可用的数据库,并执行了命令以查看结果。最后,你学会了如何解析返回的数据库名称,区分系统数据库和可能更有价值的用户创建数据库。对于任何希望从易受攻击的 Web 应用程序中提取信息的渗透测试人员来说,这项技能都是基础。