mitm-find-idor について
mitmproxyの通信ログを分析し、不安全な直接オブジェクト参照(IDOR)の候補を探すセキュリティスキルです。認可テストや影響評価に使える形式で結果を整理します。
主な機能
- 01パスやリクエスト内のオブジェクト参照の検出
- 02一般的なIDエンコード形式の認識
- 03認可と影響の確認手順
- 04エンドポイントと重大度別の報告
活用シーン
- 01取得した通信ログからIDOR候補を確認
- 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 数値 | MTIzNDU2 | echo MTIzNDU2 | base64 -d → 123456 |
| 16進数 | 0x1E240 | 10進数に変換 → 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 | 非公開の投稿、ドキュメントを表示 |
| ユーザーの存在を列挙する | LOW | user_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
コメント
Markdown 対応