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. cat ile tamamını ekrana basma — wc -l all_urls.txt ile boyutuna bak, gerektiğinde grep/head ile ö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ımaKaçış mantığı
HTML gövdesi<div>GIRDI</div><script>/<img onerror> doğrudan
Attribute<input value="GIRDI">önce " ile attribute’tan çık
JS stringvar 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üzler­ce host, dalfox’a giden onlarca benzersiz parametreye iner — ve şans yerine süreç, reflected XSS’i tekrarlanabilir kılar.