Başka bir xss kopya kağıdı neden hala önemli?
Modern çerçeveler ≠ XSS içermez. React/Angular/Svelte'deki otomatik kaçış, şablonlama boşluklarını azaltır, ancak gerçek sistemler hala DOM API kötüye kullanımı, güvenli olmayan 3. taraf widget'ları, izin verilen Markdown/WYSIWYG'yi gönderir, javascript: URL işleyicileri, SVG/MathML, JSONP kalıntıları ve örtük güven konum/hash/postMessage.
Vektör ekosistemleri evrimleşir. PortSwigger sürekli olarak yüklere şu şekilde açıklama ekler olay / etiket / nitelik / tarayıcı"kabile hafızasını" büyük ölçüde azaltır. Yük taksonomilerini yeniden keşfetmeden geniş bir kapsama ihtiyacınız olduğunda bu küratörlük altın değerindedir.
Filtreleme tek başına bir savunma değildir. OWASP bunu on yılı aşkın bir süredir tekrarlamaktadır: doğruluk verinin işleme bağlamı. Birleştirme uygun çıktı kodlaması, steri̇li̇zasyon (kullanıcı tarafından yazılan HTML için), Politika (CSP, Güvenilir Tipler) ve çerçeve hi̇jyeni̇ pazarlığa açık değildir.

Saldırı yüzeyi × bağlam matrisi
Bu matrisi şu şekilde kullanın uygulama kontrol li̇stesi̇ Playwright/Burp/Nuclei doğrulamaları veya kod denetimleri yazarken. Her satır bir işleme bağlar bağlam riskli lavabolar, ortak girişler, the ilk savunma hamlesive nasıl doğrulanır ölçekte.
| Bağlam | Riskli batıklar (açıklayıcı) | Tipik giriş noktaları | Birincil savunma | Geniş ölçekte doğrulama nasıl yapılır |
|---|---|---|---|---|
| HTML metni | innerHTML, şablon dize birleştirme | yansıyan parametreler, arama kutuları, kullanıcı biyografileri, yorumlar | HTML çıktı kodlaması; asla güvenilmeyen HTML göndermeyin | Headless render + DOM-taint kancaları; önce/sonra DOM farkı |
| Öznitelik | href/src/action, herhangi üzerinde* işleyici | javascript: URL'ler, SVG öznitelikleri, veri: URL'ler | Öznitelik/URL kodlamasıyasaklamak javascript:; CSP | Öznitelik bazlı fuzz; otomatik tetikleyicileri ve gezinmeyi izleme |
| JavaScript | eval, Fonksiyon, setTimeout(string) | JSONP geri aramaları, dinamik komut dosyası birleştirme/ayrıştırma | Dinamik değerlendirmeyi yasaklayın; girdileri serileştirin; gerekirse sandbox | Kanca eval/Fonksiyonçağrı yığınlarını ve argümanlarını toplar |
| URL/Nav | konum, belge.URL concat | açık yönlendirmeler, hash/fragment enjeksiyonları | Kanonikleştir; katı izin listeleri; asla ham dizeleri dikme | Gerçek UA tekrar oynatma; yönlendirme zinciri izleme |
| Şablonlama/SSR | güvensiz filtreler/parçalar | sunucu tarafı şablon veri geçişleri | Sıkı şablon kaçışı; değişken beyaz listeleri | Şablon birim testleri + yer tutucu bulanıklaştırma |
| Zengin içerik | WYSIWYG/Markdown/SVG/MathML | yapıştırılan harici HTML/SVG; kullanıcı profili içeriği | Liste temizliğine izin ver (DOMPurify); CSPTehlikeli etiketleri bırakın | Toplu yük yeniden oynatma + CSP ihlali günlüğü |
Gerçekten çalıştırabileceğiniz minimum tekrarlanabilir örnekler (MRE'ler)
1) Öznitelik bağlamı + sıfır etkileşimli tetikleyici
<input autofocus onfocus="fetch('/beacon?xss=1')">
Neden önemli? Odak olayları, birçok UX akışında (arama alanları, hızlı istemler) yüklendiğinde kendiliğinden tetiklenir. İle değiştirin <svg onload=…> veya <img onerror="…"> farklı tetikleyici semantiklerini test etmek için.
2) SVG taşıyıcı + URL işleme tuhaflıkları
<svg><a xlink:href="javascript:fetch('/beacon?svg')">x</a></svg>
Neden önemli? SVG, tarihsel olarak ilginç öznitelik ayrıştırmasına sahip ayrı bir XML ad alanıdır. Ekipler genellikle SVG'yi sterilize etmeyi veya Markdown oluşturucular aracılığıyla buna izin vermeyi unutur.
3) DOM tabanlı XSS (kaynak → lavabo soyağacı)
<script>
const q = new URL(location).hash.slice(1);
document.getElementById('out').innerHTML = q; // sink
</script>
<div id="out"></div>
Neden önemli? Klasik "URL'den oku, DOM'a yaz" anti-paterni. Eski sitelerde ve dahili araçlarda her yerde var. İle düzeltin bağlam-doğru kodlama ve asla doğrudan HTML lavabolarına yazmayın.
Savunma temelleri (önce mühendislik, sloganlar değil)
- Bağlama göre çıktı kodlaması. Şunun için kodlayın HTML / Öznitelik / URL / JS sırasıyla. Çerçeve otomatik kaçışı şunları kapsamaz elle haddelenmiş DOM güncellemeler.
- Kullanıcı HTML'si için izin listesi sanitizasyonu. İş mantığı zengin içerik (yorumlar, biyografiler, bilgi tabanları) gerektirdiğinde DOMPurify (veya eşdeğeri) sertleştirilmiş yapılandırmalarla; kara liste "kelime doğramadan" kaçının.
- İçerik Güvenliği Politikası. İle başlayın
script-src 'self'+ varsayılan olarak satır içi blok; ayarlaobject-src 'none'vebase-uri 'none'. Evlat edinmek Güvenilir Tipler Chromium'da güvenli DOM API'lerini derleme/çalışma zamanında zorlamak için. - Tehlikeli API denetimi. Yasakla ya da geçit aç
eval/yeni İşlev/setTimeout(string)ve dinamik JSON→kod dönüşümleri. Derleme sırasında ESLint kurallarıyla zorlayın ve ihlaller ortaya çıktığında CI'yi başarısızlığa uğratın. - Kod olarak test edin ve doğrulayın. Yük tekrarını otomatikleştirin. İle eşleştirin CSP ihlal raporlaması ve ağ geçidi/log korelasyonu "demolanabilir açılır pencereleri" istismar edilebilir iş için önemli olan yollar.
Hile sayfasından boru hattına: sevkiyat yapan otomasyon
"Vektör kütüphanesinden" "üretim sınıfı güvenceye" giden en kısa yol beş aşamalı bir döngüdür:
- Bağlam keşfi. Statik taramalar (ESLint kuralları, semantik grep) + potansiyel yutakları etiketleyen çalışma zamanı probları (
innerHTML, öznitelik ayarlayıcıları, gezinme noktaları). - Vektör çizelgeleme. Her lavabo/bağlamı bir küratörlü havuz yükleri (öznitelik olayları, etiket tuhaflıkları, URL işleyicileri), tarayıcıya göre filtreleme ve özellik bayrakları.
- Başsız prova. Playwright/Chromium vektör başına çalışır. Konsol, ağ yakalama, CSP ihlallerive DOM mutasyonları.
- Sinyal korelasyonu. Başsız bulgulara katılın API ağ geçidi ve uygulama günlükleri̇ "gürültü ile gerçeği" ayırmak için. Bu, ilk günden yanlış pozitifleri öldürür.
- Kanıt öncelikli raporlama. Ekran görüntülerini, HTTP izlerini, DOM önce/sonra farklarını ve ilke ihlallerini otomatik olarak ekleyin-o zaman güven puanı Böylece mühendisler nereden başlayacaklarını bilirler.
Minimal Playwright yeniden oynatıcısı (drop-in snippet)
import { chromium } from 'playwright';
const vektörler = [
'#\"><img src="x" onerror="fetch(\">',
'#<svg onload="fetch(\">'
];
(async () => {
const browser = await chromium.launch();
const sayfa = await browser.newPage();
page.on('console', m => console.log('console:', m.text()));
page.on('pageerror', e => console.error('pageerror:', e));
for (const v of vectors) {
await page.goto('https://target.example/' + v);
await page.screenshot({ path: `evidence_${encodeURIComponent(v)}.png` });
}
await browser.close();
})();
Üretin: her çalıştırmaya kaynak→bağlantı soy etiketleri ekleyin, açın Yalnızca CSP raporu ihlalleri toplamak ve depolamak için DOM farklılıkları PR'larda gerilemeleri belirgin hale getirmek için.
Tasarlamanız gereken çerçeve gerçekler
- React/JSX. Otomatik kaçış yardımcı olur, ancak dangerouslySetInnerHTML ve çiğ
ref.current.innerHTML = ...lavaboyu yeniden açın. Onlara kod kokusu muamelesi yapın; bir dezenfektanın ve Güvenilir Tipler politikasının arkasına saklanın. - Açısal. Dezenfektan iyi, ama bypassSecurityTrustHtml ve benzeri API'ler delikler açabilir; her bypass'ı belgeleyin ve incelenmiş kaynaklarla sınırlayın.
- Sonraki/Sonraki/SSR. Sunucu tarafından oluşturulan sayfalar yalnızca kodlanmış İçerik. Sunucu hatalarını "temizlemek" için asla istemci çerçevelerine güvenmeyin.
- Markdown/MDX/WYSIWYG. Onlara şöyle davranın HTML alımı sorunlar. Oluşturucunuzu güçlendirin, güvenilmeyen widget'ları korumalı alana alın ve olay özniteliklerini/URL işleyicilerini temizleyin.
- SVG/MathML. Bunlara izin vermeniz gerekiyorsa, özellik kümesini sınırlandırın ve XML ad alanlarını anlayan bir temizleyici çalıştırın. Kritik değilse, aşağıdakilere dönüştürün güvenli raster sunucuda.
Gerçekten ihtiyaç duyacağınız pratik yük aileleri
- Olay üzerinde otomatik tetikleyici:
otomatik odaklama,onload,onerror,onanimationstart,onfocus,onpointerenter. Kullanıcı tıklamaları olmadan istismar edilebilirliği kanıtlamak için harika. - URL işleyicileri:
javascript:,veri:ve bazenvbscript:(eski). İzin listelerini uygulayın. - Şablon çarpışmaları: Saf filtrelerden geçen bölme/katlama hileleri (örneğin, öznitelik bağlamlarından kopup HTML'ye yeniden girmek).
- DOM clobbering: Kod yollarını yeniden yönlendirmek ve bir lavaboya inmek için kimliklerin/isimlerin üzerine yazın.
- Mutasyon-gözlemci zamanlaması: İlk yükleme yerine dinamik güncellemelerden yararlanan tetikleyiciler.
CSP ve Güvenilir Türler: "olması güzel "den korkuluğa
- CSP kod kaynaklarını ve satır içi yürütmeyi kısıtlamak için size bir ilke dili sunar. Sıkı başlayın, sonra sadece incelenmiş vakalar için genişletin. İle eşleştirin
rapor-uri/rapor-içinve hasat i̇hlal raporlari telemetrenizde. - Güvenilir Tipler geliştiricileri geçmeye zorlamak politika tarafından oluşturulmuş değerlerini, aksi takdirde ham dizeleri kabul edecek olan DOM API'lerine (
innerHTML,outerHTML,insertAdjacentHTML,Range#createContextualFragment). Bu, DOM XSS'nin tüm sınıflarını yapı olarak ortadan kaldırır. - Yayılma ipucu: içinde CSP çalıştırın
sadece raporiki sprint için; ihlalleri düzeltin; sonra uygulayın. Tek bir tane tanıtın uygulama genelinde Güvenilen Türler ilkesi ve yalnızca onaylanmış inşaatçılar aracılığıyla "kutsanmış" HTML yayınlayın.
Mühendislere istismar edilebilirlik nasıl kanıtlanır?
- Repro senaryoları: Yeniden oynatmak için bir one-liner (URL veya curl) ve bir Playwright dalı sağlayın.
- DOM farkı: Tam olarak değişen düğümü ve yolu göster (
#app > .profile > .bio). - Çağrı yığınları: JS lavaboları için, yığın izlerini
eval/FonksiyonKancalar. - CSP kanıtları: Satır içi/komut dosyası src ihlalleri için ihlal JSON'u ekleyin.
- İş anlatımı: "Bu, oturum belirteçlerini
/hesapenjekte edilen bir<img>"işaretçi" her seferinde "alarm patladı "yı yener.
Bu xss hile sayfasını Penligent içinde çalıştırma
Eğer zaten kullanıyorsanız Penligent otomatik bir pentest platformu olarak, yukarıdakileri tek bir çalıştırılabilir şablon halinde paketleyebilirsiniz:
- Görev şablonu: "XSS Recon + Validate." Aracı keşif yapar (alt alan/port/parmak izi), tespit edilen bağlam başına vektörleri planlar, başsız yeniden oynatmayı yürütür ve sinyalleri ilişkilendirir gürültüyü kesmek için kütüklerle/geçitlerle.
- Kanıt öncelikli ihracat. Bulgular aşağıdakilerle birlikte gönderilir güven puanları, tekrarlanabilir adımlar, ekran görüntüleri, CSP ihlal günlükleri ve mühendislerinizin güvenebileceği DOM farkları.
- En çok nerede yardımcı olur. Karışık eski + SPA yığınlarına sahip büyük kapsamlar veya CSP/Güvenilir Türlere geçiş yapan ve ihtiyaç duyan ekipler kanıt odaklı triyaj yükün önemsizliğinden ziyade.

Tecrübeli ekipleri ısırmaya devam eden yaygın tuzaklar
- Girdiyi sterilize edin, çıktıyı değil. HTML kabul etmeniz gerekiyorsa, sanitize edin ve yine de hedef bağlama göre çıktı üzerinde kodlama yapar; ikisi birbirinin yerine kullanılamaz.
- İzin vermek
javascript:"esneklik" için. Tamamen kaldırın; yalnızca belirli protokolleri beyaz listeye alın (https,mailtobelkitel). - Markdown'a "güvenli metin" olarak davranma. Bu bir işleyicidir - güvenliğe eklentileri karar verir. İzin verilen etiketleri/öznitelikleri denetleyin; güvenilmeyen SVG için sunucu tarafı rasterleştirmeyi düşünün.
- HTML dışı bağlamları yok sayma. URL birleştirme ve JSON→JS değerlendirmeleri tekrarlanan suçlulardır. "Kod için dize yok" politikasını güçlendirin.
- Bir çevreye güvenmek. Headless'ta başarısız olan XSS, mobil Chromium'da veya eski masaüstü yapılarında başarılı olabilir. Saklayın tarayıcı matrisi yüksek değerli uygulamalar için.
Üretim kontrol listesi, bunu CI rozetinizin yanına iliştirin
- Bağlam farkındalığı kodlama HTML/Attr/URL/JS için birim testleri içeren yardımcı programlar
- DOMPurify (veya eşdeğeri) zengin içerikli yollar için sertleştirilmiş bir yapılandırmaya kilitlendi
- CSP ile
script-src 'self'(güvenli olmayan satır içi yok),object-src 'none',base-uri 'none'Telemetriye bağlı ihlal toplama - Güvenilir Tipler ham dize havuzlarını engellemek için politika + derleme zamanı lint kuralları
- ESLint yasaklama kuralları
eval/yeni İşlev/setTimeout(string)(CI-zorunlu) - Oyun Yazarı tekrar paketi PortSwigger tarzı vektörlerle tohumlanmış; vektör başına ekran görüntüleri + DOM farkları
- Otomatik sinyal korelasyonu uygulama günlükleri / API ağ geçidi olayları ile
- Kanıt öncelikli raporlar ile güven puanları ve iş etkisi notları
- PR şablon satırları: "Yeni HTML lavaboları mı sunuyor?" "Dezenfektanı atlar mı?" "TT politikası güncellendi mi?"
- Üçüncü taraf widget/WYSIWYG/Markdown ayarlarının düzenli olarak gözden geçirilmesi
SSS
S: Zaten React/Angular kullanıyorsak, yine de buna ihtiyacımız var mı?
C: Evet. Frameworkler tüm DOM yazımlarını, üçüncü taraf widget'larını veya Markdown/SVG'yi denetlemez. Hala sanitizer + CSP + TT'ye ihtiyacınız var ve ham DOM lavabolarına güvenilmeyen veriler yazmaktan kaçınmalısınız.
S: CSP ile tüm satır içi komut dosyalarını engellemeli miyiz?
C: Evet, varsayılan olarak. Nonces veya hash'leri yalnızca kesinlikle gerekli olduğunda kullanın ve istisnayı belgeleyin. Uzun vadeli hedef, satır içi komut dosyalarından tamamen kaçınmaktır.
S: Dezenfeksiyon yeterli mi?
C: Hayır. Sanitizasyon, aşağıdakiler için saldırı yüzeyini azaltır HTML alımıama yine de doğru çıktı kodlaması ve politika korkulukları. Farklı sorunlar, farklı araçlar.
S: Hangi tarayıcıları test ediyoruz?
C: En azından kullanıcı tabanınızın en iyi iki masaüstü + mobil motoru. Küçük bir matris tutun; bazı vektörler tarayıcıya özgüdür veya özellik bayraklıdır.
Daha fazla okuma (yetkili)
- PortSwigger - Siteler Arası Komut Dosyası (XSS) Hile Sayfası - vektörler, PoC'ler ve tarayıcı notlarından oluşan canlı bir katalog.
- OWASP - XSS Önleme Hile Sayfası - titiz, bağlama özgü kodlama stratejileri ve yap/yapma tabloları.
- OWASP - DOM Tabanlı XSS Önleme Hile Sayfası - kaynak→bağlantı kalıpları ve tarayıcıdaki hafifletmeler.
- PortSwigger - XSS nedir? - Yeni işe alınanların eğitimi için yapılandırılmış eğitim ve uygulamalı laboratuvarlar.
Ek: hızlı sanitasyon ve kodlama referansı
- HTML metin düğümleri → kaçış
& " ' / - Öznitelik değerleri → HTML-öznitelik kodlama + güvenilmeyen verilerden olay özniteliklerine izin vermeme
- URL'ler → bileşenleri kodla; izin listesi protokolleri; asla ham yazmayın
javascript:/veri: - JS dizeleri → serileştirmek güvenli bir şekilde; kullanıcı verilerini asla kod yorumlayan API'lere aktarmayın
Kapanış notu: Yararlı bir xss hi̇le sayfasi yapabileceğiniz bir boru hattınıza bağlayın-Akıllı yüklerin posteri değil. Bağlam keşfi ile başlayın, vektörleri bağlama göre planlayın, başsız olarak tekrar oynatın, günlüklerle ilişkilendirin ve kanıtları güven puanlarıyla gönderin. İster Penligent'ı benimseyin ister kendi koşum takımınızı oluşturun, süreci kanıt ve politikanın korkulukları uygulamasına izin verin.

