为 Nikto 扫描添加自定义头部

Kali LinuxBeginner
立即练习

引言

Nikto 是一个流行的开源 Web 服务器扫描器,它对 Web 服务器进行全面的测试,检查超过 6700 个潜在危险文件/程序,检查超过 1250 个服务器的过时版本,以及超过 270 个服务器的版本特定问题。

有时,Web 应用程序要求请求中包含特定的 HTTP 头部。这可能是为了身份验证(如 API 密钥或会话令牌),为了路由到应用程序的特定版本,或者为了启用调试模式。在这些场景下,标准的 Nikto 扫描会失败或不完整,因为它们缺少必需的头部。

在本实验中,你将学习如何使用 Nikto 的 -addheaders 选项在扫描中包含自定义头部。这使你能够测试具有特定头部要求的应用程序,从而确保更彻底和准确的安全评估。

识别应用程序所需的自定义 HTTP 头部

在此步骤中,你将与一个简单的 Web 应用程序进行交互,以了解自定义头部为何是必需的。我们有一个运行在端口 8000 上的 Web 服务器,它需要一个特定的头部 X-LabEx-Auth 才能访问。

首先,让我们尝试使用 curl 命令在没有自定义头部的情况下访问 Web 应用程序。

curl http://127.0.0.1:8000

你将收到一条“Access Denied”(拒绝访问)消息,因为缺少必需的头部。

Access Denied

现在,让我们再次发送请求,但这次我们将使用 curl 中的 -H 选项包含必需的自定义头部。该头部是 X-LabEx-Auth,其值为 SecretToken

curl -H "X-LabEx-Auth: SecretToken" http://127.0.0.1:8000

这次,服务器授予访问权限并返回欢迎消息。这证实了应用程序会检查此特定头部。

Welcome, authorized user! The server is Apache/2.4.1 (Unix).

此过程演示了在运行安全扫描之前如何识别和确认自定义头部的需求。

使用 -addheaders 选项指定头部和值

在此步骤中,你将了解用于在 Nikto 扫描中添加自定义头部的选项。

既然我们知道需要自定义头部,我们就需要告诉 Nikto 在其所有 HTTP 请求中包含它。Nikto 为此提供了 -addheaders 选项。

语法很简单:

-addheaders "HeaderName:HeaderValue"

你将 HeaderName 替换为头部的名称(例如 X-LabEx-Auth),将 HeaderValue 替换为其对应的值(例如 SecretToken)。

如果你需要添加多个自定义头部,你可以使用换行符(\n)将它们分隔开。例如:

-addheaders "Header1:Value1\nHeader2:Value2"

对于我们当前的情况,扫描目标应用程序的完整 Nikto 命令结构如下所示。请注意,我们在此步骤中不运行该命令;我们只是构建它以理解语法。

nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"

此命令指示 Nikto 将目标定位到 http://127.0.0.1:8000 的主机,并在扫描期间发送的每个请求中添加 X-LabEx-Auth: SecretToken 头部。

运行包含自定义头部的扫描

在此步骤中,你将执行 Nikto 扫描,使用你刚刚了解的 -addheaders 选项。

构建好正确的命令后,就可以运行扫描了。这将使 Nikto 能够以授权用户的身份与应用程序进行交互,从而可能发现未经验证用户无法看到的漏洞。

在你的终端中执行以下命令:

nikto -h http://127.0.0.1:8000 -addheaders "X-LabEx-Auth: SecretToken"

Nikto 现在将开始扫描。由于每个请求都包含 X-LabEx-Auth: SecretToken 头部,Web 应用程序将成功处理它们。观察 Nikto 的输出。它将识别服务器并开始测试各种漏洞。

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    127.0.0.1
+ Target Port:        8000
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ "Allowed HTTP Methods: HEAD, OPTIONS, GET"
+ OSVDB-3233: /: Found a default page.
...
+ 15 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time:           ...
---------------------------------------------------------------------------
+ 1 host(s) tested

关键要点是扫描成功运行,而没有头部的扫描将被应用程序阻止。

使用代理工具验证头部是否已发送

在此步骤中,你将验证 Nikto 是否确实在其请求中发送了自定义头部。虽然通常使用 Burp Suite 或 OWASP ZAP 等专业工具来完成此操作,但我们可以使用简单的 netcat (nc) 监听器来模拟代理。

首先,你需要打开第二个终端。你可以通过点击终端面板的标签栏中的 "+" 图标来完成此操作。

新终端标签页中,在一个端口上启动 netcat 监听器,例如 8888。此监听器将仅打印它收到的任何数据。

nc -l -p 8888

现在,切换回你的原始终端标签页。再次运行 Nikto 扫描,但这次将其指向你的 netcat 监听器,而不是实际的 Web 服务器。这将导致 Nikto 将其 HTTP 请求发送到 netcat,使我们能够检查它。

nikto -h http://127.0.0.1:8888 -addheaders "X-LabEx-Auth: SecretToken"

运行命令后,快速切换回运行 netcat第二个终端标签页。你将看到 Nikto 发送的原始 HTTP 请求。在输出中查找 X-LabEx-Auth: SecretToken 头部。

GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000001)
X-LabEx-Auth: SecretToken
Accept-Encoding: gzip,deflate
Connection: close

如你所见,自定义头部已包含在请求中。这证实了 -addheaders 选项按预期工作。

你现在可以按 Ctrl+C 在第二个终端标签页中停止 netcat 监听器,然后关闭该标签页。

测试需要特定头部的漏洞

在此步骤中,你将通过比较带有和不带头部的扫描来理解使用自定义头部的实际安全影响。

许多漏洞,例如不安全的直接对象引用 (IDOR) 或权限提升缺陷,仅存在于应用程序的已认证部分。不提供正确认证头部的扫描将完全错过这些问题。

为了说明这一点,首先,在不带自定义头部的情况下对 Web 服务器运行 Nikto 扫描。这模拟了未经身份验证的攻击者进行的扫描。

nikto -h http://127.0.0.1:8000

Nikto 将运行,但它发送的每个请求都将收到“访问被拒绝”的响应。扫描器无法正确分析应用程序,因为它无法通过初始授权检查。此类扫描的结果价值有限。

- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    127.0.0.1
+ Target Port:        8000
+ Start Time:         ...
---------------------------------------------------------------------------
+ Server: Werkzeug/2.0.1 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ "Allowed HTTP Methods: GET, HEAD, OPTIONS"
+ OSVDB-3233: /: The site returned a 403 Forbidden, this may indicate that it's a default file.
...

通过将此与你在步骤 3 中运行的成功扫描(使用了头部)进行比较,你可以看到区别。带有自定义头部的扫描能够与应用程序的核心逻辑进行交互(正如我们在 curl 中看到的“欢迎”消息所示)并执行有意义的测试。没有头部的扫描在门口就被阻止了。

这突显了使用自定义头部确保你的漏洞扫描尽可能全面的重要性。

总结

在本实验中,你学习了使用 Nikto 进行有效 Web 应用程序安全评估的关键技术。

你成功地:

  • 使用 curl 识别出应用程序对自定义 HTTP 头部的需求。
  • 学习了 Nikto -addheaders 选项的语法。
  • 执行了一次包含自定义头部的 Nikto 扫描以获得授权访问。
  • 使用 netcat 监听器验证了自定义头部是否已正确发送。
  • 理解了使用自定义头部进行扫描如何发现原本会遗漏的漏洞。

这项技能对任何安全专业人员来说都至关重要,因为它能够对依赖头部进行身份验证、状态管理和其他功能的现代复杂 Web 应用程序进行更全面的测试。