Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
lago-invite-ato — Lago GraphQL acceptInvite 인증 우회를 시연하는 개념 증명 랩으로, 인증되지 않은 초대 수락을 통해 조직 간 계정 탈취가 가능합니다. | Kitploit
도구/GitHubGitHub/abraxas/lago-invite-ato
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingAuthenticationAPI SecurityLabs & Practice
GitHubabraxas/lago-invite-ato

lago-invite-ato

Lago GraphQL acceptInvite 인증 우회를 시연하는 개념 증명 랩으로, 인증되지 않은 초대 수락을 통해 조직 간 계정 탈취가 가능합니다.

저장소 보기
259일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Abraxas Labs - lago-invite-ato

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

분석 문서: https://abraxaslabs.tech/research/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는 이미 초대자에게 토큰을 반환합니다.

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). 피해자 이메일을 초대하고, 더미 비밀번호로 인증 없이 수락한 다음, 헤더를 Victim Corp로 전환합니다. 인보이스, API 키, Stripe, 지갑까지.

계정이 없는 무작위 방문자가 아닙니다. 비밀번호 재설정도 아닙니다. 더미 로그인은 실패합니다. 실제 피해자 비밀번호는 여전히 작동합니다. Google/Okta 수락은 IdP 이메일을 바인딩하며 이 버그가 아닙니다. DB에 다른 사람의 이메일이 없는 단일 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); 더미 비밀번호로 로그인하기 (그것은 해시가 덮어쓰였다는 뜻일 것 - 랩은 그렇지 않았음을 확인); 리버스 셸. 연극. 받은편지함 없음.

그다음: 두 번의 registerUser 호출로 Victim Corp과 Attacker Corp을 심습니다. 매 실행마다 새 이메일을 사용하므로 볼륨이 더러워져도 user_already_exists 422가 발생하지 않습니다. 피해자 이메일로 createInvite를 호출합니다. 더미 비밀번호로 인증 없이 acceptInvite를 호출합니다. 반환된 사용자 id가 피해자와 일치합니다. currentUser.organizations에 둘 다 나열됩니다. 헤더를 전환하면 Victim Corp이 반환됩니다.

Lab

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를 증명하도록) 요구하십시오. 인증되지 않은 수락으로 기존 사용자에 대해 JWT를 발급하지 마십시오. 초대 token이 기능(capability)인 경우 초대자에게 반환하는 것을 중단하십시오.

참고 자료

  • 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를 참조하십시오. 루프백 실험실 전용입니다. 보증하지 않습니다.

도구 다운로드