Dom Clobbering
Temel Bilgiler
HTML etiketlerinde id
ve name
özellikleriyle JS bağlamında global değişkenler oluşturmak mümkündür.
Sadece belirli öğeler, embed
, form
, iframe
, image
, img
ve object
öğeleri, name özniteliğini kullanarak global değişkenleri clobber edebilir.
İlginç bir şekilde, bir form öğesi kullanarak bir değişkeni clobber ettiğinizde, öğenin kendisinin toString
değerini alırsınız: [object HTMLFormElement]
ancak anchor ile toString
değeri anchor'ın href
değeri olacaktır. Bu nedenle, a
etiketi kullanarak clobber yaparsanız, dize olarak işlendiğinde değeri kontrol edebilirsiniz:
Diziler ve Öznitelikler
Bir dizi ve nesne özniteliğini clobber etmek de mümkündür:
Bir 3. özniteliği (örneğin x.y.z) clobberlamak için bir form
kullanmanız gerekmektedir:
Daha fazla özniteliği clobberlemek daha karmaşık ama hala mümkün, iframeler kullanılarak:
Stil etiketi, iframe'in render işlemini yapması için yeterli zamanı vermek için kullanılır. Bu olmadan, bir tanımsız uyarısıyla karşılaşacaksınız.
Daha derin öznitelikleri clobberlemek için, aşağıdaki gibi html kodlamasıyla iframe'ler kullanabilirsiniz:
Filtre Atlama
Bir filtre, document.getElementByID('x').attributes
gibi bir şey kullanarak bir düğümün özelliklerini döngüyle geçiyorsa, .attributes
özniteliğini clobber edebilir ve filtreyi kırabilirsiniz. tagName
, nodeName
veya parentNode
gibi diğer DOM özellikleri de clobberable olabilir.
window.someObject
'ı Clobberlama
window.someObject
'ı ClobberlamaJavaScript'te sıkça şu şekilde karşılaşılır:
Sayfa üzerinde HTML manipülasyonu, someObject
'i bir DOM düğümüyle geçersiz kılmanıza ve potansiyel olarak güvenlik açıklarına neden olmanıza olanak tanır. Örneğin, someObject
'i kötü amaçlı bir betiğe işaret eden bir bağlantı elemanıyla değiştirebilirsiniz:
Zararlı bir kodda şu gibi bir açık bulunabilir:
Bu yöntem, istenmeyen kodları çalıştırmak için betik kaynağını kullanır.
Hile: DOMPurify
, cid:
protokolünü kullanmanıza olanak tanır, bu da çift tırnakları URL kodlaması yapmadığı anlamına gelir. Bu, çalışma zamanında kodun çözümleneceği kodlanmış çift tırnakları enjekte edebileceğiniz anlamına gelir. Bu nedenle, <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
gibi bir şey enjekte etmek, HTML kodlu "
'nin çalışma zamanında çözümleneceğini ve öznitelik değerinden kaçacağını ve onerror
olayını oluşturacağını yapar.
Başka bir teknik, bir form
öğesi kullanır. Belirli bir istemci tarafı kitaplığı, yeni oluşturulan bir form öğesinin özniteliklerini temizlemek için bunları kontrol eder. Ancak, formun içine id=attributes
olan bir input
ekleyerek, öznitelikler özelliğini etkili bir şekilde üzerine yazarsınız ve temizleyicinin gerçek özniteliklere erişmesini engellersiniz.
Bu tür bir üzerine yazma örneğini bu CTF yazısında bulabilirsiniz.
Belge nesnesi üzerine yazma
Belge Nesnesi'nin özniteliklerini DOM Clobbering kullanarak üzerine yazmak mümkündür:
Belge arayüzü isimli özellikleri destekler. Herhangi bir anda bir Belge nesnesinin desteklenen özellik adları, aşağıdakileri içerir: ağaç sırasına göre, katkıda bulunan öğeye göre, daha sonraki yinelenmeleri yok sayarak ve aynı öğe hem ad hem de ad özniteliği katkıda bulunduğunda, ad özniteliği değerleri ad özniteliklerinden önce gelir:
- İsimsiz olmayan ad içeriği olan tüm açığa çıkarılmış embed, form, iframe, img ve açığa çıkarılmış object öğeleri için ad içeriği değeri ve belgeyi kök olarak kullanan bir belge ağaç yapısında bulunan öğeler; - İsimsiz olmayan id içeriği olan tüm açığa çıkarılmış object öğeleri ve belgeyi kök olarak kullanan bir belge ağaç yapısında bulunan öğeler; - İsimsiz olmayan id ve isim içeriği olan tüm img öğeleri ve belgeyi kök olarak kullanan bir belge ağaç yapısında bulunan öğeler.
Bu teknik kullanılarak yaygın olarak kullanılan değerlerin üzerine yazabilirsiniz, örneğin document.cookie
, document.body
, document.children
ve hatta document.querySelector
gibi Belge arayüzündeki yöntemler.
Element ezildikten sonra yazma
document.getElementById()
ve document.querySelector()
çağrılarının sonuçları, aynı id özniteliğine sahip bir <html>
veya <body>
etiketi enjekte edilerek değiştirilebilir. İşte nasıl yapılacağı:
Ayrıca, bu enjekte edilmiş HTML/body etiketlerini gizlemek için stiller kullanarak, innerText
içindeki diğer metinlerin müdahalesi engellenebilir ve böylece saldırının etkinliği artırılabilir:
SVG araştırmaları, <body>
etiketinin de etkili bir şekilde kullanılabileceğini ortaya çıkardı:
HTML etiketinin Chrome ve Firefox gibi tarayıcılarda SVG içinde çalışabilmesi için <foreignobject>
etiketi gereklidir:
Formları Clobbering
Bazı etiketlerin içine form
özniteliğini belirterek bir formun içine yeni girişler eklemek mümkündür. Bu yöntemi kullanarak bir formun içine yeni değerler ekleyebilir ve hatta göndermek için yeni bir düğme bile ekleyebilirsiniz (clickjacking veya bazı .click()
JS kodunu kötüye kullanma):
Daha fazla form özniteliği için burayı kontrol edin.
Referanslar
Heyes, Gareth. JavaScript for hackers: Bir hacker gibi düşünmeyi öğrenin.
Last updated