abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lago-invite-ato
Lago v1.53.0 - GetLago
Mutations::Invites::Accept 没有 AuthenticableApiUser。Create/revoke 有。Accept 没有。register_from_invite 通过邀请邮箱加载用户。如果该账户已有成员关系,提交的密码会被丢弃。AuthToken.encode(user:) 仍会执行。该 JWT 是用户作用域的。没有 org 声明。客户端为该用户已归属的任意 org 发送 x-lago-organization。包括受害者的 org。createInvite 已经将 token 返回给邀请者。
将 cfo@victim 邀请到一个一次性 org,自己接受邀请,你就在该邮箱已存在的每个 org 中成为那个人。邮箱全程不参与。受害者密码不变。
| ID | 暂无 CVE |
| CWE | CWE-287, CWE-306 |
| CVSS | 严重:9.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N |
| 产品 | Lago / lago-api |
| 受影响 | 至 v1.53.0 的 email/password acceptInvite |
| 认证 | org 管理员(organization:members:create);Cloud 注册即可 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
你需要一个自己控制的 org。Cloud 注册即可(LAGO_DISABLE_SIGNUP 默认为 false)。邀请一个受害者邮箱,用假密码未认证地接受邀请,然后通过 header 切换到 Victim Corp。发票、API 密钥、Stripe、钱包。
不是没有账户的随机访客。不是密码重置。假登录会失败。真实受害者密码仍然有效。Google/Okta 接受会绑定 IdP 邮箱,不是这个漏洞。单 org 自托管且数据库中没有任何其他人的邮箱,不会让你获得另一个商户。同一数据库、两个 org、同一邮箱:就会。
与 Stripe 一次性发票 IDOR 属于同一代码树。不同的漏洞。
我阅读了 Accept(没有 AuthenticableApiUser),然后是 find_or_initialize_by(email:),然后是跳过密码的已有成员关系分支,然后是 AuthToken.encode(user:)。接着是 Google 接受,它确实检查 google_oidc["email"] == invite.email。Email/password 接受不会绑定现有用户的密码。
第一个查看此处的客户端会邀请一个未使用的地址,接受它,并得到一个全新的 Lago 用户,密码就是他们提交的密码。这是功能。证据是返回的现有受害者用户 id。
已记录的弯路:使用 Google/Okta 接受;将没有 JWT 时 createInvite 返回 401 当作全部真相(create 是认证的,accept 不是);只查看 currentUser 上的攻击者 org(线索是列表中的 Victim Corp);假密码登录成功(那将意味着哈希被覆盖——实验环境断言它没有被覆盖);反弹 shell。作秀。没有收件箱。
然后:两次 registerUser 调用植入 Victim Corp 和 Attacker Corp。每次运行使用全新邮箱,这样脏卷不会 422 user_already_exists。对受害者邮箱执行 createInvite。用假密码未认证地执行 acceptInvite。返回的用户 id 与受害者匹配。currentUser.organizations 列出两者。Header 切换返回 Victim Corp。
cd lab
./run.sh
目标仅为 http://127.0.0.1:13000。Stripe IDOR 使用 13001。没有 UI 端口。
IOC victim_password_unchanged
IOC victim_real_password_still_works
SUCCESS LAGO-INVITE-ATO acceptInvite JWT is existing victim; lists Victim Corp; no inbox
如果用户已存在,要求他们以自己身份认证(或证明邮箱 / IdP)后才能附加成员关系。不要从未认证的 accept 为现有用户签发 JWT。如果邀请 token 是一种能力,停止将其返回给邀请者。
accept.rb · accept_service.rb · users_service.rb · create.rb · object.rb · google_service.rbGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。