Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
lago-invite-ato — 一个概念验证实验环境,演示了 Lago GraphQL acceptInvite 认证绕过漏洞,该漏洞可通过未经认证的邀请接受实现跨组织账户接管。 | Kitploit
工具/GitHubGitHub/abraxas/lago-invite-ato
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试身份验证API 安全实验室与实践
GitHubabraxas/lago-invite-ato

lago-invite-ato

一个概念验证实验环境,演示了 Lago GraphQL acceptInvite 认证绕过漏洞,该漏洞可通过未经认证的邀请接受实现跨组织账户接管。

查看仓库
1115天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Abraxas Labs - lago-invite-ato

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  lago-invite-ato

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
CWECWE-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 是一种能力,停止将其返回给邀请者。

参考资料

  • github.com/getlago/lago 标签 v1.53.0 · lago-api
  • accept.rb · accept_service.rb · users_service.rb · create.rb · object.rb · google_service.rb
  • 同一产品:lago-stripe-invoice-idor
  • CWE-287 · CWE-306

许可证

GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。

下载工具