# Dom Clobbering
AWS hackleme becerilerinizi sıfırdan ileri seviyeye taşıyın htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile öğrenin! * **Bir siber güvenlik şirketinde çalışıyor musunuz?** **Şirketinizi HackTricks'te reklamını yapmak ister misiniz?** veya **PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek ister misiniz?** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin! * [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonunu. * [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin. * [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter'da** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**'u takip edin**. * **Hacking hilelerinizi** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **ve** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **ile göndererek paylaşın**.
## **Temel Bilgiler** HTML etiketlerinde **`id`** ve **`name`** özellikleriyle **JS bağlamında global değişkenler oluşturmak mümkündür**. ```html
``` **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: ```html ``` ### Diziler ve Öznitelikler Bir dizi ve nesne özniteliğini **clobber** etmek de mümkündür: ```html ``` **Bir 3. özniteliği (örneğin x.y.z) clobberlamak** için bir **`form`** kullanmanız gerekmektedir: ```html
``` Daha fazla özniteliği clobberlemek **daha karmaşık ama hala mümkün**, iframeler kullanılarak: ```html ``` {% hint style="warning" %} 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. {% endhint %} Daha derin öznitelikleri clobberlemek için, aşağıdaki gibi **html kodlamasıyla iframe'ler** kullanabilirsiniz: ```html ``` ### **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. ```html
``` ## **`window.someObject`'ı Clobberlama** JavaScript'te sıkça şu şekilde karşılaşılır: ```javascript var someObject = window.someObject || {}; ``` 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: ```html
``` Zararlı bir kodda şu gibi bir açık bulunabilir: ```html ``` 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, **``** 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**](iframes-in-xss-and-csp.md#iframes-in-sop-2). ## Belge nesnesi üzerine yazma Belge Nesnesi'nin özniteliklerini DOM Clobbering kullanarak üzerine yazmak mümkündür: > [Belge](https://html.spec.whatwg.org/multipage/dom.html#document) arayüzü [isimli özellikleri destekler](https://webidl.spec.whatwg.org/#dfn-support-named-properties). Herhangi bir anda bir [Belge](https://html.spec.whatwg.org/multipage/dom.html#document) nesnesinin desteklenen özellik adları, aşağıdakileri içerir: [ağaç sırasına](https://dom.spec.whatwg.org/#concept-tree-order) 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ış](https://html.spec.whatwg.org/multipage/dom.html#exposed) [embed](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element), [form](https://html.spec.whatwg.org/multipage/forms.html#the-form-element), [iframe](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element), [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element) ve [açığa çıkarılmış](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) öğeleri için ad içeriği değeri ve belgeyi [kök](https://dom.spec.whatwg.org/#concept-tree-root) olarak kullanan bir belge ağaç yapısında bulunan öğeler;\ > \ > \- İsimsiz olmayan [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) içeriği olan tüm [açığa çıkarılmış](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) öğeleri ve belgeyi [kök](https://dom.spec.whatwg.org/#concept-tree-root) olarak kullanan bir belge ağaç yapısında bulunan öğeler;\ > \ > \- İsimsiz olmayan [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) ve isim içeriği olan tüm [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element) öğeleri ve belgeyi [kök](https://dom.spec.whatwg.org/#concept-tree-root) 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. ```javascript document.write("") document.cookie typeof(document.cookie) 'object' //Something more sanitize friendly than a img tag document.write("
") document.cookie HTMLCollection(2) [img, form, cookie: img] typeof(document.cookie) 'object ``` ## Element ezildikten sonra yazma **`document.getElementById()`** ve **`document.querySelector()`** çağrılarının sonuçları, aynı id özniteliğine sahip bir `` veya `` etiketi enjekte edilerek değiştirilebilir. İşte nasıl yapılacağı: ```html

clobbered ``` 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: ```html

existing text

clobbered ``` SVG araştırmaları, `` etiketinin de etkili bir şekilde kullanılabileceğini ortaya çıkardı: ```html clobbered ``` HTML etiketinin Chrome ve Firefox gibi tarayıcılarda SVG içinde çalışabilmesi için `` etiketi gereklidir: ```html clobbered ``` ## 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): {% code overflow="wrap" %} ```html ``` {% endcode %} * Daha fazla form özniteliği için [**burayı kontrol edin**](https://www.w3schools.com/tags/tag\_button.asp)**.** ## Referanslar * [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering) * [https://portswigger.net/web-security/dom-based/dom-clobbering](https://portswigger.net/web-security/dom-based/dom-clobbering) * Heyes, Gareth. JavaScript for hackers: Bir hacker gibi düşünmeyi öğrenin.
AWS hacklemeyi sıfırdan kahramanlık seviyesine öğrenin htARTE (HackTricks AWS Red Team Expert)! * Bir **cybersecurity şirketinde** çalışıyor musunuz? **Şirketinizi HackTricks'te reklamını yapmak** ister misiniz? veya **PEASS'ın en son sürümüne erişmek veya HackTricks'i PDF olarak indirmek** ister misiniz? [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin! * [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzdaki özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin * [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com) * [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter**'da beni takip edin 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Hacking hilelerinizi** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **ve** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **göndererek paylaşın.**