Burp Intruder ile Yetki Matrisi Taraması: Tekrar Edilebilir Bir Düzen
İki oturum ve bir ID listesiyle yetki matrisini taramak: baseline kaydı, saldırgan çereziyle toplu istek, uzunluk farkıyla ayıklama ve tek istekle doğrulama.
Burp Intruder ile Yetki Matrisi Taraması#
IDOR'u elle test etmek iki kullanıcı ve birkaç ID değişimiyle başlar, ama matris büyüdüğünde (test matrisi) elle devam etmek hem yavaş hem hatalıdır. Burp Intruder burada toplu tarama işini alır; karar verme işi insanda kalır. Aşağıdaki düzen, lab kurulumu notlarındaki gibi yalnızca kendi hedefine karşı uygulanır.
Kurulum: iki kullanıcı, bir baseline#
- Hedefte iki kullanıcı aç: A (kurban, objenin sahibi) ve B (saldırgan, geçerli ama yetkisiz).
- A'nın çereziyle objeye normal bir istek at, yanıtı kaydet. Bu baseline'dır: durum kodu, uzunluk, ayırt edici bir alan.
- B'nin çerezini Intruder'a taşı. Saldıran taraf her zaman B'dir.
Baseline olmadan tarama yapılmaz. Uzunluk farkını yorumlamak için normal yanıtın neye benzediğini bilmek gerekir.
Lab hedefi hazırlığı: kendi hedefinde kullanıcı ve obje kurulumu#
Bu bölümdeki her adım yalnızca kendi kurduğun hedefte yapılır. Başkasına ait bir sistemde deneme yapılmaz.
Adım 1: A ve B kullanıcılarını oluştur#
- Kendi lab hedefinde iki ayrı hesap aç. Kayıt formu varsa iki farklı e-posta kullan.
- A kullanıcısını obje sahibi olarak işaretle. B kullanıcısını aynı rolde ama farklı kiracıda ya da farklı grupta tut.
- Parolaları parola yöneticisine yaz. Bu yazıda parola paylaşılmaz, örneklerde parola alanı her zaman boş bırakılır.
- Her iki hesabın da giriş yapabildiğini ayrı ayrı doğrula. B hesabı giriş yapamıyorsa taramaya geçme, çünkü geçersiz çerez ile yetkisiz çerez farklı anlam taşır.
Adım 2: Hedef objeleri oluştur ve ID listesini not et#
- A hesabıyla giriş yap ve en az üç obje oluştur. Örnek bir fatura uygulaması ise üç fatura, bir profil uygulaması ise üç profil kaydı aç.
- Her objenin ID değerini bir tabloya yaz. Örnek kayıt biçimi aşağıdadır.
- B hesabıyla da bir obje oluştur. Bu, B tarafının normal yanıtının nasıl göründüğünü gösterir.
- Obje ID değerlerinin nereden geldiğini not et: adres çubuğu, API yanıtındaki
idalanı, indirilen export dosyası.
| Sahip | Obje tanımı | ID | Not |
|---|---|---|---|
| A | A fatura 1 | 101 | Baseline için kullanılır |
| A | A fatura 2 | 102 | Tarama listesine girer |
| A | A fatura 3 | 103 | Tarama listesine girer |
| B | B fatura 1 | 201 | B tarafının normal yanıtı |
Adım 3: Proxy üzerinden kayıt ve giriş#
- Burp proxy dinleyicisini aç ve tarayıcıyı proxy üzerinden geçecek şekilde ayarla.
- Önce A hesabıyla giriş yap. Proxy geçmişinde giriş isteğini bul ve oturum çerezinin adını not et.
- Sonra tarayıcı profilini temizle ya da gizli pencere aç ve B hesabıyla giriş yap.
- Her iki girişin de proxy geçmişinde göründüğünü doğrula. Geçmişte görünmeyen bir oturum, tarama sırasında yanlış çerez taşınmasına yol açar.
- ID listesini bir metin dosyasına yaz. Liste hazırlarken terminal komutları notundaki dosya birleştirme adımları işini kolaylaştırır.
Bu hazırlık bitmeden Intruder sekmesine geçme. Eksik kullanıcı ya da eksik ID listesi, tarama sonucunu yorumlanamaz hale getirir.
Proxy ve Repeater ile baseline kaydı#
Baseline, tek bir isteğin tekrar üretilebilir kaydıdır. Amaç, normal yanıtın durum kodu, uzunluk ve ayırt edici alan üçlüsünü sabitlemektir.
Tekrar üretilebilir istek akışı#
- Proxy sekmesinde intercept ayarını önce kapalı konuma al. Trafiği geçmişten seçmek, istek kaçırmayı azaltır.
- A hesabıyla hedef objeye normal bir istek gönder. Örnek: fatura 101 sayfasını aç.
- Proxy geçmişinde ilgili satırı bul. Sağ tık ile Repeater sekmesine gönder.
- Repeater sekmesinde isteği tekrar gönder. Yanıtın her seferinde aynı geldiğini doğrula.
- Bu isteği baseline olarak işaretle. Burp içinde isteğe bir not ekle ya da sekme adını
baseline-A-101yap.
Baseline kayıt tablosu#
Her baseline için aşağıdaki üç alanı yaz. Uzunluk değeri bayt olarak alınır.
| Alan | Örnek değer | Açıklama |
|---|---|---|
| Durum kodu | 200 | A hesabının kendi objesine erişimi |
| Yanıt uzunluğu | 1843 | Repeater yanıt panelindeki bayt değeri |
| Ayırt edici alan | hesap_no: ****-4401 | Yalnızca A objesinde görünen değer |
Uzunluk değeri tek başına anlam taşımaz. Hangi alanın ayırt edici olduğunu yazmak, sonraki ayıklama adımında zaman kazandırır.
Örnek istek ve yanıt çifti#
Aşağıdaki örnekte çerez ve gizli alanlar sansürlenmiştir. Gerçek değer kullanma.
GET /fatura/101 HTTP/1.1 Host: lab.local Cookie: session=SESSION_COOKIE_REDACTED Accept: application/json
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 1843 { "id": 101, "sahip": "KULLANICI_ADI_REDACTED", "hesap_no": "HESAP_NO_REDACTED", "tutar": 1250, "durum": "odendi" }
Aynı isteği B çereziyle Repeater sekmesinde bir kez gönder ve sonucu ayrı kaydet. Bu ikinci kayıt, yetkisiz erişim denemesinin beklenen reddedilme biçimini gösterir.
GET /fatura/101 HTTP/1.1 Host: lab.local Cookie: session=SESSION_COOKIE_REDACTED Accept: application/json
HTTP/1.1 403 Forbidden Content-Type: application/json Content-Length: 312 { "hata": "erisim_reddedildi", "mesaj": "Bu kayda erisim yetkiniz yok." }
Bu iki kayıt, tarama tablosunu okurken karşılaştırma noktası olur. 1843 baytlık 200 yanıtı ile 312 baytlık 403 yanıtı arasındaki fark, ayıklamanın temel ölçüsüdür.
Tarama: ID listesi, tek çerez#
Sniper attack, tek pozisyon: obje ID listesi. Çerez sabit olarak B'ye aittir. ID listesi tahmin edilebilir aralıklardan, export dosyalarından veya daha önce sızmış referanslardan kurulur; brute force tek kaynak değildir.
Sonuç tablosu response length'e göre sıralanır. Baseline uzunluğuna eşit dönen satırlar ilk şüphelilerdir. 403/404 dönenler elenir, 200 dönüp uzunluğu farklı olanlar ayrıca incelenir çünkü farklı obje aynı endpoint'ten farklı boyutta dönebilir.
Intruder Sniper kurulumu adım adım#
Bu bölüm, saldırı tipinden filtre ayarına kadar tıklama sırasını verir.
Adım 1: Saldırı tipi ve pozisyon işaretleme#
- Repeater sekmesindeki B çerezli isteği Intruder sekmesine gönder.
- Attack type alanını
Sniperolarak seç. Tek parametre değiştiği için Sniper yeterlidir. Cleardüğmesi ile tüm otomatik işaretleri temizle.- Yalnızca ID değerini seç ve
Addile pozisyon ekle. Örnek hedef:
GET /fatura/§101§ HTTP/1.1 Host: lab.local Cookie: session=SESSION_COOKIE_REDACTED
- Çerez satırında işaret olmadığını doğrula. Çerez değişirse tarama B tarafından yapılmış olmaz.
Adım 2: Payload setleri#
İki payload kaynağı hazırla. Biri aralık, biri listedir.
Kaynak 1: sayı aralığı
- Payload type:
Numbers - Aralık: 101 ile 110 arası
- Adım: 1
- Bu kaynak, ardışık ID üreten lab hedeflerinde işe yarar.
Kaynak 2: basit liste
- Payload type:
Simple list - Örnek girdiler:
101 102 103 201 9999 abc
- Her girdinin kaynağını ayrı yaz:
| Girdi | Kaynak |
|---|---|
| 101, 102, 103 | A tarafında oluşturulan objeler |
| 201 | B tarafının kendi objesi, kontrol girdisi |
| 9999 | Var olmayan ID, hata yanıtı örneği |
| abc | Tip denetimi, hata işleme gözlemi |
Liste girdilerini doğrudan yazmak yerine dosyadan yüklemek istersen tek sütunlu bir metin dosyası kullan. Dosyada boş satır bırakma, çünkü boş satır ayrı bir istek üretir.
Adım 3: Kaynak havuzu ve hız sınırlama#
- Resource pool ayarını aç ve yeni bir havuz oluştur.
- Eşzamanlı istek sayısını 1 olarak ayarla. Kendi lab hedefinde bile düşük değerle başla.
- İstekler arası beklemeyi aç. Örnek düzen, her istekten sonra kısa bir bekleme koyar.
- Hedef başkasına aitse bu ayarları gevşetme. Toplu istek atılan her hedef için yazılı izin gerekir.
Adım 4: Grep-match kuralları#
Grep-match, yanıtta geçen metinleri işaretler. Aşağıdaki örnek dizgileri ekle:
| Kural | Neden eklenir |
|---|---|
hesap_no | Ayırt edici alanın yanıtta görünüp görünmediğini gösterir |
HESAP_NO_REDACTED | Gerçek değer yerine bu yer tutucuyu ara, gerçek değeri tabloya yazma |
erisim_reddedildi | Reddedilme gövdesini işaretler |
yetkiniz yok | Hata metni varyantlarını yakalar |
odendi | Durum alanının sızıp sızmadığını gösterir |
Gerçek hesap numarası, e-posta ya da ad soyad değerini grep-match alanına yazma. Aranacak metin, alan adı ya da hata kodu olmalıdır.
Adım 5: Yanıt filtreleri#
- Results tablosunda durum koduna göre filtre aç.
- 200 yanıtlarını ayrı göster, 403 ve 404 yanıtlarını ayrı göster.
- Uzunluk sütununu görünür yap. Sıralama bu sütuna göre yapılacaktır.
- Baseline uzunluğunu bir kenara yaz. Örnek baseline 1843 bayt ise bu değeri filtre açıklamasına ekle.
Saldırıyı başlatmadan önce başlangıç isteğini bir kez daha gözden geçir: çerez B tarafına ait olmalı, pozisyon yalnızca ID üzerinde olmalı, payload listesi beklenen girdileri içermelidir.
Sonuç ayıklama: uzunluğa göre triyaj#
Intruder bitince ilk iş, results tablosunu yanıt uzunluğuna göre sıralamaktır. Uzunluk tek başına karar vermez, ama inceleme sırasını belirler.
Sıralama adımları#
- Length sütun başlığına tıkla ve büyükten küçüğe sırala.
- Baseline uzunluğuna eşit satırları işaretle. Bu satırlar ilk aday kümesidir.
- Kontrol girdisi 201 satırını bul. B tarafının kendi objesi beklenen normal yanıta örnek olur.
- Var olmayan ID girdisi 9999 satırını bul. Bu satır, hata gövdesinin uzunluğunu gösterir.
- Kalan satırları uzunluk gruplarına ayır: baseline ile aynı, kontrole yakın, hataya yakın, hiçbiriyle eşleşmeyen.
Aday sınıflandırma tablosu#
Her satırı üç sınıftan birine yaz. Örnek satırlar redakte edilmiştir.
| ID | Durum | Uzunluk | Sınıf | Gerekçe | Sonraki adım |
|---|---|---|---|---|---|
| 102 | 200 | 1843 | eslesen | Baseline ile aynı uzunluk ve hesap_no alanı var | Repeater ile doğrula |
| 103 | 200 | 1912 | supheli | Durum 200 ama uzunluk farklı, ayırt edici alan kısmi | Repeater ile gövdeyi karşılaştır |
| 9999 | 404 | 298 | elenen | Var olmayan ID, hata gövdesi dönmüş | İncelemeyi kapat |
| 201 | 200 | 1204 | elenen | B tarafının kendi objesi, beklenen normal yanıt | Kontrol olarak sakla |
| abc | 400 | 276 | elenen | Tip denetimi çalışmış, hata dönmüş | İncelemeyi kapat |
Aynı endpoint neden farklı boyutta döner#
Aynı uçtan dönen iki 200 yanıtının uzunluğu farklı olabilir. Nedenleri bilmek, yanlış elemeyi önler.
- Obje boyutu farklıdır. Bir faturada üç satır, diğerinde on satır vardır.
- İsteğe bağlı alanlar doludur ya da boştur. Açıklama alanı bir objede dolu, diğerinde boş döner.
- İlişkili kayıt sayısı değişir. Üyelik listesi bir objede iki kişi, diğerinde sekiz kişi içerir.
- Soft-delete yer tutucusu döner. Silinmiş obje tam veri yerine kısa bir durum gövdesi verir.
- Hata gövdesi 200 ile döner. Uygulama hatayı gövdede anlatır, durum kodunu değiştirmez.
Bu yüzden kural şudur: uzunluk sıralamayı verir, kararı gövde karşılaştırması verir.
Doğrulama: toplu değil tek istek#
Intruder bulgu üretmez, aday üretir. Her aday Repeater'da tek istekle doğrulanır:
- B'nin çereziyle gelen yanıt, A'nın verisini mi içeriyor?
- Yanıt başka bir tenant'a mı ait?
- Soft-delete veya eski üyelik adayı aynı davranışı mı veriyor?
Doğrulanmamış uzunluk farkı rapora girmez. Yanlış pozitiflerin tipik kaynağı, tenant filtresi ana sorguda varken ilişkili verinin geniş çekilmesidir.
Repeater doğrulama protokolü: 5 soruluk kontrol listesi#
Her aday için aynı beş soruyu sırayla yanıtla. Biri bile olumsuzsa bulgu yazma.
- İstek gerçekten B çereziyle mi atıldı? Repeater sekmesindeki çerez satırını ve proxy geçmişindeki B oturumunu karşılaştır.
- Yanıt A tarafına ait ayırt edici bir alan içeriyor mu? Alan adı değil, alanın A objesine özgü değeri aranır.
- Aynı istek A çereziyle atıldığında gövde aynı mı? İki gövdeyi yan yana koy ve farkı satır satır işaretle.
- Çerezsiz ya da geçersiz çerezle aynı istek ne döndürüyor? Herkese açık veri, yetki sorunu sayılmaz.
- Aday davranış tekrarlanabilir mi? İsteği iki kez gönder ve iki yanıtın da aynı kararı verdiğini doğrula.
Çalışılmış örnek#
Aday: ID 102, B çereziyle 200 ve 1843 bayt döndü. Baseline 101 ile aynı uzunlukta.
Doğrulama isteği redakte edilmiştir:
GET /fatura/102 HTTP/1.1 Host: lab.local Cookie: session=SESSION_COOKIE_REDACTED Accept: application/json
Yanıt gövdesi redakte edilmiştir:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 1843 { "id": 102, "sahip": "KULLANICI_ADI_REDACTED", "hesap_no": "HESAP_NO_REDACTED", "tutar": 980, "durum": "odendi" }
Karşılaştırma adımları:
- 102 numaralı obje A tarafının tablosunda kayıtlıdır. Sahip alanı A kullanıcısına aittir.
- Aynı istek A çereziyle gönderildiğinde aynı gövde dönmektedir. Gövde farkı yoktur.
- Çerezsiz istek 401 döndürmektedir. Veri herkese açık değildir.
- İstek iki kez tekrarlanmış, iki yanıtta da aynı alanlar görülmüştür.
- Sonuç adaylıktan bulguya geçer, çünkü beş sorunun beşi de aynı yönü göstermiştir.
Bu örneği kendi lab kaydına şablon olarak al. Her bulgu için istek, yanıt, karşılaştırma ve tekrar kaydı aynı dosyada durmalıdır.
Yanlış pozitif kataloğu#
Aşağıdaki her durum tek cümlelik açıklama taşır.
- Soft-delete kaydı: Silinmiş obje tam veri yerine kısa durum gövdesi döndürür, uzunluk farkı erişim farkı sanılır.
- Farklı obje boyutu: Aynı uçtan dönen iki normal kayıt, satır sayısı farklı olduğu için farklı uzunluk verir.
- Önbelleğe alınmış yanıt: Ara katman eski gövdeyi verir, güncel yetki denetimi yanıta yansımaz.
- Tek tip hata sayfası: Tüm reddedilmeler aynı gövdeyle döner, gerçek red ile yönlendirme hatası ayırt edilemez.
- Yalnızca ana sorguda kiracı filtresi: Ana kayıt süzülür ama ilişkili liste geniş çekilir, gövdede komşu kiracı verisi görülür.
Bu katalogu tarama tablosunun yanında tut. Bir adayı kapatırken hangi kataloğa girdiğini not et.
Bulgu kayıt formatı#
Her doğrulanmış bulgu için aynı alanları doldur. Eksik alanlı kayıt incelemeye alınmaz.
| Alan | İçerik |
|---|---|
| Bilesen | Hedef uç ve obje türü |
| Surum | Lab hedefinin sürüm etiketi |
| Onkosullar | A ve B hesapları ile gerekli objeler |
| Tekrar adimlari | Numaralı istek sırası |
| Gozlenen | Redakte edilmiş yanıt özeti |
| Etki | Hangi verinin kimin tarafından okunabildiği |
| Sinirliliklar | Test edilmeyen durumlar |
| Duzeltme | Sunucu tarafı denetim önerisi |
Doldurulmuş örnek#
- Bilesen:
GET /fatura/:iducu, fatura kaydı okuma. - Surum: lab hedefi etiketi
lab-2026-10-05, yerel kurulum. - Onkosullar: A hesabı 101 ve 102 numaralı faturalara sahiptir. B hesabı geçerli oturuma sahiptir ama 102 üzerinde yetkisi yoktur.
- Tekrar adimlari:
- A çereziyle
GET /fatura/102isteğini Repeater sekmesinde gönder, 200 ve ayırt edici alanı kaydet. - B çereziyle aynı isteği gönder, 200 ve aynı ayırt edici alanı gözlemle.
- Çerezsiz aynı isteği gönder, 401 döndüğünü doğrula.
- B isteğini ikinci kez gönder, yanıtın aynı olduğunu doğrula.
- A çereziyle
- Gozlenen: B çereziyle dönen gövdede 102 numaralı kayda ait
hesap_noalanı görülmüştür. Değer redakte edilmiştir:HESAP_NO_REDACTED. - Etki: Geçerli ama yetkisiz B kullanıcısı, A kullanıcısına ait fatura kaydını okuyabilmektedir.
- Sinirliliklar: Yazma uçları test edilmemiştir. Farklı roller ve paylaşım bağlantıları bu kayda dahil değildir.
- Duzeltme: Obje okuma öncesi sunucu tarafında sahiplik denetimi ekle, ID tahmini zorlaştırma yerine yetki denetimini esas al, hata yanıtlarını tek tipe indir.
Hız ve izin sınırı#
Intruder Community sürümünde throttled çalışır; bu bir engel değil, hedefe karşı nezaket sayılır. Kendi lab'ında bile thread sayısını düşük tut, hedef başkasına aitse yazılı izin olmadan tarama yapma. Kural basittir: toplu istek atılan her hedef için izin gerekir.
Community throttle ve Turbo Intruder notu#
Community sürümünde Intruder istekleri sıraya koyar ve akışı yavaşlatır. Bu davranış, hedefi yormamak için uygundur.
- Küçük ID listelerinde bu hız yeterlidir. 10 ile 30 arası ID için ek araca gerek yoktur.
- Havuz ayarını tek istek ve kısa bekleme ile tut. Hedef kendi lab hedefin olsa bile aynı ayarı koru.
- Turbo Intruder yalnızca iki durumda gündeme gelir: liste çok uzunsa ve hedefe karşı yazılı iznin varsa.
- Turbo Intruder için de izin kuralı değişmez. Araç değişince kapsam değişmez.
- Hız artmadan önce baseline ve filtre kurallarını bitir. Hızlı ama kör tarama, ayıklama yükünü artırır.
Turbo Intruder kullanacaksan önce küçük bir listeyle dene, sonuç tablosunu normal Intruder çıktısıyla karşılaştır, sonra tam listeye geç. Bu karşılaştırma, isteklerin hedefte aynı işlemi tetiklediğini gösterir.
İzin ve kapsam notları#
Toplu istek, tek isteğe göre farklı sorumluluk taşır.
- Toplu istek atılan her hedef için yazılı izin gerekir. Sözlü onay yeterli değildir.
- Kapsam dışı uçlara istek gönderme. İzin yalnızca belirtilen host ve belirtilen uçları kapsar.
- Kendi lab hedefinde çalış. Adres çubuğundaki host ile izin belgesindeki host aynı olmalıdır.
- Her taramanın kaydını sakla: tarih, hedef host, ID listesi aralığı, kullanılan çerez sahibi, sonuç dosyası.
- Yanıtları saklarken kişisel verileri redakte et. Ham gövdeleri paylaşılan klasöre koyma.
- Test bitince oturum çerezlerini geçersiz kıl. Lab hedefinde bile eski çerezleri açık bırakma.
Bu notlar, teknik adımlar kadar bağlayıcıdır. Kayıt tutmak, sonradan yapılan incelemede neyin test edildiğini gösterir.
Kısa sonuç#
Düzen üç parçadır: baseline kaydı, B çereziyle ID taraması, Repeater'da tek istekle doğrulama. Intruder matrisi saatler süren işten dakikalık aday listesine indirir; yetki kararını veren yine insandır.
Bu düzeni kapatırken üç dosyayı aynı klasörde topla: baseline kaydı, sınıflandırılmış tarama tablosu ve doldurulmuş bulgu formu. Bir sonraki taramada aynı ID listesi ve aynı soru listesi kullanılır, böylece sonuçlar karşılaştırılabilir olur.
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver