Güvensiz Doğrudan Nesne Referansının (IDOR) ne anlama geldiğini, saldırganların bundan nasıl yararlandığını ve geliştiricilerin güvenli kodlama uygulamaları, erişim kontrol modelleri ve otomatik test platformları kullanarak IDOR güvenlik açıklarını nasıl önleyebileceklerini öğrenin.
IDOR Nedir?
Güvensiz Doğrudan Nesne Referansı (IDOR), bir uygulamanın kullanıcı kimlikleri, sipariş numaraları veya dosya adları gibi dahili nesne tanımlayıcılarını, talep edenin bu nesneye erişim yetkisi olup olmadığını doğrulamadan ifşa ettiği bir güvenlik açığıdır. Bir URL veya API çağrısındaki bir parametreyi değiştirerek, bir saldırgan erişmemesi gereken verileri görüntüleyebilir, değiştirebilir veya silebilir.
IDOR'u Anlamak: Bu Güvenlik Açığı Neden Hala Önemli?
IDOR, aşağıdaki geniş kategoriye aittir Bozuk Erişim KontrolüOWASP'ın yıllardır en kritik web güvenliği risklerinden biri olarak sıraladığı IDOR. IDOR'un tehlikesi basitliğinde yatmaktadır: saldırganın gelişmiş istismar tekniklerine, yük kodlamasına veya ayrıcalık yükseltmeye ihtiyacı yoktur. Değiştirilen tek bir parametre -genellikle sadece bir sayı- özel bilgileri açığa çıkarabilir.
Tipik bir savunmasız model şuna benzer:
bash
/api/user/profile?id=1002
Uygulama sahiplik veya yetkilendirmeyi doğrulamazsa, kimliği 1003 başka bir kullanıcının verilerini ifşa edebilir.
Modern uygulamalar (özellikle API'ler, mikro hizmetler veya mobil istemcileri içerenler) genellikle büyük ölçüde parametrelendirilmiş nesne erişimine dayanır. Bu mimari hızlı ve esnek olmakla birlikte, yetkilendirme kontrolleri tutarsız veya eksik olduğunda kolayca IDOR'a neden olabilir.

CVE-2025-13526: Vahşi Doğada Gerçek Dünyadan Bir IDOR Vakası
IDOR istismarının en son yüksek görünürlüklü örneklerinden biri CVE-2025-13526popüler WordPress eklentisi OneClick Chat to Order'ı (sürüm ≤ 1.0.8) etkiliyor.
- Güvenlik açığı eklentinin
wa_order_thank_you_overridefonksiyon. Eklenti, birorder_idparametresini URL sorgu dizesinden - talebin siparişin gerçek sahibinden gelip gelmediğini kontrol etmeden. - Saldırganlar (kimliği doğrulanmamış olanlar bile) basitçe
order_id"teşekkür" sayfası URL'sindeki değer (örn.order_id=123456içinorder_id=123455) ve diğer müşterilerin sipariş detaylarını alabilir. Açığa çıkan veriler şunları içeriyordu isimler, e-posta adresleri, telefon numaraları, fatura/nakliye adresleri, sipariş kalemleri ve fiyatları, ödeme yöntemi meta verileri. wiz.io+2Gowri Infosec+2 - Sipariş kimlikleri sıralı ve öngörülebilir olduğundan, toplu numaralandırma önemsiz hale geldi - yani bir saldırgan veya otomatik komut dosyası binlerce siparişi dakikalar içinde toplayabilir. Orta+1
- Güvenlik açığına CVSS v3.1 temel puanı olan 7.5 (Yüksek) atanmıştır ve bu puan istismarın kolaylığını (yetkilendirme gerekmez) ve veri maruziyetinin ciddiyetini yansıtmaktadır.
- Geliştirici sorunu sürümde düzeltti 1.0.9Sadece hak sahiplerinin (veya yetkili kullanıcıların) sipariş verilerini görüntüleyebilmesini sağlamak için uygun yetkilendirme kontrolleri uygulayarak. Site sahiplerine derhal yükseltme yapmaları çağrısında bulunuldu. Gowri Infosec+1
Gerçek dünyadaki bu ihlal, IDOR'un teorik veya eski bir hata olmadığını göstermektedir - canlı, istismar edilebilir ve potansiyel olarak ciddi gizlilik ve uyumluluk sonuçları vardır.

IDOR'un Meydana Geldiği Yaygın Gerçek Dünya Senaryoları
IDOR, kullanıcı kontrollü girdi yoluyla dahili nesnelere referans veren herhangi bir sistemde görünebilir. Aşağıda yaygın bağlamlar verilmiştir:
| Uygulama Türü | Nesne Örneği | IDOR Neden Oluşur? |
|---|---|---|
| Hesap sistemleri | userId | Kullanıcı tanımlayıcılarını doğrudan açığa çıkarma |
| E-ticaret uygulamaları | orderId | Mülkiyetin yanlış doğrulanması |
| Dosya yönetimi | dosyaId | Dosyalar için erişim kontrolü eksikliği |
| Biletleme platformları | ticketId | Kullanıcılar diğer kullanıcıların biletlerine erişir |
| SaaS çok kiracılı uygulamalar | kiracıId | Kiracılar arası veri sızıntıları |
Saldırganlar genellikle öngörülebilir kimlikleri numaralandırır, sıralı kimlikleri dener veya kimliği doğrulanmış istekleri değiştirilmiş parametrelerle yeniden oynatır.
Saldırganlar IDOR'u Nasıl İstismar Ediyor (Güvenli, Kontrollü Örnekler)
Aşağıdakiler güvenli̇ i̇llüstrasyon örnekleri̇ tipik savunmasız kalıpları ve bunların güvenli karşılıklarını gösterir. Bunlar zararlı istismarlar değildir; geliştiricilerin güvenli olmayan kalıpları tanımalarına yardımcı olmak için yaygın hataları modellemektedir.
Örnek 1: Node.js / Express'te IDOR
javascript
// ❌ Savunmasız Örnek: kullanıcı tarafından sağlanan kimliğe güvenme
app.get('/api/user/profile', (req, res) => {
const userId = req.query.id;
db.users.findById(userId).then(user => {
res.json(kullanıcı);
});
});
// ✅ Güvenli Örnek: yetkilendirmeyi zorla
app.get('/api/user/profile', (req, res) => {
const authenticatedId = req.user.id;
db.users.findById(authenticatedId).then(user => {
if (!user) return res.status(404).json({ error: "User not found" });
res.json({ id: user.id, email: user.email, role: user.role });
});
});
Örnek 2: Python / Flask'ta Yaygın Bir Kalıp
python
#❌ Güvensiz: sahiplik doğrulaması yok
@app.get("/invoice")
def get_invoice():
invoice_id = request.args.get("id")
return get_invoice_by_id(invoice_id)
#✅ Güvenli: izin kontrolü eklendi
@app.get("/invoice")
def get_invoice_secure():
invoice_id = request.args.get("id")
user_id = session["user_id"]
invoice = get_invoice_by_id(invoice_id)
if invoice.owner_id != user_id:
return {"hata": "Unauthorized"}, 403
iade faturası
Örnek 3: Arka Uç ve Ön Uç Kombine Savunma (Java + React)
Java (Spring Boot)
java
// ❌ Eksik yetkilendirme kontrolü
@GetMapping("/orders")
public Order getOrder(@RequestParam String orderId) {
return orderRepository.findById(orderId);
}
// ✅ Güvenli uygulama
@GetMapping("/orders")
public ResponseEntity getOrder(
@RequestParam String orderId,
Principal principal) {
Order sipariş = orderRepository.findById(orderId);
if (!order.getUser().equals(principal.getName())) {
return ResponseEntity.status(HttpStatus.FORBIDDEN)
.body(Collections.singletonMap("error", "Access denied"));
}
return ResponseEntity.ok(order);
}
React tarafı güvenli istek
javascript
async function fetchOrder(orderId) {
const res = await fetch(/orders?orderId=${orderId}, {
headers: { "Authorization": Bearer ${localStorage.getItem("token")} }
});
if (!res.ok) throw new Error("Yetkisiz veya bulunamadı");
return res.json();
}
IDOR Güvenlik Açıklarını Tespit Etme: Pratik Geliştirici Yaklaşımları
IDOR'u bulmak genellikle onu istismar etmekten daha zordur. Enjeksiyon güvenlik açıklarının aksine, IDOR her zaman bariz teknik hatalar üretmez; belirtileri mantıksal ve davranışsaldır.
Yaygın tespit teknikleri şunları içerir:
- Diferansiyel fuzzing (birden fazla ID'nin test edilmesi)
- Yeniden oynatma testi (yakalama → değiştirme → yeniden oynatma)
- Çok kullanıcılı rol değiştirme
- Parametre numaralandırma
Güvenli fuzzing sözde kodu:
python
Basit güvenli fuzzing örneği
ids = ["1001", "1002", "1003"]
için i in ids:
res = client.get(f"/api/user/profile?id={i}")
print(i, res.status_code, len(res.text))
IDOR'u Önleme: Geliştiricilerin Uyması Gereken En İyi Uygulamalar
IDOR'un önlenmesi gizleme ile ilgili değildir - bu yetkilendirmesunucu düzeyinde tutarlı bir şekilde gerçekleştirilmiştir.
İstemciden gelen nesne tanımlayıcılarına asla güvenmeyin
Her parametre değiştirilebilir. Şifrelenmiş kimlikler bile kurcalanabilir.
Her istekte sunucu tarafı yetkilendirmesini zorunlu kılma
Tanınmış erişim kontrol modellerini kullanın:
- RBAC (Rol Tabanlı Erişim Kontrolü)
- ABAC (Öznitelik Tabanlı Erişim Kontrolü)
- ACL'ler (Erişim Kontrol Listeleri)
- Kod olarak politika gibi sistemler OPA
Yetki kaynakları:
- OWASP: https://owasp.org
PortSwigger Web Güvenlik Akademisi: https://portswigger.net/web-security/access-control
Numaralandırılamayan tanımlayıcıları tercih edin
UUID'ler IDOR riskini azaltır ancak ortadan kaldırmaz.
Çok kiracılı ortamlarda kiracı sınırlarını doğrulama
Kiracılar arası IDOR en ağır ve maliyetli formlardan biridir.
Backend-for-Frontend (BFF) katmanı kullanın
Bir BFF, yetkilendirme mantığını merkezileştirerek istemciler arasındaki tutarsızlıkları azaltabilir.
Ek Gelişmiş Örnekler
Örnek 4: Eksik Yetkilendirme ile Go API
git
// ❌ Savunmasız işleyici
func GetDocument(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
doc := db.FindDocument(id)
json.NewEncoder(w).Encode(doc)
}
// ✅ Sahiplik doğrulaması ile
func GetDocumentSecure(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
user := r.Context().Value("user").(string)
doc := db.FindDocument(id)
if doc.Owner != user {
http.Error(w, "Unauthorized", http.StatusForbidden)
dönüş
}
json.NewEncoder(w).Encode(doc)
}
Örnek 5: GraphQL Uç Noktaları ve Nesne Yetkilendirmesi
javascript
// ❌ Savunmasız çözümleyici
const çözümleyiciler = {
Sorgu: {
order: (_, { id }) => db.getOrder(id),
}
};
// ✅ Sahiplik kontrolü ile güvenli çözümleyici
const resolversSecure = {
Sorgu: {
order: (_, { id }, context) => {
const order = db.getOrder(id);
if (order.owner !== context.user.id) {
yeni Hata("Erişim reddedildi") atar;
}
iade emri;
}
}
};
Örnek 6: Rust'ta Güvenli Erişim (Actix Web)
pas
// ❌ Savunmasız
async fn get_ticket(path: web::Path) -> impl Responder {
let id = path.into_inner();
let ticket = db::find_ticket(&id);
web::Json(ticket)
}
// ✅ Güvenli versiyon
async fn get_ticket_secure(
path: web::Path,
kullanıcı LoggedInUser
) -> impl Yanıtlayıcı {
let id = path.into_inner();
let ticket = db::find_ticket(&id);
if ticket.owner != user.id {
return HttpResponse::Forbidden().json("Erişim reddedildi");
}
HttpResponse::Ok().json(ticket)
}
IDOR Tespitini Otomatikleştirme: Geleneksel Araçlar Neden Zorlanıyor?
Çoğu geleneksel güvenlik açığı tarayıcısı IDOR'u güvenilir bir şekilde tespit edemez çünkü IDOR, tarayıcıların geleneksel olarak yapamadığı iki şeyi gerektirir:
- İş mantığı farkındalığı
- Bağlamsal çoklu kullanıcı testi
Yalnızca imza tabanlı algılamaya veya tek kullanıcılı isteklere dayanan tarama araçları, özellikle API'lerde IDOR'u genellikle tamamen gözden kaçırır.
Penligent IDOR'un Otomatik Olarak Belirlenmesine Nasıl Yardımcı Olur?
İşte burası PenligentYapay zeka odaklı bir sızma testi platformu olan Penligent, benzersiz bir avantaj sağlar. Geleneksel tarayıcıların aksine, Penligent gerçekleştirir:
- Otomatik çok kullanıcılı simülasyon
- Nesneler arası parametre çıkarımı
- Akıllı kimlik desenleri tanıma
- Davranışsal diferansiyel analiz
- Gözlenen yanıtlara göre uyarlanan yapay zeka bulanıklaştırma
Penligent'ın güvenli, anonimleştirilmiş algılama çıktısının bir örneği:
vbnet
`Potansiyel IDOR tespit edildi:Bitiş noktası: /orders?id=1002Gözlenen davranış:
- A Kullanıcısı #1003 Siparişini aldı (B Kullanıcısına ait)Risk: Başka bir kullanıcının verilerine yetkisiz erişim
Bu tür bir içgörüye sadece statik araçlarla veya manuel incelemeyle ulaşmak zordur.
Penligent ile CI/CD Kapsamında IDOR Risklerini Azaltma
Penligent, CI/CD boru hatlarına doğal bir şekilde entegre olur ve sürekli kapsama alanı sağlar:
- API ve rota otomatik keşfi
- Gerçek zamanlı izin matrisi çıkarımı
- Evreleme ve üretim benzeri ortamların taranması
- Güvenli, tekrarlanabilir PoC dizilerinin otomatik olarak oluşturulması
Bu azaltır:
- İşletme mantığının kör noktaları
- Çok kiracılı maruziyet
- Düzenleyici riskler (GDPR, HIPAA, SOC2)
Sonuç: IDOR Basit Ama Yıkıcı Ve Önlenebilir
IDOR, erişim kontrolü güvenlik açıklarının en yaygın ve zarar verici biçimlerinden biri olmaya devam etmektedir. İş mantığı içinde gizlendiğinden, genellikle geleneksel araçları atlatır. Tutarlı yetkilendirme kontrolleri uygulayarak, öngörülemeyen tanımlayıcılar kullanarak, kiracı sınırlarını doğrulayarak ve Penligent gibi otomatik test platformlarını benimseyerek kuruluşlar büyük ölçekli veri açığa çıkma riskini önemli ölçüde azaltabilir.
IDOR tesadüfen veya iyi niyetle tamamen ortadan kaldırılamaz; yapılandırılmış erişim kontrolü, tutarlı mühendislik ilkeleri ve sürekli test gerektirir.

