Reflected XSS nedir, neden pipeline
Reflected XSS, kullanıcı girdisinin aynı yanıtta kodlanmadan geri yansıtıldığı yerde doğar: bir parametre değeri sayfaya geri basılır, tarayıcı onu HTML/JS olarak çalıştırır. Tek bir parametrede elle aramak şanstır; binlerce parametre üreten büyük bir hedefte iş, “şanslı parametreyi” sistematik olarak daraltmaya döner.
Aşağıdaki akış tam bunu yapar: geniş saldırı yüzeyini topla → canlıyı süz → tüm URL’leri çıkar → parametreli olanları ayıkla → gürültüyü at → kalan adayları otomatik tara. Her adım bir sonrakine daha temiz, daha küçük bir küme devreder.
Yetki notu: Bu akış yalnızca sahibi olduğun ya da yazılı izin/bug bounty kapsamı olan hedeflerde çalıştırılır. İzinsiz tarama suçtur.
1. Saldırı yüzeyini topla — subfinder
subfinder -dL target.txt -all -o subs.txt
target.txt içindeki her kök domain için pasif kaynaklardan (sertifika logları, pasif DNS, API’ler) subdomain toplar. -all tüm kaynakları açar, -dL liste girişi alır. Çıktı: olası tüm hostlar. Henüz hiçbirine paket göndermedik — bu pasif keşif.
2. Canlıyı süz — httpx
httpx -list subs.txt -mc 200,301,302,403 -o alive.txt
Listedeki hostların hangisi gerçekten HTTP yanıtı veriyor? -mc (match code) ile sadece anlamlı durum kodlarını tutarız: 200 (canlı), 301/302 (yönlendirme — hedef hâlâ var), 403 (erişim kısıtlı ama mevcut — çoğu zaman ilginç). Ölü hostları eleyip yüzeyi gerçek hedeflere indirir.
3. URL’leri tara — katana
katana -list alive.txt -d 5 -jc -kf all -o katana.txt
Aktif crawler. Canlı hostları gezerek bağlantıları, formları ve JS içinde gömülü endpoint’leri çıkarır. -d 5 derinlik, -jc JavaScript’i ayrıştırıp içindeki URL’leri toplar (modern uygulamada parametreler çoğu zaman JS’te saklıdır), -kf all bilinen tüm dosya tiplerini takip eder. Bu, “canlı” URL kaynağımız.
4. Arşivlenmiş URL’ler — urlfinder
urlfinder -list alive.txt -all -o urlfinder.txt
Crawler’ın göremediği URL’leri pasif kaynaklardan toplar — geçmişte var olmuş ama linki kalmamış endpoint’ler. Eski, unutulmuş parametreler reflected XSS için altın madenidir; kimse bakmadığı için filtresiz kalmış olabilirler.
5. Wayback geçmişi — waybackurls
cat subs.txt | waybackurls > wayback.txt
Wayback Machine’in arşivlediği tarihsel URL’leri çeker. 4. adımla aynı mantık, farklı kaynak: ne kadar çok bağımsız kaynaktan toplarsan, kör nokta o kadar azalır. (Çoklu kaynak = tek bir tarama açısının kaçırdığını yakalama.)
6. Birleştir ve tekille — sort -u
cat katana.txt urlfinder.txt wayback.txt | sort -u > all_urls.txt
Üç kaynağı tek havuzda birleştirip sort -u ile yinelenenleri atar. Artık tek, temiz bir URL kümesi var.
⚠️ Bu dosya on binlerce satır olabilir.
catile tamamını ekrana basma —wc -l all_urls.txtile boyutuna bak, gerektiğindegrep/headile örnekle. Büyük çıktıyı kör basmak hem terminali hem dikkatini boğar.
7. Parametreli URL’leri ayıkla — grep ’=’
grep '=' all_urls.txt | sort -u > params.txt
Reflected XSS bir parametre değerine ihtiyaç duyar. = içeren satırlar (?q=..., &id=...) parametre taşıyanlardır; statik sayfaları (parametresiz) bu aşamada eleriz. Yüzey burada ciddi şekilde küçülür.
8. Gürültüyü temizle — urless
urless -i params.txt -o clean_params.txt
urless, aynı parametre desenini farklı değerlerle tekrar eden URL’leri tekilleştirir: id=1, id=2, id=999 aynı enjeksiyon noktasıdır — birini test etmek yeter. Statik varlıkları (.css, .png, .woff) ve değersiz parametreleri atar. Tarayıcıya gidecek listeyi yalın, benzersiz enjeksiyon noktalarına indirir.
9. Otomatik tara — dalfox
dalfox file clean_params.txt
dalfox, her parametreye kontrollü problar yollar; yansımayı tespit eder, yansıma context’ini (HTML gövdesi mi, attribute içi mi, JS string mi) analiz eder ve o context’e uygun payload’la sömürülebilirliği doğrular. Yalnız “yansıyor” demez — gerçekten çalıştırılabiliyor mu, onu söyler. Çıktı: doğrulanmış reflected XSS adayları.
Yansıma context’i — dalfox’un baktığı şey
Aynı yansıma, bulunduğu yere göre farklı payload ister. Otomasyon sonrası elle teyitte de bu tabloyu kullan:
| Context | Örnek yansıma | Kaçış mantığı |
|---|---|---|
| HTML gövdesi | <div>GIRDI</div> | <script>/<img onerror> doğrudan |
| Attribute | <input value="GIRDI"> | önce " ile attribute’tan çık |
| JS string | var x = "GIRDI" | "; ile string’i kapat, kod yaz |
| URL/href | <a href="GIRDI"> | javascript: şeması |
Otomasyon biter, doğrulama başlar
dalfox adayları üretir; bulgu değil. Her aday için: tarayıcıda gerçek bir oturumda tetikle, etkiyi (çerez/oturum erişimi, işlem yapma) somut göster, ve WAF/filtre yüzünden lab’da çalışıp üretimde çalışmayan yanlış-pozitifleri ele. Sadece gerçek, tekrarlanabilir tetiklemeyi raporla — “yansıyor ama tetiklenmiyor” rapor değildir.
Kapanış
Bu akışın değeri tek bir araçta değil, hunilemede: her adım bir öncekinin gürültüsünü atıp bir sonrakine daha keskin bir hedef verir. subfinder’ın bulduğu yüzlerce host, dalfox’a giden onlarca benzersiz parametreye iner — ve şans yerine süreç, reflected XSS’i tekrarlanabilir kılar.