mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
320 lines
24 KiB
Markdown
320 lines
24 KiB
Markdown
# DOM XSS
|
||
|
||
<details>
|
||
|
||
<summary><strong>AWS hacklemeyi sıfırdan kahramanla öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
|
||
|
||
* Bir **cybersecurity şirketinde** çalışıyor musunuz? **Şirketinizi HackTricks'te reklamını görmek** 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) koleksiyonumuz
|
||
* [**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** 🐦[**@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) **göndererek paylaşın**.
|
||
|
||
</details>
|
||
|
||
## DOM Zafiyetleri
|
||
|
||
DOM zafiyetleri, saldırgan tarafından kontrol edilen **kaynaklardan** (`location.search`, `document.referrer` veya `document.cookie` gibi) gelen verilerin güvensiz bir şekilde **sızıntılara** aktarıldığı durumlarda ortaya çıkar. Sızıntılar, zararlı içeriği yürütebilen veya oluşturabilen işlevler veya nesnelerdir (örneğin, `eval()`, `document.body.innerHTML`).
|
||
|
||
- **Kaynaklar**, saldırganlar tarafından manipüle edilebilen URL'ler, çerezler ve web mesajları gibi girişlerdir.
|
||
- **Sızıntılar**, zararlı verilerin kötü etkilere (örneğin, komut dosyası yürütme) yol açabileceği potansiyel olarak tehlikeli uç noktalardır.
|
||
|
||
Risk, verinin doğru doğrulama veya temizleme olmadan bir kaynaktan bir sızıntıya aktarılması durumunda ortaya çıkar ve XSS gibi saldırılara olanak tanır.
|
||
|
||
{% hint style="info" %}
|
||
**Kaynaklar ve sızıntıların daha güncel bir listesini** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) **adresinde bulabilirsiniz**
|
||
{% endhint %}
|
||
|
||
**Yaygın kaynaklar:**
|
||
```javascript
|
||
document.URL
|
||
document.documentURI
|
||
document.URLUnencoded
|
||
document.baseURI
|
||
location
|
||
document.cookie
|
||
document.referrer
|
||
window.name
|
||
history.pushState
|
||
history.replaceState
|
||
localStorage
|
||
sessionStorage
|
||
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
|
||
Database
|
||
```
|
||
**Ortak Sızıntılar:**
|
||
|
||
| [**Açık Yönlendirme**](dom-xss.md#açık-yönlendirme) | [**Javascript Enjeksiyonu**](dom-xss.md#javascript-enjeksiyonu) | [**DOM veri manipülasyonu**](dom-xss.md#dom-veri-manipülasyonu) | **jQuery** |
|
||
| -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
||
| `location` | `eval()` | `scriptElement.src` | `add()` |
|
||
| `location.host` | `Function() constructor` | `scriptElement.text` | `after()` |
|
||
| `location.hostname` | `setTimeout()` | `scriptElement.textContent` | `append()` |
|
||
| `location.href` | `setInterval()` | `scriptElement.innerText` | `animate()` |
|
||
| `location.pathname` | `setImmediate()` | `someDOMElement.setAttribute()` | `insertAfter()` |
|
||
| `location.search` | `execCommand()` | `someDOMElement.search` | `insertBefore()` |
|
||
| `location.protocol` | `execScript()` | `someDOMElement.text` | `before()` |
|
||
| `location.assign()` | `msSetImmediate()` | `someDOMElement.textContent` | `html()` |
|
||
| `location.replace()` | `range.createContextualFragment()` | `someDOMElement.innerText` | `prepend()` |
|
||
| `open()` | `crypto.generateCRMFRequest()` | `someDOMElement.outerText` | `replaceAll()` |
|
||
| `domElem.srcdoc` | **\`\`**[**Yerel dosya yolu manipülasyonu**](dom-xss.md#yerel-dosya-yolu-manipülasyonu) | `someDOMElement.value` | `replaceWith()` |
|
||
| `XMLHttpRequest.open()` | `FileReader.readAsArrayBuffer()` | `someDOMElement.name` | `wrap()` |
|
||
| `XMLHttpRequest.send()` | `FileReader.readAsBinaryString()` | `someDOMElement.target` | `wrapInner()` |
|
||
| `jQuery.ajax()` | `FileReader.readAsDataURL()` | `someDOMElement.method` | `wrapAll()` |
|
||
| `$.ajax()` | `FileReader.readAsText()` | `someDOMElement.type` | `has()` |
|
||
| **\`\`**[**Ajax isteği manipülasyonu**](dom-xss.md#ajax-isteği-manipülasyonu) | `FileReader.readAsFile()` | `someDOMElement.backgroundImage` | `constructor()` |
|
||
| `XMLHttpRequest.setRequestHeader()` | `FileReader.root.getFile()` | `someDOMElement.cssText` | `init()` |
|
||
| `XMLHttpRequest.open()` | `FileReader.root.getFile()` | `someDOMElement.codebase` | `index()` |
|
||
| `XMLHttpRequest.send()` | [**Bağlantı manipülasyonu**](dom-xss.md#bağlantı-manipülasyonu) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` |
|
||
| `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` |
|
||
| `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**İstemci tarafı JSON enjeksiyonu**](dom-xss.md#istemci-tarafı-sql-enjeksiyonu) |
|
||
| **\`\`**[**HTML5-depolama manipülasyonu**](dom-xss.md#html-5-depolama-manipülasyonu) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` |
|
||
| `sessionStorage.setItem()` | [**XPath enjeksiyonu**](dom-xss.md#xpath-enjeksiyonu) | `document.write()` | `jQuery.parseJSON()` |
|
||
| `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` |
|
||
| **``**[**`Hizmet Reddi`**](dom-xss.md#hizmet-redi)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Çerez manipülasyonu**](dom-xss.md#çerez-manipülasyonu) |
|
||
| `requestFileSystem()` | **\`\`**[**Belge alanı manipülasyonu**](dom-xss.md#belge-alanı-manipülasyonu) | `document.implementation.createHTMLDocument()` | `document.cookie` |
|
||
| `RegExp()` | `document.domain` | `history.pushState()` | [**WebSocket-URL zehirlenmesi**](dom-xss.md#websocket-url-zehirlenmesi) |
|
||
| [**İstemci Tarafı SQL enjeksiyonu**](dom-xss.md#istemci-tarafı-sql-enjeksiyonu) | [**Web mesajı manipülasyonu**](dom-xss.md#web-mesajı-manipülasyonu) | `history.replaceState()` | `WebSocket` |
|
||
| `executeSql()` | `postMessage()` | \`\` | \`\` |
|
||
|
||
**`innerHTML`** sızıntısı, modern tarayıcılarda `script` öğelerini kabul etmez ve `svg onload` etkinlikleri gerçekleştirmez. Bu, `img` veya `iframe` gibi alternatif öğeler kullanmanız gerektiği anlamına gelir.
|
||
|
||
Bu tür bir XSS muhtemelen **bulması en zor olanıdır**, çünkü JS koduna bakmanız, **kontrol ettiğiniz bir değeri** kullanan herhangi bir nesneye bakmanız ve bu durumda keyfi JS kodunu yürütmek için **herhangi bir yolun olup olmadığını** görmek için gereklidir.
|
||
|
||
## Bunları bulmak için araçlar
|
||
|
||
* [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized)
|
||
|
||
## Örnekler
|
||
|
||
### Açık Yönlendirme
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection)
|
||
|
||
**DOM'daki açık yönlendirme zafiyetleri**, bir saldırganın kontrol edebileceği verileri bir başka etki alanına yönlendirebilen bir sızıntıya sahip bir betik veri yazdığında oluşur.
|
||
|
||
Yönlendirmenin gerçekleştiği URL'nin başlangıcını kontrol ediyorsanız, **`javascript:alert(1)`** gibi keyfi kodu yürütmek mümkündür.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
location
|
||
location.host
|
||
location.hostname
|
||
location.href
|
||
location.pathname
|
||
location.search
|
||
location.protocol
|
||
location.assign()
|
||
location.replace()
|
||
open()
|
||
domElem.srcdoc
|
||
XMLHttpRequest.open()
|
||
XMLHttpRequest.send()
|
||
jQuery.ajax()
|
||
$.ajax()
|
||
```
|
||
### Çerez manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation)
|
||
|
||
DOM tabanlı çerez manipülasyonu zafiyetleri, bir betik tarafından kontrol edilebilen verilerin bir çerezin değerine dahil edildiği durumlarda ortaya çıkar. Bu zafiyet, çerezin site içinde kullanılması durumunda web sayfasının beklenmedik davranışlara yol açabilir. Ayrıca, çerez kullanıcı oturumlarını takip etmek için kullanılıyorsa, oturum sabitleme saldırısı gerçekleştirmek için sömürülebilir. Bu zafiyetle ilişkili temel hedef şunlardır:
|
||
|
||
Hedefler:
|
||
```javascript
|
||
document.cookie
|
||
```
|
||
### JavaScript Enjeksiyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection)
|
||
|
||
DOM tabanlı JavaScript enjeksiyonu açıkları, bir saldırgan tarafından kontrol edilebilen verilerin JavaScript kodu olarak çalıştırıldığı durumlarda oluşur.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
eval()
|
||
Function() constructor
|
||
setTimeout()
|
||
setInterval()
|
||
setImmediate()
|
||
execCommand()
|
||
execScript()
|
||
msSetImmediate()
|
||
range.createContextualFragment()
|
||
crypto.generateCRMFRequest()
|
||
```
|
||
### Document-domain manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation)
|
||
|
||
**Document-domain manipülasyonu açıkları**, bir saldırganın kontrol edebileceği verileri kullanarak bir betik tarafından `document.domain` özelliğinin ayarlandığı durumlarda ortaya çıkar.
|
||
|
||
`document.domain` özelliği, tarayıcılar tarafından **aynı köken politikasının** uygulanmasında **önemli bir rol** oynar. Farklı kökenlere ait iki sayfa, `document.domain` değerlerini **aynı değere** ayarladıklarında kısıtlamalar olmaksızın etkileşimde bulunabilirler. Tarayıcılar, `document.domain`'e atanan değerlere belirli **sınırlamalar** getirirken, tamamen ilgisiz değerlerin gerçek sayfa kökenine atanmasını engeller. Genellikle, tarayıcılar **alt** veya **üst etki alanlarının** kullanılmasına izin verir.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
document.domain
|
||
```
|
||
### WebSocket-URL zehirlenmesi
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning)
|
||
|
||
**WebSocket-URL zehirlenmesi**, bir betik tarafından bir WebSocket bağlantısı için **kontrol edilebilir verilerin hedef URL olarak kullanılması** durumunda meydana gelir.
|
||
|
||
Sızıntılar:
|
||
|
||
`WebSocket` yapıcısı, WebSocket-URL zehirlenmesi açıklarına yol açabilir.
|
||
|
||
### Bağlantı manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation)
|
||
|
||
**DOM tabanlı bağlantı manipülasyonu açıkları**, bir betiğin mevcut sayfa içindeki bir gezinme hedefine **saldırgan tarafından kontrol edilebilir verileri yazması** durumunda ortaya çıkar, örneğin tıklanabilir bir bağlantı veya bir formun gönderim URL'si.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
someDOMElement.href
|
||
someDOMElement.src
|
||
someDOMElement.action
|
||
```
|
||
### Ajax isteği manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
|
||
|
||
**Ajax isteği manipülasyonu açıkları**, bir betik tarafından kullanılan bir `XmlHttpRequest` nesnesi kullanılarak gönderilen bir Ajax isteğine **saldırgan tarafından kontrol edilebilen verilerin yazılması** durumunda ortaya çıkar.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
XMLHttpRequest.setRequestHeader()
|
||
XMLHttpRequest.open()
|
||
XMLHttpRequest.send()
|
||
jQuery.globalEval()
|
||
$.globalEval()
|
||
```
|
||
### Yerel dosya yolu manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation)
|
||
|
||
**Yerel dosya yolu manipülasyonu açıklıkları**, bir betik **saldırgan tarafından kontrol edilebilir verileri** `filename` parametresi olarak bir dosya işleme API'sine ilettiğinde ortaya çıkar. Bu açıklık, bir saldırganın, başka bir kullanıcı tarafından ziyaret edilirse, **kullanıcının tarayıcısının keyfi bir yerel dosya açmasına veya yazmasına yol açabilecek bir URL oluşturmasını** sağlar.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
FileReader.readAsArrayBuffer()
|
||
FileReader.readAsBinaryString()
|
||
FileReader.readAsDataURL()
|
||
FileReader.readAsText()
|
||
FileReader.readAsFile()
|
||
FileReader.root.getFile()
|
||
FileReader.root.getFile()
|
||
```
|
||
### İstemci Tarafı SQL enjeksiyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection)
|
||
|
||
**İstemci tarafı SQL enjeksiyonu açıkları**, bir betik tarafından **saldırgan tarafından kontrol edilebilen verilerin güvensiz bir şekilde bir istemci tarafı SQL sorgusuna dahil edilmesi** durumunda ortaya çıkar.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
executeSql()
|
||
```
|
||
### HTML5-depolama manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation)
|
||
|
||
**HTML5-depolama manipülasyonu açıkları**, bir betik **saldırgan tarafından kontrol edilebilen verileri web tarayıcısının HTML5 depolama alanına** (`localStorage` veya `sessionStorage`) kaydettiğinde ortaya çıkar. Bu eylem başlangıçta bir güvenlik açığı olmasa da, uygulama daha sonra **kaydedilen verileri okuyup güvensiz bir şekilde işlerse** sorunlu hale gelir. Bu, saldırganın depolama mekanizmasını kullanarak diğer DOM tabanlı saldırıları, örneğin cross-site scripting ve JavaScript enjeksiyonu gibi saldırıları gerçekleştirmesine olanak tanıyabilir.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
sessionStorage.setItem()
|
||
localStorage.setItem()
|
||
```
|
||
### XPath enjeksiyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection)
|
||
|
||
**DOM tabanlı XPath enjeksiyonu açıkları**, bir betik tarafından **saldırgan tarafından kontrol edilebilen verilerin bir XPath sorgusuna dahil edilmesi** durumunda ortaya çıkar.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
document.evaluate()
|
||
someDOMElement.evaluate()
|
||
```
|
||
### İstemci tarafı JSON enjeksiyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection)
|
||
|
||
**DOM tabanlı JSON enjeksiyonu açıkları**, bir betik tarafından **saldırgan tarafından kontrol edilebilen verilerin, bir JSON veri yapısı olarak ayrıştırılan ve ardından uygulama tarafından işlenen bir dizeye dahil edilmesi durumunda ortaya çıkar**.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
JSON.parse()
|
||
jQuery.parseJSON()
|
||
$.parseJSON()
|
||
```
|
||
### Web mesajı manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation)
|
||
|
||
**Web mesajı açıklıkları**, bir betik tarafından kontrol edilebilen verilerin tarayıcı içindeki başka bir belgeye web mesajı olarak gönderildiğinde ortaya çıkar. Savunmasız Web mesajı manipülasyonunun bir örneği, [PortSwigger'ın Web Güvenlik Akademisi](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source) adresinde bulunabilir.
|
||
|
||
Alıcılar:
|
||
|
||
Web mesajlarını göndermek için `postMessage()` yöntemi, gelen verileri güvenli olmayan bir şekilde işleyen olay dinleyicisi varsa açıklıklara yol açabilir.
|
||
|
||
### DOM veri manipülasyonu
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation)
|
||
|
||
**DOM veri manipülasyonu açıklıkları**, bir betiğin, görünür kullanıcı arayüzünde veya istemci tarafı mantığında kullanılan DOM içindeki bir alana **saldırgan tarafından kontrol edilebilen verileri yazması** durumunda ortaya çıkar. Bu açıklık, bir saldırganın, başka bir kullanıcı tarafından ziyaret edilirse, istemci tarafı kullanıcı arayüzünün görünümünü veya davranışını değiştirebileceği bir URL oluşturmak için kullanılabilir.
|
||
|
||
Alıcılar:
|
||
```javascript
|
||
scriptElement.src
|
||
scriptElement.text
|
||
scriptElement.textContent
|
||
scriptElement.innerText
|
||
someDOMElement.setAttribute()
|
||
someDOMElement.search
|
||
someDOMElement.text
|
||
someDOMElement.textContent
|
||
someDOMElement.innerText
|
||
someDOMElement.outerText
|
||
someDOMElement.value
|
||
someDOMElement.name
|
||
someDOMElement.target
|
||
someDOMElement.method
|
||
someDOMElement.type
|
||
someDOMElement.backgroundImage
|
||
someDOMElement.cssText
|
||
someDOMElement.codebase
|
||
document.title
|
||
document.implementation.createHTMLDocument()
|
||
history.pushState()
|
||
history.replaceState()
|
||
```
|
||
### Hizmet Reddi
|
||
|
||
Kaynak: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service)
|
||
|
||
**DOM tabanlı hizmet reddi açıkları**, bir betiğin **saldırgan tarafından kontrol edilebilen verileri güvensiz bir şekilde sorunlu bir platform API'sine ilettiğinde** meydana gelir. Bu, kullanıcının bilgisayarının **aşırı miktarda CPU veya disk alanı tüketmesine neden olabilen** API'leri içerir. Bu tür açıkların önemli yan etkileri olabilir, örneğin tarayıcı, `localStorage`'da veri depolama girişimlerini reddederek veya meşgul betikleri sonlandırarak web sitesinin işlevselliğini kısıtlayabilir.
|
||
|
||
Sızıntılar:
|
||
```javascript
|
||
requestFileSystem()
|
||
RegExp()
|
||
```
|
||
## Dom Clobbering
|
||
|
||
{% content-ref url="dom-clobbering.md" %}
|
||
[dom-clobbering.md](dom-clobbering.md)
|
||
{% endcontent-ref %}
|
||
|
||
<details>
|
||
|
||
<summary><strong>AWS hacklemeyi sıfırdan kahramanla öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
|
||
|
||
* Bir **cybersecurity şirketinde** çalışıyor musunuz? **Şirketinizi HackTricks'te reklamını görmek** 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), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin.
|
||
* [**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 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) **ile göndererek paylaşın.**
|
||
|
||
</details>
|