Modern web ekosisteminde DOM (Document Object Model), etkileşimli ve dinamik kullanıcı deneyimlerinin sağlanmasında çok önemli bir rol oynar. DOM'u bir web tarayıcısının bir web sayfasını yüklediğinde oluşturduğu bir harita veya plan olarak düşünün. Gördüğünüz her öğe - başlıklar, paragraflar, düğmeler, resimler - bu hiyerarşik yapı içinde bir düğüm olarak temsil edilir. Geliştiriciler bu haritada gezinmek, öğeleri değiştirmek, yenilerini eklemek veya tıklamalar ve form gönderimleri gibi kullanıcı eylemlerine yanıt vermek için JavaScript kullanabilir. Örneğin, bir "Daha Fazla Göster" düğmesine tıklamak, gizli metni görüntülemek için DOM'u değiştiren bir komut dosyasını tetikleyebilir. DOM etkileşimli olduğundan ve sürekli güncellendiğinden, statik HTML kodu ile kullanıcıların deneyimlediği dinamik davranış arasında bir arayüz görevi görür ve doğal olarak kabul ettiğimiz etkileşimli özellikleri yönlendirir.
Ancak aynı etkileşim, istemci tarafı koduna özgü güvenlik açıklarına da kapı açabilir. İster sızma test uzmanları ister kurumsal varlıkları savunmakla görevli mühendisler olsun, güvenlik uzmanları için DOM güvenlik açıklarını anlamak yalnızca istismar için değil aynı zamanda önleme için de gereklidir.

Güvenlik Bağlamında DOM
Güvenli kodlamada, verilerin DOM içinde nasıl aktığını izlemek çok önemlidir. Saldırgan tarafından kontrol edilen bir kaynak - örneğin bir URL parametresi (konum.arama
), bir çerez (document.cookie
) veya yönlendiren bilgileri (document.referrer
) - güvensiz bir lavaboya enjekte edildiğinde tehlikeli olabilir, örneğin innerHTML
veya eval()
. DOM tabanlı güvenlik açıklarını mümkün kılan şey kaynaktan lavaboya uzanan zincirdir.
Yaygın DOM Güvenlik Açıkları
Güvenlik Açığı Türü | Örnek Lavabo | Açıklama | Potansiyel Etki |
---|---|---|---|
DOM tabanlı XSS | document.write()element.innerHTML | Saldırgan tarafından kontrol edilen verilerin sanitizasyon olmadan HTML'ye enjekte edilmesi, keyfi JavaScript yürütülmesine olanak tanır. | Çerez hırsızlığı, oturum ele geçirme, kötü amaçlı içerik enjeksiyonu. |
Açık Yönlendirme | pencere.konum | Hatalı URL işleme, saldırganların kullanıcıları kötü amaçlı sitelere yönlendirmesine olanak tanır. | Kimlik avı saldırıları, kötü amaçlı yazılım dağıtımı, marka güveninin zedelenmesi. |
Çerez Manipülasyonu | document.cookie | Saldırgan, güvenli olmayan JavaScript kodu aracılığıyla oturum çerezlerinin üzerine yazabilir veya bunları çalabilir. | Hesap ele geçirme, oturum ele geçirme, kimliğe bürünme. |
JavaScript Enjeksiyonu | eval() | Saldırgan tarafından sağlanan dizeyi JavaScript kodu olarak yürütür. | Tam istemci tarafı tehlikesi, veri sızıntısı. |
Belge Alanı Manipülasyonu | document.domain | Aynı kökenli kısıtlamaları atlamak için etki alanını değiştirme. | Etki alanları arası veri sızıntıları, ayrıcalık yükseltme. |
WebSocket URL Zehirlenmesi | WebSocket() | WebSocket bağlantıları için kötü amaçlı uç noktalar sağlama. | Veri akışlarına müdahale, yetkisiz eylemler. |
Bağlantı Manipülasyonu | element.src | Saldırgan, kötü amaçlı kod yüklemek veya veri çalmak için kaynak bağlantılarını değiştirir. | Kötü amaçlı yazılım enjeksiyonu, izleme, kimlik avı açılış sayfaları. |
Web Mesajı Manipülasyonu | postMessage() | Hedef çerçeveyi/pencereyi manipüle etmek için hazırlanmış mesajlar gönderme. | Veri sızıntısı, çapraz kökenli saldırılar. |
Ajax Request-header Manipülasyonu | setRequestHeader() | Saldırgan, HTTP istek başlıklarını istemci tarafı kodunda kontrol eder. | API kötüye kullanımı, CSRF benzeri istismar. |
Yerel Dosya Yolu Manipülasyonu | FileReader.readAsText() | Uygun kısıtlamalar olmadan istemci tarafı JS aracılığıyla yerel dosyaların okunması. | Hassas yerel verilerin sızması. |
İstemci tarafı SQL Enjeksiyonu | ExecuteSql() | Sanitize edilmemiş verilerin istemci tarafı DB sorgularına aktarılması. | Veri hırsızlığı, DB manipülasyonu. |
HTML5 Depolama Manipülasyonu | sessionStorage.setItem() / localStorage.setItem() | Kötü amaçlı yüklerin daha sonra yürütülmek üzere tarayıcı depolama alanında saklanması. | Kalıcı XSS, yetkisiz istemci veri erişimi. |
İstemci Tarafı XPath Enjeksiyonu | document.evaluate() | XPath sorgularına enjeksiyon, saldırganın XML verilerine erişmesini sağlayabilir. | Veri sızıntıları, manipülasyon XML tabanlı uygulama mantığı. |
İstemci Tarafı JSON Enjeksiyonu | JSON.parse() | Güvenilmeyen kaynaklardan kurcalanmış JSON'un ayrıştırılması, keyfi nesne enjeksiyonuna izin verir. | Veri üzerine yazma, mantık manipülasyonu. |
DOM-veri Manipülasyonu | element.setAttribute() | Özniteliklerin güvenilmeyen verilerle ayarlanması kötü niyetli davranışları tetikleyebilir. | XSS, clickjacking, mantık bypass. |
Hizmet Reddi (DoS) | RegExp() | Büyük veya kötü amaçlı regex kalıpları tarayıcıyı dondurur. | Uygulama kesintileri, düşük performans. |
DOM Güvenlik Açıkları Nasıl Bulunur?
Güvenlik ekipleri genellikle stratejilerin bir karışımını kullanır.
- Aktif taramaBurp Suite veya OWASP ZAP gibi araçları kullanarak, test uzmanlarının güvenli olmayan DOM etkileşimlerini simüle etmesine ve gözlemlemesine olanak tanır.
- Pasif keşif DOM katmanında gizlenmiş hassas verileri ortaya çıkarmak için Shodan, ZoomEye ve PublicWWW gibi kaynakları ve hatta Wayback Machine'deki geçmiş anlık görüntüleri taramayı içerir.
- Otomatik Regex ve Yapay Zeka Analizi, Bilinen kimlik bilgileri için kalıp eşleştirmeyi, Kaynak → Lavabo akışlarını eşleştiren yapay zeka odaklı analizle birleştirerek algılama ve düzeltme arasındaki süreyi önemli ölçüde kısaltır.
DOM Güvenlik Açıklarına Karşı Savunma
Güçlü savunmalar, DOM'a yalnızca güvenilir verilerin ulaşmasını sağlamak için disiplinli girdi doğrulamasıyla - ideal olarak bir beyaz liste aracılığıyla - başlar.
Kodlama stratejileri bağlama göre uyarlanmalıdır: Sayfa çıktısı için HTML kodlaması, komut dosyası ekleme noktaları için JavaScript kaçışı ve bağlantı oluşturma için URL kodlaması.
API anahtarları, ön uç kodunda kesinlikle görünmeleri gerektiğinde, yönlendiren ve kaynak kontrolleri, IP kısıtlamaları ve oran sınırları kullanılarak kilitlenmelidir.
Ekipler dağıtımdan hemen önce bir DOM incelemesi yapmalı, gizli dizileri ve güvenli olmayan kodları kaldırmalı ve arşivlenmiş anlık görüntülerde bile olsa şimdiye kadar açığa çıkmış tüm kimlik bilgilerini iptal etmelidir.

Penligent ile DOM Güvenliğini Yükseltme
Geleneksel olarak, kapsamlı bir DOM güvenlik denetimi yürütmek için çok sayıda aracı (keşif için Nmap, enjeksiyon testi için Burp Suite, istismar için SQLmap) bir araya getirmek ve ardından her bulguyu doğruluk açısından manuel olarak gözden geçirmek gerekiyordu.
Penligent, test uzmanlarının hedeflerini sade bir İngilizce ile tanımlamalarına izin vererek bu durumu değiştiriyor. "Bu web sitesini DOM güvenlik açıkları için tara" gibi bir istek akıllı bir iş akışını tetikler: Yapay zeka, Nmap, Burp Suite dahil olmak üzere iki yüzden fazla güvenlik aracını entegre eder, SQLmapPotansiyel Kaynak → Lavabo zincirleri üzerinde hedefli taramalar yapmak, yanlış pozitifleri ortadan kaldırmak için her bulguyu doğrulamak ve önem derecesine göre sıralamak için. Hem deneyimli güvenlik uzmanları hem de yeni başlayanlar için bu, DOM denetimlerini birkaç günlük manuel maratonlardan saatler hatta dakikalar içinde tamamlanan aerodinamik, yüksek doğruluklu süreçlere dönüştürür.