本文内容仅用于网络安全研究学习,请勿用于非法用途。
在一次对大型供应商注册门户进行测试时,我遇到了一个由会话过期触发的奇怪漏洞。在填写冗长的表单中途,我离开约25分钟,返回后点击“下一步”,页面竟加载了另一家公司的完整注册信息,包括敏感的个人身份信息(PII)和银行账户详情。刷新后,这些信息又消失了。
重现问题的过程
当时,我正在测试一个需要填写无数表格的注册流程。在填写了部分信息后,我让浏览器页面闲置了大约25到30分钟。当我返回并点击 “下一步” 按钮时,令人惊讶的事情发生了:页面没有继续我的注册,而是显示了完全陌生的、预填好的另一家公司的数据,具体包括:
- 公司详情
- 财务详情
- 所有者详情
- 银行账号
- SWIFT 和 IBAN 代码
我立刻刷新了页面,一切又恢复了空白状态。为了确认这不是偶然,我按照以下步骤成功地复现了两次:
- 登录并开始供应商注册流程。
- 填写部分表单内容。
- 让浏览器闲置约 25 至 30 分钟(我测得的会话过期时间约为20分钟)。
- 返回并单击 “下一步” 按钮。
- 观察是否出现其他用户的预填个人身份信息。


漏洞的可能根源分析
我无法访问后端代码来确认具体原因,但根据现象,问题很可能出在服务器端的会话或缓存管理上。这个基于 ASP.NET 4.0.30319 的应用程序可能存在以下一种或几种缺陷:
- 不安全的会话管理:会话过期后,旧的会话ID可能被错误地重新分配或路由给了新请求。
- 服务器端缓存问题:缓存的用户注册数据未能正确隔离,在特定条件下(如会话超时)被提供给了错误的用户。
- 不当的缓存控制头:可能导致页面或数据在不应被共享时发生了共享。
- 会话清理逻辑存在状态泄漏:用户的状态对象在会话销毁时未被彻底清除。
- 共享视图状态或临时存储使用不当:导致不同会话间的数据发生重叠。
综合ASP.NET版本和触发的时序模式来看,最可能的原因是服务器在处理过期会话或清理缓存数据时出现了混淆,造成了用户数据的意外交叉。对于这类ASP.NET应用,开发者在设计会话和缓存机制时需要格外注意状态隔离与生命周期管理。
收获与启示
这次经历让我获得了600美元的漏洞赏金,并被团队标记为P2级别。它揭示了一个道理:安全测试并不总是需要复杂的漏洞利用链或深奥的逆向工程。有时候,仅仅关注那些细微的、违背常理的应用行为——比如在会话超时后会发生什么——就能发现严重的安全问题。
如果你也在测试类似的Web应用,特别是那些遗留系统,不妨尝试让会话自然过期,然后观察应用的后续行为。你可能会发现一些意想不到的数据泄露路径。这类关于实战经验与漏洞分析的讨论,在云栈社区等技术论坛中常常能引发深入交流。
|