使用 sqlmap 对 GET 参数执行基本扫描

Kali LinuxBeginner
立即练习

引言

在本实验中,你将获得使用 sqlmap 的实践经验。sqlmap 是一款开源的渗透测试工具,可以自动化检测和利用 SQL 注入漏洞以及接管数据库服务器的过程。具体来说,你将专注于对 Web 应用程序的 GET 参数执行基本扫描,以识别潜在的 SQL 注入漏洞。对于任何从事 Web 安全或渗透测试的人来说,理解如何发起扫描和解读其初始输出是一项基本技能。本实验将指导你完成必要的步骤,从设置易受攻击的环境到执行你的第一个 sqlmap 命令并分析结果。

识别带有 GET 参数的目标 URL

在此步骤中,你将识别包含 GET 参数的目标 URL,sqlmap 将使用该参数来测试 SQL 注入漏洞。GET 参数通常在 URL 中问号 (?) 之后,后跟由与号 (&) 分隔的键值对。在本实验中,我们设置了一个简单的易受攻击的 PHP 应用程序,该应用程序通过 GET 接收一个 id 参数。

首先,打开 LabEx 环境内的 Web 浏览器。你可以通过点击桌面环境中的“Web Browser”图标来访问浏览器。

导航到以下 URL:http://localhost/index.php?id=1

观察页面内容。你应该会看到一个简单的输出,表明应用程序正在根据 id 参数显示数据。这证实了 id 参数是我们 sqlmap 扫描的合适目标。

使用 -u 选项构建基本扫描命令

在此步骤中,你将学习如何构建基本 sqlmap 命令来定位带有 GET 参数的特定 URL。用于指定目标 URL 的主要选项是 -u (或 --url)。

在 LabEx 环境中打开一个终端。默认用户是 labex,默认工作目录是 ~/project

sqlmap 扫描带有 GET 参数的 URL 的基本语法是:

sqlmap -u "http://example.com/page.php?param=value"

http://example.com/page.php?param=value 替换为我们的目标 URL。

对于我们的实验,目标 URL 是 http://localhost/index.php?id=1。因此,你将使用的命令是:

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

此命令告诉 sqlmap 开始扫描指定的 URL,并测试 id GET 参数是否存在 SQL 注入漏洞。

对目标 URL 执行扫描

现在你已经构建了 sqlmap 命令,是时候在终端中执行它了。这将启动自动化的 SQL 注入扫描。

在你的终端中,执行你在上一步构建的 sqlmap 命令:

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

sqlmap 将开始向 id 参数发送各种 payload,以测试不同类型的 SQL 注入漏洞。在扫描过程中,sqlmap 可能会问你几个问题。对于这个基本扫描,你通常可以通过按 Enter 来接受默认选项,或者在提示时输入 y 表示“是”。

例如,sqlmap 可能会问:
[INFO] 后端 DBMS 是 MySQL。你是否要跳过特定于其他 DBMS 的测试 payload? [Y/n]
输入 Y 并按 Enter

它也可能问:
对于 URL 'http://localhost/index.php?id=1',参数 'id' 似乎是可注入的。你是否要继续测试其他参数(如果有)? [y/N]
输入 N 并按 Enter 以专注于已识别的可注入参数。

扫描将继续进行,你将看到各种消息,指示进度和正在执行的测试。

        _
       ___ ___ ___ ___
      |_ -| . | . | . |
      |___|_  |_  |_  |
            |_| |_| |_|   3.7#stable
[INFO] starting @ 12:34:56 /2023-01-01/
[INFO] testing connection to the target URL
[INFO] checking if the target is protected by some kind of WAF/IPS
[INFO] the back-end DBMS is MySQL. Do you want to skip test payloads specific for other DBMSs? [Y/n] Y
[INFO] for the URL 'http://localhost/index.php?id=1', parameter 'id' appears to be injectable. Do you want to keep testing others (if any)? [y/N] N
[INFO] GET parameter 'id' is vulnerable.
... (truncated output) ...

分析初始扫描输出以识别注入点

sqlmap 扫描完成后,它将提供其发现的摘要。在此步骤中,你将分析初始输出以识别已确认的 SQL 注入点。

检查终端中的输出。查找指示 sqlmap 已找到易受攻击参数的行。一个关键的指示是类似以下的消息:

[INFO] GET parameter 'id' is vulnerable.

此消息确认 sqlmap 已成功识别出目标 URL 的 id GET 参数中的 SQL 注入漏洞。输出通常还会显示发现的注入类型(例如,基于布尔的盲注、基于错误的注入、基于时间的盲注、堆叠查询等)以及识别出的后端数据库管理系统 (DBMS)(例如,MySQL、PostgreSQL 等)。

理解此初始输出至关重要,因为它告诉你漏洞所在以及你正在处理的数据库类型,这可以为后续的利用步骤提供信息。

... (previous output) ...
[INFO] GET parameter 'id' is vulnerable.
[INFO] the back-end DBMS is MySQL.
[INFO] fetched data:
[INFO] retrieved: 'ID: 1'
[INFO] retrieved: 'ID: 2'
... (truncated output) ...

定位输出目录中的会话文件

sqlmap 会自动将所有扫描结果,包括已识别的漏洞、检索到的数据和会话信息,保存到一个专用的输出目录中。在此步骤中,你将学习如何定位此会话文件。

默认情况下,sqlmap 将其输出存储在 ~/.sqlmap/output/ 目录中。在此目录中,你将找到以目标主机命名的子目录。

导航到 sqlmap 输出目录:

cd ~/.sqlmap/output/localhost/

然后,列出此目录的内容,以查看会话文件和其他扫描相关数据:

ls -l

你应该会看到一个以特定 URL 或其哈希命名的目录,在该目录内,你会找到 session.sqlitelog 等文件,如果数据被提取,还可能看到 dump 目录。session.sqlite 文件包含会话数据,这使得 sqlmap 可以在不重新扫描的情况下恢复扫描或查看之前的发现。

labex@labex-ubuntu:~/project$ cd ~/.sqlmap/output/localhost/
labex@labex-ubuntu:~/.sqlmap/output/localhost$ ls -l
total 12
drwxr-xr-x 2 labex labex 4096 Jan  1 12:35 http%3A%2F%2Flocalhost%2Findex.php%3Fid%3D1
labex@labex-ubuntu:~/.sqlmap/output/localhost$ cd http%3A%2F%2Flocalhost%2Findex.php%3Fid%3D1/
labex@labex-ubuntu:~/.sqlmap/output/localhost/http%3A%2F%2Flocalhost%2Findex.php%3Fid%3D1$ ls -l
total 12
-rw-r--r-- 1 labex labex 1234 Jan  1 12:35 log
-rw-r--r-- 1 labex labex 8192 Jan  1 12:35 session.sqlite

此步骤对于理解 sqlmap 存储其持久数据的位置非常重要,这对于回顾过去的扫描或继续复杂的操作很有用。

总结

在此实验中,你成功使用 sqlmap 对 GET 参数执行了基本的 SQL 注入扫描。你学会了如何识别目标 URL,使用 -u 选项构建 sqlmap 命令,执行扫描,并解释初始输出以确认注入点。此外,你还定位了 sqlmap 存储其结果的会话文件和输出目录。这些基础知识对于任何希望深入研究 Web 应用程序安全测试和 sqlmap 功能的人来说都至关重要。