使用 Gobuster 进行 GET 参数模糊测试

Beginner
立即练习

引言

在 Web 应用安全中,发现隐藏或未文档化的 GET 参数对于识别潜在漏洞至关重要。如果应用程序未正确处理,这些参数有时可能导致信息泄露、SQL 注入或其他安全缺陷。Gobuster 是一款流行的目录和文件暴力破解工具,它还提供“fuzz”模式,可用于发现 GET 参数。

本实验将指导你完成使用 Gobuster 的 fuzz 模式识别 GET 参数的过程。你将学习如何构建带有 FUZZ 关键字的 URL,使用常用参数名称的单词列表,执行扫描,并分析结果以查找有趣的参数。通过本实验的学习,你将对如何使用 Gobuster 进行 GET 参数模糊测试(fuzzing)有一个实际的理解,这是一项对任何网络安全爱好者或专业人士都非常有价值的技能。

识别要测试的 URL 端点

在此步骤中,你将识别一个目标 URL 端点,你希望对其进行隐藏 GET 参数的测试。在本实验中,我们将使用一个模拟易受攻击应用程序的简单 Web 服务器。我们将启动一个 Python HTTP 服务器来提供一个基本的 HTML 文件。

首先,导航到你的项目目录:

cd ~/project

接下来,创建一个名为 index.html 的简单 HTML 文件,我们将用它作为目标。此文件将模拟一个可能接受 GET 参数的网页。

nano index.html

将以下内容添加到 index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Test Page</title>
  </head>
  <body>
    <h1>Welcome to the Test Page!</h1>
    <p>This page is for testing GET parameters.</p>
  </body>
</html>

通过按 Ctrl+X,然后按 Y,最后按 Enter 来保存文件。

现在,启动一个简单的 Python HTTP 服务器来提供此文件。此服务器将在端口 8000 上运行。

python3 -m http.server 8000 &

末尾的 & 会将服务器置于后台运行,使你能够继续使用终端。你应该会看到类似以下的输出:

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

我们将进行模糊测试的目标 URL 端点是 http://127.0.0.1:8000/index.html

构建带有 FUZZ 关键字作为参数名称的 URL

在此步骤中,你将学习如何构建 Gobuster 用于模糊测试的 URL。Gobuster 的 fuzz 模式要求在 URL 中使用 FUZZ 关键字,以指示单词列表(wordlist)中的条目应插入的位置。在对 GET 参数进行模糊测试时,FUZZ 关键字将替换参数名称。

带有参数的 GET 请求的基本格式是 http://example.com/path?parameter=value。为了模糊测试参数名称,我们将用 FUZZ 替换 parameter。值可以是任何内容,因为我们只对发现参数名称本身感兴趣。一种常见的做法是使用像 1test 这样的简单值。

对于我们的实验,目标 URL 是 http://127.0.0.1:8000/index.html。为了对 GET 参数名称进行模糊测试,URL 将按如下方式构建:

http://127.0.0.1:8000/index.html?FUZZ=test

其中:

  • http://127.0.0.1:8000/index.html 是我们的基础 URL。
  • ? 表示查询字符串的开始。
  • FUZZ 是占位符,Gobuster 将在此处插入来自我们单词列表的单词。
  • =test 是该参数的静态值。对于发现参数名称而言,具体值并不重要,但它是有效参数格式所必需的。

在此步骤中你无需执行任何命令,但理解此 URL 构建对于后续步骤至关重要。

使用常用参数名称的单词列表

在此步骤中,你将准备一个包含常用 GET 参数名称的单词列表。Gobuster 将遍历此单词列表,用列表中的每个单词替换 URL 中的 FUZZ 关键字。

虽然 Gobuster 通常自带默认的单词列表,但了解如何创建或指定自己的单词列表是一个好习惯。在本实验中,我们将创建一个包含一些常用参数名称的小型自定义单词列表。

首先,确保你位于 ~/project 目录:

cd ~/project

现在,创建一个名为 params.txt 的新文件,它将作为我们的单词列表:

nano params.txt

将以下常用参数名称添加到 params.txt 中,每行一个:

id
name
user
page
search
query
file
data
token

通过按 Ctrl+X,然后按 Y,最后按 Enter 来保存文件。

params.txt 文件将在下一步由 Gobuster 用于模糊测试 GET 参数。

执行 gobuster fuzz 扫描

在此步骤中,你将使用构建好的 URL 和单词列表执行 Gobuster fuzz 扫描。

Gobuster 的 fuzz 模式的命令是 gobuster fuzz。我们需要使用 -u 标志指定带有 FUZZ 关键字的 URL,并使用 -w 标志指定单词列表。

打开你的终端并运行以下命令:

gobuster fuzz -u http://127.0.0.1:8000/index.html?FUZZ=test -w ~/project/params.txt

让我们分解一下这个命令:

  • gobuster fuzz: 以模糊测试模式调用 Gobuster。
  • -u http://127.0.0.1:8000/index.html?FUZZ=test: 指定带有 FUZZ 占位符的目标 URL。
  • -w ~/project/params.txt: 指定包含参数名称的单词列表的路径。

Gobuster 现在将向 Web 服务器发送请求,用 params.txt 中的每个单词替换 FUZZ。由于我们的 index.html 实际上并不处理这些参数,Gobuster 可能会报告所有请求具有相同的状态码和内容长度。然而,在实际场景中,状态码或内容长度的变化将表明某个参数可能被识别。

输出将显示每次尝试以及相应的状态码和内容长度。它将类似于:

===============================================================
Gobuster vX.X.X
===============================================================
[+] Url: http://127.0.0.1:8000/index.html?FUZZ=test
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /home/labex/project/params.txt
[+] Status codes: 200,204,301,302,307,401,403,405
[+] User Agent: gobuster/X.X.X
[+] Timeout: 10s
===============================================================
200 (290)    - http://127.0.0.1:8000/index.html?id=test
200 (290)    - http://127.0.0.1:8000/index.html?name=test
200 (290)    - http://127.0.0.1:8000/index.html?user=test
200 (290)    - http://127.0.0.1:8000/index.html?page=test
200 (290)    - http://127.0.0.1:8000/index.html?search=test
200 (290)    - http://127.0.0.1:8000/index.html?query=test
200 (290)    - http://127.0.0.1:8000/index.html?file=test
200 (290)    - http://127.0.0.1:8000/index.html?data=test
200 (290)    - http://127.0.0.1:8000/index.html?token=test
===============================================================

分析响应长度或状态码的变化

在此步骤中,你将学习如何解读 Gobuster fuzz 扫描的输出。识别潜在有效或有趣的 GET 参数的关键在于观察 HTTP 响应的变化。

当 Gobuster 运行时,它会显示它发出的每个请求的 HTTP 状态码和内容长度(以字节为单位)。

例如,上一步的输出显示:

200 (290)    - http://127.0.0.1:8000/index.html?id=test
200 (290)    - http://127.0.0.1:8000/index.html?name=test
...

这里,200 是 HTTP 状态码(OK),290 是响应的内容长度。

需要关注的内容:

  1. 不同的状态码: 如果带有特定参数名称的请求返回了不同的 HTTP 状态码(例如,有效为 200,未找到为 404,服务器错误为 500,重定向为 302),这可能表明应用程序处理或响应了该参数。例如,一个通常返回 404 Not Found 的参数却返回了 200 OK,这可能很重要。
  2. 不同的内容长度: 即使状态码保持为 200 OK,内容长度的变化也可能是一个强有力的指示。这通常意味着应用程序的响应体发生了变化,可能是因为包含了与参数相关的特定数据、错误消息或不同的页面布局。
  3. 错误消息: 有时,一个参数可能会触发一个错误消息(例如,SQL 错误、应用程序错误),该错误消息会反映在响应体中,导致内容长度不同,甚至状态码为 500。这是潜在漏洞的一个强烈迹象。

在我们当前的实验设置中,由于 index.html 是一个静态文件,并且 Python 服务器不处理 GET 参数,你将观察到所有请求都返回 200 状态码和相同的内容长度(290 字节)。对于我们简单的测试用例来说,这是预期的行为。

在实际场景中,如果你对一个正在运行的 Web 应用程序进行模糊测试,并看到类似以下的条目:

200 (512)    - http://example.com/search?query=test

而其他参数返回的是 200 (290),那么 query 参数就值得进一步调查,因为它具有不同的内容长度。

此步骤标志着实验的结束。你已成功学习了如何使用 Gobuster 进行 GET 参数的模糊测试以及如何分析结果。

要停止 Python HTTP 服务器,你可以找到它的进程 ID (PID) 并将其终止。首先,列出正在运行的 Python 进程:

ps aux | grep "python3 -m http.server 8000"

你将看到类似以下的输出:

labex     1234  0.0  0.0  12345  6789 ?        S    HH:MM   0:00 python3 -m http.server 8000

记下 PID(例如,此示例中的 1234),然后终止该进程:

kill 1234

1234 替换为你找到的实际 PID。

总结

在此实验中,你已成功学习了如何使用 Gobuster 执行 GET 参数的模糊测试。你首先设置了一个本地 Web 服务器并创建了一个目标 HTML 文件。然后,你构建了一个带有 FUZZ 关键字的 URL,准备了一个包含常见参数名称的自定义单词列表,并执行了 Gobuster fuzz 扫描。最后,你学习了如何分析扫描结果,重点关注 HTTP 状态码和内容长度的变化,这些是识别已识别参数的关键指标。

这项技术是 Web 应用程序侦察的基础部分,可以帮助发现隐藏的功能或潜在的漏洞。通过掌握这项技能,你将能更好地识别和调查 Web 应用程序的攻击面。