集合循环引用导致拒绝服务漏洞
原创
游山玩水
游山玩水
山水SRC
2026年9月30日 08:48
河南
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
免责声明
本公众号分享的所有渗透测试技术文章仅面向合法授权的安全测试、学习交流与研究用途。读者必须确保自身行为符合《网络安全法》等相关法律法规,严禁将其用于任何未授权攻击等非法活动。因不当使用或传播相关内容所引发的任何法律责任与风险,由行为人自行承担,本公众号(或本人)概不负责
测试流程
测试前提
- 功能基础
:目标平台支持“集合(List/Collection)”功能,允许用户创建集合并保存文章、视频或其他对象(包括其他集合)。
2. 贡献者机制
:集合支持添加“贡献者(Contributor)”,且添加过程无需对方确认(或攻击者可控),被添加者即拥有该集合的某些权限(如查看、编辑)。
3. 对象引用
:系统允许将集合 A 保存(嵌套)到集合 B 中,即集合可以作为对象被添加到另一个集合。
4. 后端校验缺失
:服务端在处理“Save to Collection”请求时,未检测循环引用(如 A 包含 B,B 又包含 A)。
5. 账户要求
:攻击者拥有一个账号,受害者(至少一个)账号,且攻击者可以获取受害者的用户 ID 或用户名。
测试流程
步骤一:准备攻击环境
- 攻击者登录账号,创建两个集合:
- 集合 A(
list_id=1,命名为Attacker_List_1) - 集合 B(
list_id=2,命名为Attacker_List_2)
- 将受害者 V1 添加为集合 A 的贡献者,将受害者 V2 添加为集合 B 的贡献者(利用 Contributor 机制,无需受害者确认)。
步骤二:构造循环引用
- 拦截“Save to Collection”请求(通常为
POST /api/save-to-collection或类似接口)。 - 对集合 A 执行保存操作:将集合 B 的 ID 作为对象保存进集合 A。
- 请求参数示例:
list_id=1&object_id=2&object_type=collection - 服务器返回
200 OK,表示集合 A 现在包含了集合 B。
- 对集合 B 执行保存操作:将集合 A 的 ID 作为对象保存进集合 B。
- 请求参数示例:
list_id=2&object_id=1&object_type=collection - 服务器返回
200 OK,表示集合 B 现在包含了集合 A。 - 此时形成循环引用:集合 A ↔ 集合 B
。
步骤三:触发受害者端功能失效
- 受害者 V1 和 V2 分别登录账号,访问
/saved/页面(即“已保存”或“我的收藏”页面,该页面通常会列出用户作为贡献者或所有者的集合,并可能递归加载内容)。 - 页面加载时,后端尝试解析集合 A 和 B 的嵌套关系,由于循环引用,陷入无限循环或栈溢出,最终导致渲染失败。
- 截图证明
:受害者看到错误页,显示 \"Sorry, something went wrong...\" 或类似 500 错误。
步骤四:验证无法自助恢复
- 受害者尝试通过 UI 删除集合、取消贡献者关系、移除嵌套对象等操作,均因后端逻辑在循环处理中异常而失败(或操作被拒绝)。
- 对照组验证
:攻击前,受害者 V1/V2 访问 /saved/ 页面正常;攻击后,持续报错,证明漏洞已造成持久化影响。
危害等级与影响
| 维度 | 影响描述 |
|---|---|
| 功能失效(拒绝服务) | 高。受害者(甚至更多用户,若集合被公开或共享)无法正常访问“已保存”页面,导致核心功能不可用。攻击者可针对特定高价值目标(如管理员、明星账号)实施定向打击。 |
| 持久化影响 | 中。由于循环引用存储在数据库中,受害者无法自助修复,需平台管理员介入手动修改数据库才能恢复,增加运维成本。 |
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论