本文将分享一个在SRC漏洞挖掘过程中遇到的、由两套系统交互产生的组合拳漏洞,最终导致可以重置任意用户的密码。
一、信息收集
首先,我们收集到了以下关键信息:
- 学校A网站:
https://aaaaaaaa.cn/user
- 学校B网站:
https://bbbbbbb.cn/user
- 已知两个网站使用的是同一套业务系统。
- 已知学校B的一名学生(杨**)的学号与姓名,但不知道其密码。
- 已知学校B的另一名学生(于*)的学号、姓名及密码。
二、漏洞复现过程
1. 分析学校A的登录流程
打开学校A的网站,发现其登录分为两步。第一步需要输入学号与姓名。

当学号与姓名验证通过后,才会进入第二步输入密码的界面。

2. 在学校A获取目标用户ID
在学校A的第一步登录界面中,输入我们收集到的学校B学生杨**的学号与姓名。

点击下一步后,页面提示需要输入密码(我们并未掌握)。但这并不妨碍我们的测试,通过抓包分析响应数据,我们成功从返回的JSON数据中获取到了用户杨**对应的userid。

3. 登录学校B的已知账户
接着访问学校B的网站https://bbbbbbb.cn/user。其系统界面与学校A相似,但登录流程不同:只需要一步,即同时输入学号、姓名和密码。

我们使用已掌握完整信息的学校B学生于*的学号、姓名和密码进行登录。

登录成功,进入个人中心。
4. 越权绑定手机号
在登录后的个人信息设置页面,找到绑定手机号的功能。填写好自己要绑定的手机号并获取验证码,然后抓取提交绑定请求的数据包。

在抓到的请求包中,我们将userid参数的值修改为之前从学校A获取到的目标用户杨**的userid。

发送修改后的请求,服务器返回“成功”的响应,这表明我们成功地将自己的手机号越权绑定到了用户杨**的账号上。

这类越权操作是安全测试中需要重点关注的逻辑漏洞。
5. 利用绑定的手机号重置密码
接下来,转到学校B网站的“找回密码”功能页面。选择“短信找回”方式,输入目标用户杨**的学号,以及我们刚刚成功绑定的手机号,获取短信验证码,并设置新密码(例如:Aa123456@)。

提交后,系统提示密码修改成功。

6. 验证漏洞
最后,我们使用杨**的学号和新设置的密码Aa123456@重新登录学校B网站。

登录成功,进入了用户杨**的个人主页,至此漏洞复现完成。

三、漏洞原理总结
这个组合拳漏洞的形成基于以下几个关键点:
- 系统差异与数据共享:学校A与学校B使用同一套系统,且很可能共享同一个用户数据库。但两者的登录流程存在差异(A分两步,B为一步),这为信息泄露创造了条件。
- 敏感信息泄露:学校A的第一步登录验证(学号+姓名)通过后,虽然在界面层拦截了用户进入第二步,但在后端响应中直接返回了对应用户的
userid,造成了敏感信息泄露。
- 权限校验缺失:在学校B的绑定手机号功能中,仅依赖会话状态来判断用户身份,未在服务端对操作对象(
userid)与当前登录用户进行强关联校验,导致了越权绑定。
- 漏洞链组合:将前两步获取的
userid与第三步的越权绑定结合,最终实现了对任意账号绑定可控手机号,并藉此通过密码找回功能重置密码。
这个案例提醒我们,在进行系统设计,尤其是多站点共用架构时,必须严格统一安全逻辑,并对用户敏感操作实施多层次、前后端一致的权限验证。更多关于逻辑漏洞与安全攻防的讨论,欢迎访问云栈社区。
|