挖洞经验 | Microsoft Forms未授权获取他人邮箱信息漏洞
字数 1015 2025-08-15 21:33:21
Microsoft Forms未授权获取他人邮箱信息漏洞分析
1. 漏洞背景
Microsoft Forms是微软Office 365套件中的在线调查创建应用,允许用户创建问卷、测验等表单并收集数据。该服务使用OData协议实现数据交互和共享功能。
2. OData协议基础
2.1 OData协议概述
开放数据协议(OData)是一种描述如何创建和访问Restful服务的OASIS标准:
- 前三个版本(1.0-3.0)由微软开发
- 4.0版本于2014年成为开放行业标准
- 基于SQL理念,支持数据模型描述、编辑和请求
2.2 OData核心概念
- 元数据:描述系统数据模型
- 实体:类似于数据库中的表
- 属性:类似于数据库中的列
- 实体键:类似于关系数据库中的主键
2.3 OData查询语法示例
基本请求格式:
customerApi/Customers(2)
使用$select查询特定属性:
customerApi/Customers(2)?$select=email
等效SQL:
SELECT email FROM Customers WHERE ID=2;
3. 漏洞发现过程
3.1 初始信息收集
-
访问Microsoft Forms元数据接口:
http://forms.office.com/formapi/api/$metadata -
分析XML元数据结构,寻找敏感实体
3.2 关键实体发现
发现forms实体包含email属性,表明可能存在用户邮箱信息泄露风险。
3.3 初步利用尝试
最初发现的方法需要受害者交互:
- 受害者访问恶意网站
- 危害性较低,仅获微软致谢
4. 深入漏洞利用
4.1 数据分享机制分析
Microsoft Forms数据分享流程:
- 用户A创建表单并生成分享链接
- 用户A将链接发送给用户B
- 用户B通过链接提交数据
用户B提交数据时的请求格式:
formapi/api/<ownerTenantID>/users/<ownerID>/forms(<formID>)/responses
4.2 关键突破点
发现runtimeForms实体:
- 包含
createdBy属性 - 与
forms实体共享相同的实体键(formID) - 允许通过
$select查询createdBy属性
4.3 最终利用方法
构造请求:
formapi/api/<ownerTenantID>/users/<ownerID>/runtimeForms(<formID>)?$select=createdBy
成功获取受害者邮箱信息,无需任何交互。
5. 漏洞修复建议
- 实施严格的访问控制,验证请求者权限
- 对敏感实体和属性设置额外保护
- 限制
$select查询对敏感字段的访问 - 加强OData端点权限验证机制
6. 总结
该漏洞利用Microsoft Forms中OData协议的实现缺陷:
- 通过分析元数据发现敏感实体
- 利用实体间共享键的特性绕过限制
- 最终实现未授权获取用户邮箱信息
- 获得微软$2000漏洞奖励
此案例展示了API端点权限验证的重要性,以及在实现数据共享功能时需要特别注意的安全边界。