Dom Clobbering
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
HTML etiketlerinde id
ve name
öznitelikleri ile JS bağlamında global değişkenler oluşturmak mümkündür.
Sadece belirli öğeler name attribute kullanarak global'ları clobber edebilir, bunlar: embed
, form
, iframe
, image
, img
ve object
.
İlginç bir şekilde, bir form element kullanarak bir değişkeni clobber ettiğinizde, öğenin kendisinin toString
değeri alırsınız: [object HTMLFormElement]
ancak anchor ile toString
anchor'un href
değeri olacaktır. Bu nedenle, a
etiketi kullanarak clobber yaparsanız, string olarak işlendiğinde değeri kontrol edebilirsiniz:
Bir diziyi ve nesne özelliklerini de çökmek mümkündür:
3. bir niteliği (örneğin x.y.z) etkisiz hale getirmek için bir form
kullanmalısınız:
Daha fazla özelliği clobberlamak daha karmaşık ama yine de mümkündür, iframe'ler kullanarak:
style etiketi iframe'in render edilmesi için yeterince zaman vermek amacıyla kullanılır. Bunu yapmadan undefined uyarısı alırsınız.
Daha derin özellikleri clobber etmek için, html kodlaması ile iframeler kullanabilirsiniz:
Eğer bir filtre, bir düğümün özellikleri üzerinden document.getElementByID('x').attributes
gibi bir şey kullanarak dönüyorsa, .attributes niteliğini geçersiz kılabilir ve filtreyi bozabilirsiniz. Diğer DOM özellikleri, tagName
, nodeName
veya parentNode
gibi ve daha fazlası da geçersiz kılınabilir.
window.someObject
JavaScript'te sıkça karşılaşılan bir durumdur:
HTML'yi sayfada manipüle etmek, someObject
'ı bir DOM düğümü ile geçersiz kılmayı sağlar ve bu da potansiyel olarak güvenlik açıkları oluşturabilir. Örneğin, someObject
'ı kötü niyetli bir betiğe işaret eden bir bağlantı öğesi ile değiştirebilirsiniz:
Bir açık kodda şöyle:
Bu yöntem, istenmeyen kodu çalıştırmak için script kaynağını kullanır.
Hile: DOMPurify
, cid:
protokolünü kullanmanıza izin verir, bu da çift tırnakları URL-encode etmez. Bu, çalışma zamanında çözülecek bir kodlanmış çift tırnağı 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 kodlanmış "
'ın çalışma zamanında çözülmesine ve özellik değerinden kaçmasına neden olarak onerror
olayını oluşturur.
Başka bir teknik, bir form
öğesi kullanır. Belirli istemci tarafı kütüphaneleri, yeni oluşturulan bir form öğesinin özelliklerini temizlemek için inceler. Ancak, formun içine id=attributes
olan bir input
ekleyerek, özellikler özelliğini etkili bir şekilde geçersiz kılarsınız ve temizleyicinin gerçek özelliklere erişmesini engellersiniz.
Bu tür bir clobbering örneğini bu CTF yazısında bulabilirsiniz.
Belgelerine göre, DOM Clobbering kullanarak belge nesnesinin özelliklerini geçersiz kılmak mümkündür:
Document arayüzü isimli özellikleri destekler. Desteklenen özellik adları bir Document nesnesinin belgede herhangi bir anda aşağıdakilerden oluşur, ağaç sırasına göre, katkıda bulunan öğeye göre, sonraki kopyaları göz ardı ederek ve aynı öğe her ikisini de katkıda bulunduğunda id özelliklerinden gelen değerlerin, ad özelliklerinden gelen değerlerden önce geldiği:
- Boş olmayan bir ad içerik özelliğine sahip ve belgede kök olarak belge ile belge ağacında bulunan tüm açık embed, form, iframe, img ve açık object öğeleri için ad içerik özelliğinin değeri; - Boş olmayan bir id içerik özelliğine sahip ve belgede kök olarak belge ile belge ağacında bulunan tüm açık object öğeleri için id içerik özelliğinin değeri; - Boş olmayan bir id içerik özelliğine ve boş olmayan bir ad içerik özelliğine sahip olan ve belgede kök olarak belge ile belge ağacında bulunan tüm img öğeleri için id içerik özelliğinin değeri.
Bu tekniği kullanarak, yaygın olarak kullanılan document.cookie
, document.body
, document.children
gibi değerleri ve hatta document.querySelector
gibi Document arayüzündeki yöntemleri geçersiz kılabilirsiniz.
document.getElementById()
ve document.querySelector()
çağrılarının sonuçları, aynı id niteliğine sahip bir <html>
veya <body>
etiketi enjekte edilerek değiştirilebilir. İşte bunun nasıl yapılacağı:
Ayrıca, bu enjekte edilmiş HTML/body etiketlerini gizlemek için stiller kullanarak, innerText
içindeki diğer metinlerden gelen müdahale önlenebilir ve böylece saldırının etkinliği artırılabilir:
SVG ile yapılan araştırmalar, bir <body>
etiketinin de etkili bir şekilde kullanılabileceğini ortaya koydu:
SVG'de HTML etiketinin Chrome ve Firefox gibi tarayıcılarda çalışabilmesi için bir <foreignobject>
etiketi gereklidir:
Bir formun içine yeni girişler eklemek mümkündür, sadece bazı etiketler içinde form
niteliğini belirtmek yeterlidir. Bunu, formun içine yeni değerler eklemek ve hatta yeni bir buton eklemek için kullanabilirsiniz göndermek için (clickjacking veya bazı .click()
JS kodlarını kötüye kullanarak):
Daha fazla form özellikleri için buton için buraya bakın.
Heyes, Gareth. Hackerlar için JavaScript: Bir hacker gibi düşünmeyi öğrenin.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)