Post

网站漏洞解析|多重资安缺陷导致密码重设机制被攻破

揭露一个结合多项设计缺陷的网站漏洞,透过预测重设密码令牌与后端验证不足,让攻击者轻易重设他人密码并登入帐号,教你如何避免流水号令牌、加密滥用及缺乏二阶段验证的资安风险,强化网站防护效果。

网站漏洞解析|多重资安缺陷导致密码重设机制被攻破

Click here to view the English version of this article.

點擊這裡查看本文章正體中文版本。

基于 SEO 考量,本文标题与描述经 AI 调整,原始版本请参考内文。


揭露一个几年前发现的巧妙网站漏洞

多个漏洞合并引起的网站资安问题

Photo by [Tarik Haiga](https://unsplash.com/@tar1k?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText){:target="_blank"}

Photo by Tarik Haiga

前言

几年前还有在边支援网页开发的时候;被指派任务要为公司内部工程组举办 CTF 竞赛;一开始初想是依照公司产品分组互相攻防入侵,但身为主办,为了想先了解掌握程度就先对公司旗下各产品进行入侵测试;看看我自己能找到几个漏洞,确保活动流程不会出问题。

但最后因为比赛时间有限、工程区别差异太大;所以最后以工程共通基础知识及有趣的方向出题,有兴趣的朋友可参考我之前的文章「 如何打造一场有趣的工程CTF竞赛 」;里面有很多脑洞大开的题目!

找到的漏洞

一共在三个产品中找到四个漏洞,除了本文准备提及的问题之外还有以下三个常见网站漏洞被我发现:

  1. Never Trust The Client! 问题很入门,就是前端直接将 ID 送给后端,而且后端还直接认了;这边应该要改成认 Token。

  2. 重设密码设计缺陷 实际有点忘了,只记得是程式设计有缺陷;导致重设密码步骤可以绕过信箱验证。

  3. XSS 问题

  4. 本文将介绍的漏洞

查找方式一律以黑箱测试,其中只有发现 XSS 问题的产品是我有参与过程式开发,其他都没有也没看过程式码。

漏洞现况

身为白帽骇客,所有找到的问题都已在第一时间回报工程团队和修复了;目前也过了两年,想想是时候可以公开了;但顾及前公司立场,本文不会提到是哪个产品出现此漏洞,大家就只要参考这个漏洞发现的历程及原因就好!

漏洞后果

此漏洞可让入侵者随意变更目标使用者密码,并使用新密码登入目标使用者帐号,盗取个人资料、从事非法操作。

漏洞主因

如同标题所述,此漏洞是由多个原因组合触发;包含以下因素:

  • 帐号登入未支援两阶段验证、设备绑定

  • 重设密码验证使用流水号

  • 网站资料加密功能存在解密漏洞

  • 加解密功能滥用

  • 验证令牌设计错误

  • 后端未二次验证栏位正确性

  • 平台上使用者信箱为公开资讯

漏洞重现方式

因平台上使用者信箱为公开资讯,所以我们先在平台上浏览目标入侵帐号;知道信箱后前往重设密码页。

  • 首先先输入自己的信箱进行重设密码操作

  • 再输入想入侵帐号的信箱,一样进行重设密码操作

以上两个操作都会寄出重设密码验证信。

进到自己的信箱去收自己那一封重设密码验证信。

变更密码连结为以下网址格式:

1
https://zhgchg.li/resetPassword.php?auth=PvrrbQWBGDQ3LeSBByd

PvrrbQWBGDQ3LeSBByd 就是此次重设密码操作的验证令牌。

但我在观察网站上验证码图片时发现验证码图片的连结格式也是类似:

1
https://zhgchg.li/captchaImage.php?auth=6EqfSZLqDc

6EqfSZLqDc 显示出 5136

那把我们的密码重设 Token 塞进去会怎样?管他的! 塞塞看!

Bingo!

但验证码图片太小,无法得到完整的资讯。

我们继续找可利用的点…

刚好网站为了防止爬虫侵扰,会将用户的公开个人资料信箱,用 图片呈现 ,关键字: 图片呈现!图片呈现!图片呈现!

立刻打开来看看:

个人资料页

个人资料页

网页原始码部分

网页原始码部分

我们也得到了类似的网址格式结果:

1
https://zhgchg.li/mailImage.php?mail=V3sDblZgDGdUOOBlBjpRblMTDGwMbwFmUT10bFN6DDlVbAVt

V3sDblZgDGdUOOBlBjpRblMTDGwMbwFmUT10bFN6DDlVbAVt 显示出 zhgchgli@gmail.com

一样管他的!塞爆!

Bingo!🥳🥳🥳

PvrrbQWBGDQ3LeSBByd = 2395656

反解出重设密码令牌,发现是数字之后

我想了该不会是流水号吧。。。

于是再输入一次信箱请求重设密码,将新收到的信的 Token 解出来,得到 2395657 … what the fxck…还真的是

知道是流水后之后就好办事了,所以一开始的操作才会是先请求自己帐号的重设密码信,再请求要入侵的目标;因为已经可以预测到下一个请求密码的 id 了。

再来只需要想办法将 2395657 换回 Token 令牌即可!

好巧不巧又发现个问题

网站在编辑资料时的信箱格式验证只有前端验证,后端并未二次验证格式是否正确…

绕过前端验证后,将信箱改为下一位目标

Fire in the hole!

我们得到:

1
https://zhgchg.li/mailImage.php?mail=UTVRZwZuDjMNPLZhBGI

这时候将此密码重设令牌,带回密码重设页面:

入侵成功!绕过验证重设他人密码!

最后因为没有二阶段登入保护、设备绑定功能;所以密码被覆盖掉之后就能直接登入冒用了。

事出有因

重新梳理一下整件事的流程。

  • 一开始我们要重设密码,但发现重设密码的令牌实际上是一个流水号,而非真正的唯一识别 Token

  • 网站滥用加解密功能,没有区分功能使用;全站几乎都用同一组

  • 网站存在线上任意加解密入口(等于密钥报废)

  • 后端未二次验证使用者输入

  • 没有二阶段登入保护、设备绑定功能

修正方式

  • 最根本的是重设密码的令牌应该要是随机产生的唯一识别 Token

  • 网站加解密部分,应该区分功能使用不同密钥

  • 避免外部可以任意操作资料加解密

  • 后端应该要验证使用者输入

  • 以防万一,增加二阶段登入保护、设备绑定功能

总结

整个漏洞发现之路令我惊讶,因为很多都是基本的设计问题;虽然功能上单看来说是可以运作,有小洞洞也还算安全;但多个破洞组合起来就会变成一个大洞,在开发上真的要小心谨慎为妙。

延伸阅读

有任何问题及指教欢迎 与我联络


Buy me a beer

本文首次发表于 Medium (点击查看原始版本),由 ZMediumToMarkdown 提供自动转换与同步技术。

Improve this page on Github.

This post is licensed under CC BY 4.0 by the author.