引言
在本实验中,你将探索 sqlmap 的一个强大功能:将本地文件写入远程服务器。此功能在渗透测试场景中至关重要,它允许你将 Web Shell、配置文件或其他恶意载荷上传到被攻陷的服务器。我们将介绍必要的先决条件,例如确认 DBA 权限和识别可写目录,然后逐步讲解在本地创建文件、使用 sqlmap 上传文件以及最后验证其在服务器上是否存在的过程。
确认 DBA 权限和目录写入权限
在此步骤中,你将使用 sqlmap 来检查当前数据库用户是否拥有 DBA (Database Administrator) 权限,并识别服务器上可写入的目录。拥有 DBA 权限通常是写入文件的先决条件,而了解可写入目录对于选择上传文件的目标位置至关重要。
首先,让我们检查 DBA 权限。这非常关键,因为 sqlmap 通常需要高权限才能执行文件系统操作。
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --is-dba
你应该会看到指示用户是否为 DBA 的输出。查找类似 [INFO] the back-end DBMS user is a DBA 的行。
接下来,我们需要找到服务器上的一个可写入目录。sqlmap 可以通过尝试识别常见的可写入路径来帮助完成此操作。我们将使用 --file-write 选项,配合一个虚拟文件和一个常见的可写入目录(如 /tmp)进行测试。虽然我们此时尚未实际写入文件,但此命令可以帮助确认写入能力。
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write=/dev/null --file-dest=/tmp/test_write.txt --batch
--batch 标志告诉 sqlmap 使用默认答案来回答问题,这对于自动化很有用。如果命令执行时没有出现与权限相关的错误,则表明 /tmp 是可写入的。
--is-dba 的预期输出:
...
[INFO] checking if the back-end DBMS user is a DBA
[INFO] the back-end DBMS user is a DBA
...
测试写入权限的预期输出(可能有所不同,但请查找成功消息或无权限错误):
...
[INFO] the file '/tmp/test_write.txt' has been successfully written on the back-end DBMS file system
...
创建一个本地文件用于上传(例如 upload.txt)
在此步骤中,你将在本地机器(LabEx 环境)上创建一个简单的文本文件,打算将其上传到目标服务器。此文件可以包含任何内容,但对于本实验,我们将创建一个基本的文本文件来演示该过程。
导航到你主目录下的 project 文件夹,这是本实验环境中的默认工作目录。
cd ~/project
现在,使用 echo 命令和重定向创建一个名为 upload.txt 的文件,并包含一些内容。
echo "This file was uploaded from the LabEx environment!" > upload.txt
你可以使用 cat 命令来验证文件的内容:
cat upload.txt
预期输出:
This file was uploaded from the LabEx environment!
使用 --file-write 和 --file-dest 指定源文件和目标位置
在此步骤中,你将了解用于文件写入的 sqlmap 选项:--file-write 和 --file-dest。
--file-write: 此选项指定你想要上传的文件的本地路径。sqlmap将读取此文件的内容。--file-dest: 此选项指定sqlmap应将文件写入的远程服务器上的绝对路径。提供一个数据库用户具有写入权限的目录的路径至关重要。根据我们上一步的发现,/tmp/是一个不错的选择。
我们将使用这些选项准备 sqlmap 命令,但要到下一步才会执行它。这样可以让你先理解命令结构。
命令将如下所示:
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write="/home/labex/project/upload.txt" --file-dest="/tmp/uploaded_file.txt" --batch
让我们分解一下命令:
-u "http://localhost/vulnerable/index.php?id=1": 目标 URL,包含 SQL 注入漏洞。--file-write="/home/labex/project/upload.txt": 你在上一步创建的本地文件的完整路径。请记住~/project会展开为/home/labex/project。--file-dest="/tmp/uploaded_file.txt": 文件将在远程服务器上写入的完整路径。我们使用/tmp/作为目标目录,并将上传的文件命名为uploaded_file.txt。--batch: 用于自动化过程并接受默认选项。
花点时间回顾一下命令,并确保路径是正确的。
执行命令将文件上传到可写目录
在此步骤中,你将执行在上一步准备好的 sqlmap 命令,将 upload.txt 从你的本地机器上传到目标服务器的 /tmp/ 目录,并将其命名为 uploaded_file.txt。
执行 sqlmap 命令:
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write="/home/labex/project/upload.txt" --file-dest="/tmp/uploaded_file.txt" --batch
sqlmap 现在将尝试写入文件。你应该会看到 sqlmap 在尝试不同的文件上传技术时的进度。如果成功,sqlmap 将报告文件已写入。
预期输出(查找成功消息):
...
[INFO] the file '/tmp/uploaded_file.txt' has been successfully written on the back-end DBMS file system
...
此消息确认 sqlmap 认为它已成功将文件写入服务器上指定的目录。
使用 --file-read 命令验证文件是否成功上传
在最后一步中,你将验证文件是否确实已上传到服务器,并且其内容是否正确。你可以使用 sqlmap 的 --file-read 选项来完成此操作,该选项允许你从远程服务器读取文件。
使用 --file-read 选项,指定你在服务器上刚刚上传的文件的路径:
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-read="/tmp/uploaded_file.txt" --batch
sqlmap 将尝试读取文件并在终端中显示其内容。
预期输出:
...
[INFO] retrieved file content:
This file was uploaded from the LabEx environment!
...
如果你看到内容“This file was uploaded from the LabEx environment!”,则表示你的文件已成功上传并且可以从服务器读取。这证实了使用 sqlmap 将本地文件写入服务器的整个过程。
总结
在本实验中,你成功学习了如何利用 sqlmap 的文件写入功能。你首先确认了 DBA 权限并识别了目标服务器上可写的目录。然后,你创建了一个本地文件,并使用带有 --file-write 和 --file-dest 选项的 sqlmap 将其上传到服务器。最后,你使用 --file-read 选项从服务器读取文件内容,验证了上传的成功。这项技能在渗透测试中对于各种后渗透活动至关重要。


