mcpField
M
mitm-find-idor

mitm-find-idor

github.com/instavmセキュリティ8774 回インストール13 週間前に更新
リポジトリ

mitm-find-idor について

mitmproxyの通信ログを分析し、不安全な直接オブジェクト参照(IDOR)の候補を探すセキュリティスキルです。認可テストや影響評価に使える形式で結果を整理します。

主な機能

  1. 01パスやリクエスト内のオブジェクト参照の検出
  2. 02一般的なIDエンコード形式の認識
  3. 03認可と影響の確認手順
  4. 04エンドポイントと重大度別の報告

活用シーン

  1. 01取得した通信ログからIDOR候補を確認
  2. 02他ユーザーのリソースにアクセス可能かテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/instavm/security-skills --skill mitm-find-idor

インストール後、Claude Code で/mitm-find-idorを入力して読み込まれたか確認します。

詳細

IDOR 脆弱性を探す

次の対象について、mitmproxy のダンプ(log.txt)を分析し、IDOR 脆弱性を探します:$ARGUMENTS

必要なもの:カレントディレクトリに log.txt が必要です。ファイルがない場合は、先にトラフィックをキャプチャしてください:

mitmdump --set flow_detail=3 2>&1 | tee log.txt

高価値な IDOR パターン(実際の HackerOne 報奨金レポート132件に基づく)

1. ユーザー/アカウントのオブジェクト参照
user_id, userId, user-id, uid, account_id, accountId
customer_id, customerId, member_id, memberId
profile_id, owner_id, creator_id, author_id

実例:https://zomato.com/gold/payment-success?subscription_id=XXX&user_id=YYY

2. リソースのオブジェクト参照
order_id, orderId, booking_id, bookingId, reservation_id
transaction_id, txn_id, payment_id, invoice_id
document_id, doc_id, file_id, attachment_id
report_id, ticket_id, case_id, issue_id

実例:/api/shopify/orders/{order_id} — order_id を変更して他の注文にアクセスする

3. 組織のオブジェクト参照
project_id, projectId, team_id, teamId, group_id, groupId
workspace_id, org_id, organization_id, company_id
board_id, channel_id, room_id, space_id

実例:PUT /boards/{board_id}.json — GitLab の非公開プロジェクトのラベルにアクセスする

4. コンテンツのオブジェクト参照
media_code, media_id, image_id, video_id, asset_id
post_id, postId, comment_id, message_id, thread_id
article_id, content_id, item_id, entry_id

実例:media_code=2013124 — 連番 ID により他のユーザーのメディアが露出する

5. セッション/トークンの参照(影響大)
session_id, sessionId, subscription_id, subscriptionId
card_id, cardId, fuel_card_id, membership_id
api_key_id, token_id, credential_id

実例:activateFuelCard?id=XXX — Uber ドライバーの UUID を列挙できる

デコードする ID のエンコードパターン

パターン例デコード方法
Base64 数値MTIzNDU2echo MTIzNDU2 | base64 -d → 123456
16進数0x1E24010進数に変換 → 123456
UUID v1タイムスタンプを含むタイムスタンプの構成要素を抽出
短いハッシュa1b2c3連番の MD5 を切り詰めたものの可能性
ゼロ埋め000012345ゼロ埋めを除去してインクリメント

IDOR の発見箇所

URL パスパラメーター(最も一般的)
/api/v1/users/{id}/profile
/api/v1/orders/{id}/details
/api/v1/documents/{id}/download
/campaign-manager-api/accounts/{id}
クエリパラメーター
?user_id=12345&action=view
?subscription_id=XXX&user_id=YYY
?media_code=2013124
リクエストボディ(JSON/フォーム)
{"user_id": 12345, "action": "delete"}
{"board": {"id": 857058, "labels": [{"id": 123}]}}
ヘッダー(まれだが影響大)
X-User-Id: 12345
X-Account-Id: 67890

深刻度の評価

アクセスの種類深刻度例
他のユーザーの PII を読み取るCRITICALメールアドレス、電話番号、住所を表示
他のユーザーのデータを変更するHIGHプロフィールを編集、コンテンツを削除
他のユーザーの注文/取引にアクセスするHIGH注文履歴、支払い情報を表示
他のユーザーの非公開コンテンツを読み取るMEDIUM非公開の投稿、ドキュメントを表示
ユーザーの存在を列挙するLOWuser_id が存在するか確認
公開に近いデータにアクセスするINFOサブスクリプションの日付を表示

テスト方法

ステップ 1:候補パラメーターを特定する

トラフィック内の ID パターンを検索します:

grep -iE '(user|account|order|session|subscription|member|card|document|file|project|team|group)[-_]?id' log.txt
ステップ 2:連番/予測可能な ID を確認する
# Extract numeric IDs and check if sequential
grep -oE 'id[=:]["'\'']?[0-9]+' log.txt | sort -u
ステップ 3:認可をテストする
# Test with ID ± 1
curl -H "Cookie: victim_session" "https://target.com/api/resource/12345"
curl -H "Cookie: victim_session" "https://target.com/api/resource/12344"  # Another user's
ステップ 4:影響を検証する
  • レスポンスに別のユーザーのデータが含まれていますか?
  • 他のユーザーのリソースに対して操作(編集/削除)を実行できますか?
  • どの機密フィールドが露出していますか?

出力形式

検出結果ごとに、次の内容を報告します:

## IDOR Finding: [Brief Description]

**Endpoint**: `METHOD https://target.com/path`
**Parameter**: `param_name` in [path|query|body]
**ID Type**: [Sequential|Base64|UUID|Hash]
**Current Value**: `12345`
**Severity**: [CRITICAL|HIGH|MEDIUM|LOW]

**Evidence**:
[Show request/response snippets]

**Impact**:
- What data is exposed
- What actions can be performed

**Test Command**:
curl -X METHOD 'https://target.com/...' -H 'Cookie: ...'

**Remediation**:
- Implement proper authorization checks
- Use indirect references (mapping table)
- Validate user owns the resource

誤検知として無視するもの

  • 分析/トラッキングのエンドポイント(書き込み専用で、データが返されない)
  • 公開コンテンツ ID(映画 ID、商品カタログ)
  • 認証の有無にかかわらず同じデータを返すリソース ID
  • 有効なセッションが必要で、ユーザーが異なる場合に 403 を返す ID

コメント