引言
Nikto 是一个流行的开源 Web 服务器扫描器,它对 Web 服务器进行全面的测试,检查超过 6700 个潜在危险文件/程序,检查超过 1250 个服务器的过时版本,以及超过 270 个服务器的版本特定问题。
许多 Web 应用程序都有受限区域,这些区域只有在用户提供有效凭证后才能访问。HTTP Basic Authentication 是保护这些区域最简单的方法之一。要执行彻底的安全评估,扫描这些经过身份验证的部分至关重要。
在本实验中,你将学习如何使用 Nikto 对受 Basic Authentication 保护的 Web 目录执行身份验证扫描。你将使用 -id 选项提供必要的凭证,使 Nikto 能够访问受保护的资源并测试其漏洞。
识别受 Basic Authentication 保护的 Web 资源
在此步骤中,你将首先验证目标 Web 资源是否确实受 Basic Authentication 保护。检查此项的常用方法是使用 curl 命令来检查当你尝试访问该资源时服务器返回的 HTTP 头部。
未受保护的资源将返回 200 OK 状态,而受保护的资源将返回 401 Unauthorized 状态以及 WWW-Authenticate 头部,指示所需的身份验证类型。
让我们尝试使用带 -I 选项的 curl 来访问受保护的目录 http://localhost/protected/,该选项仅获取 HTTP 头部。
在你的终端中执行以下命令:
curl -I http://localhost/protected/
你应该会看到类似以下的输出。请注意 HTTP/1.1 401 Unauthorized 状态和 WWW-Authenticate: Basic realm="..." 头部。这证实了该目录是受保护的。
HTTP/1.1 401 Unauthorized
Date: [current_date]
Server: Apache/2.4.52 (Ubuntu)
WWW-Authenticate: Basic realm="Restricted Content"
Content-Type: text/html; charset=iso-8859-1
获取所需的用户名和密码
在此步骤中,我们将确认访问受保护区域所需的凭证。在实际的渗透测试中,你可能通过各种方式获取这些凭证,例如密码猜测、在公共代码存储库中查找,或通过社会工程学。
在本实验中,环境已预先配置了特定的用户名和密码。在后续步骤中执行身份验证扫描时,你需要这些凭证。
凭证如下:
- 用户名:
labex - 密码:
P@ssw0rd123
此步骤无需执行任何命令。只需记下上述凭证,然后继续下一步,你将在下一步中使用它们进行身份验证。
使用 -id 选项,格式为 'user:password'
在此步骤中,你将了解 Nikto 的 -id 选项,该选项用于提供 HTTP 身份验证的凭证。格式是一个包含用户名和密码的字符串,两者之间用冒号(:)分隔。
语法是:-id <username>:<password>
在使用 Nikto 之前,最好验证凭证是否有效。你可以再次使用 curl 来完成此操作,这次使用 --user 选项来提供凭证。
运行以下命令,使用正确的凭证访问受保护的页面:
curl --user labex:P@ssw0rd123 http://localhost/protected/
如果凭证正确,服务器将授予访问权限并返回页面的内容,如下所示。这证实了你可以成功进行身份验证。
This is a protected page accessible only with credentials.
现在你已经确认了凭证并了解了格式,可以准备在 Nikto 扫描中使用它们了。
对受保护区域运行身份验证扫描
在此步骤中,你将结合前几个步骤的知识,使用 Nikto 运行完整的身份验证扫描。你需要指定目标主机和身份验证凭证。
命令结构将是:
nikto: 要运行的程序。-h http://localhost/protected/:-h(host)选项,直接指向你要扫描的目录。-id labex:P@ssw0rd123: 带有用户名和密码的-id选项。
现在,在你的终端中执行完整的命令。扫描可能需要几分钟才能完成。
nikto -h http://localhost/protected/ -id labex:P@ssw0rd123
Nikto 将开始扫描。由于你提供了有效的凭证,它将能够访问 http://localhost/protected/ 并测试该目录内的漏洞。输出将类似于:
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: localhost
+ Target Port: 80
+ Start Time: [scan_start_time]
---------------------------------------------------------------------------
+ Server: Apache/2.4.52 (Ubuntu)
+ /: The anti-clickjacking X-Frame-Options header is not present.
+ /: 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.
+ /: Server may leak inodes via ETags, header found with file /, fields: 0x1ed 0x5f7e21e8a2e80
+ OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD.
+ /: Apache/2.4.52 appears to be outdated (current is at least Apache/2.4.54).
+ 8142 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time: [scan_end_time] (30 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
验证 Nikto 是否成功访问了受保护的资源
在此步骤中,你将分析扫描输出,以确认 Nikto 是否成功进行了身份验证并扫描了受保护的区域。成功进行身份验证扫描的一个关键指标是是否存在广泛的身份验证错误。
分析扫描结果的一个好习惯是将输出保存到文件。你可以使用 -o(output)选项来实现这一点。让我们重新运行扫描,并将报告保存到名为 nikto_report.txt 的文本文件中。
nikto -h http://localhost/protected/ -id labex:P@ssw0rd123 -o nikto_report.txt -Format txt
扫描完成后,将在你的当前目录(~/project)中创建一个名为 nikto_report.txt 的文件。你可以检查此文件以验证结果。检查成功的快速方法是查看错误数量的摘要行。
使用 grep 命令在报告文件中搜索包含“error(s)”的行:
grep "error(s)" nikto_report.txt
输出应显示 0 error(s),这证实了 Nikto 在发出请求时没有遇到诸如 401 Unauthorized 之类的问题。这与发现项列表相结合,证明了身份验证扫描是成功的。
+ 8142 requests: 0 error(s) and 5 item(s) reported on remote host
总结
恭喜你完成了本次实验!你已成功使用 Nikto 执行了身份验证的 Web 漏洞扫描。
在本实验中,你学会了如何:
- 使用
curl识别受 HTTP Basic Authentication 保护的 Web 资源。 - 理解身份验证扫描所需的凭证格式。
- 使用 Nikto 的
-id选项提供用户名和密码。 - 针对受保护的目录运行扫描,并通过分析输出来验证其成功性。
掌握身份验证扫描是任何安全专业人员的一项关键技能,因为它能够通过发现隐藏在登录墙后的漏洞,从而对 Web 应用程序的安全状况进行更深入、更全面的评估。


