diff --git a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md index 6262ee5fe..3c8a36e77 100644 --- a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md +++ b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md @@ -1,14 +1,14 @@ -# İstemci Tarafı Prototip Kirlenmesi +# Client Side Prototype Pollution {{#include ../../../banners/hacktricks-training.md}} ## Otomatik Araçlar Kullanarak Keşfetme -Araçlar [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **ve** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) **prototip kirlenmesi zafiyetlerini** **bulmak için** kullanılabilir. +Araçlar [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **ve** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) **prototip kirlenmesi zafiyetlerini bulmak için** kullanılabilir. -Ayrıca, **prototip kirlenmesi zafiyetleri** için **eriştiğiniz** **sayfaları** **otomatik olarak** **taramak** amacıyla **PPScan** [**tarayıcı uzantısını**](https://github.com/msrkp/PPScan) da kullanabilirsiniz. +Ayrıca, **prototip kirlenmesi zafiyetleri** için eriştiğiniz **sayfaları** **otomatik olarak** **taramak** amacıyla **PPScan** adlı **tarayıcı uzantısını** da kullanabilirsiniz. -### Bir özelliğin nerede kullanıldığını hata ayıklama +### Bir Özelliğin Kullanıldığı Yeri Hata Ayıklama ```javascript // Stop debugger where 'potentialGadget' property is accessed Object.defineProperty(Object.prototype, "potentialGadget", { @@ -21,12 +21,12 @@ return "test" ``` ### Prototype Pollution'ın Temel Sebebini Bulma -Bir prototype pollution zafiyeti herhangi bir araç tarafından belirlendikten sonra ve eğer kod aşırı karmaşık değilse, Chrome Geliştirici Araçları'nda `location.hash`, `decodeURIComponent` veya `location.search` gibi anahtar kelimeleri arayarak zafiyeti bulabilirsiniz. Bu yaklaşım, JavaScript kodunun zayıf noktasını belirlemenizi sağlar. +Bir prototype pollution zafiyeti herhangi bir araç tarafından belirlendiğinde ve eğer kod aşırı karmaşık değilse, Chrome Geliştirici Araçları'nda `location.hash`, `decodeURIComponent` veya `location.search` gibi anahtar kelimeleri arayarak zafiyeti bulabilirsiniz. Bu yaklaşım, JavaScript kodunun zayıf noktasını belirlemenizi sağlar. Daha büyük ve karmaşık kod tabanları için, zayıf kodu keşfetmenin basit bir yöntemi aşağıdaki adımları içerir: -1. Bir aracı kullanarak bir zafiyeti belirleyin ve bir özelliği yapıcıda ayarlamak için tasarlanmış bir yük elde edin. ppmap tarafından sağlanan bir örnek şöyle görünebilir: `constructor[prototype][ppmap]=reserved`. -2. Sayfada çalışacak ilk JavaScript kodunun satırında bir kesme noktası ayarlayın. Yük ile sayfayı yenileyin ve bu kesme noktasında yürütmeyi durdurun. +1. Bir aracı kullanarak bir zafiyeti belirleyin ve bir özelliği kurucuda ayarlamak için tasarlanmış bir yük elde edin. ppmap tarafından sağlanan bir örnek şöyle görünebilir: `constructor[prototype][ppmap]=reserved`. +2. Sayfada çalışacak ilk JavaScript kodunun satırında bir kesme noktası ayarlayın. Sayfayı yük ile yenileyin ve bu kesme noktasında yürütmeyi durdurun. 3. JavaScript yürütmesi duraklatıldığında, JS konsolunda aşağıdaki betiği çalıştırın. Bu betik, 'ppmap' özelliği oluşturulduğunda sinyal verecek ve kökenini bulmanıza yardımcı olacaktır: ```javascript function debugAccess(obj, prop, debugGet = true) { @@ -48,7 +48,7 @@ debugAccess(Object.prototype, "ppmap") ``` 4. **Sources** sekmesine geri dönün ve “Script yürütmesini devam ettir” seçeneğini seçin. JavaScript çalışmaya devam edecek ve 'ppmap' özelliği beklendiği gibi kirletilecektir. Sağlanan kod parçasını kullanarak 'ppmap' özelliğinin kirletildiği tam yeri belirlemek kolaylaşır. **Call Stack**'i inceleyerek, kirlenmenin gerçekleştiği farklı yığınlar gözlemlenebilir. -Hangi yığını inceleyeceğinize karar verirken, genellikle JavaScript kütüphane dosyalarıyla ilişkili yığınları hedeflemek faydalıdır, çünkü prototip kirlenmesi genellikle bu kütüphaneler içinde meydana gelir. İlgili yığını, kütüphane dosyalarına olan bağlantısını inceleyerek belirleyin (sağ tarafta, rehberlik için sağlanan bir resme benzer şekilde görünür). Birden fazla yığın olan senaryolarda, örneğin 4. ve 6. satırlarda, mantıklı seçim 4. satırdaki yüktür, çünkü bu, kirlenmenin ilk gerçekleştiği yerdir ve dolayısıyla zafiyetin kök nedenini temsil eder. Yığına tıklamak sizi savunmasız koda yönlendirecektir. +Hangi yığını inceleyeceğinize karar verirken, genellikle JavaScript kütüphane dosyalarıyla ilişkili yığınları hedeflemek faydalıdır, çünkü prototip kirlenmesi genellikle bu kütüphaneler içinde meydana gelir. İlgili yığını, kütüphane dosyalarına olan bağlantısını inceleyerek belirleyin (sağ tarafta, rehberlik için sağlanan bir resme benzer şekilde görünür). Birden fazla yığın olan senaryolarda, örneğin 4 ve 6. satırlarda, mantıklı seçim 4. satırdaki yığındır, çünkü bu kirlenmenin ilk gerçekleştiği yerdir ve dolayısıyla zafiyetin kök nedenini temsil eder. Yığına tıklamak, sizi zayıf koda yönlendirecektir. ![https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg](https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg) @@ -56,20 +56,20 @@ Hangi yığını inceleyeceğinize karar verirken, genellikle JavaScript kütüp Gadget, **bir PP zafiyeti keşfedildiğinde kötüye kullanılacak koddur**. -Uygulama basitse, **`srcdoc/innerHTML/iframe/createElement`** gibi **anahtar kelimeleri** **arama** yapabiliriz ve kaynak kodunu gözden geçirip bunun **javascript yürütmesine yol açıp açmadığını** kontrol edebiliriz. Bazen, bahsedilen teknikler hiç gadget bulamayabilir. Bu durumda, saf kaynak kodu incelemesi aşağıdaki örnekte olduğu gibi bazı güzel gadget'ları ortaya çıkarır. +Uygulama basitse, **`srcdoc/innerHTML/iframe/createElement`** gibi **anahtar kelimeleri** **arama** yapabiliriz ve kaynak kodunu gözden geçirip bunun **javascript yürütmesine yol açıp açmadığını** kontrol edebiliriz. Bazen, bahsedilen teknikler hiç gadget bulamayabilir. Bu durumda, saf kaynak kodu incelemesi bazı güzel gadget'lar ortaya çıkarabilir, aşağıdaki örnekte olduğu gibi. ### Mithil kütüphane kodunda PP gadget bulma örneği Bu yazıyı kontrol edin: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/) -## Savunmasız kütüphaneler için yüklerin yeniden derlenmesi +## Zayıf kütüphaneler için yüklerin yeniden derlenmesi - [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution) - [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution) -## HTML Sanitizer'ları PP ile atlatma +## PP aracılığıyla HTML Sanitizer'ları atlatma -[**Bu araştırma**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) bazı HTML sanitizer kütüphaneleri tarafından sağlanan **sanitizasyonları atlatmak için kullanılacak PP gadget'larını** göstermektedir: +[**Bu araştırma**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) bazı HTML sanitizasyon kütüphaneleri tarafından sağlanan **sanitizasyonları atlatmak için kullanılacak PP gadget'larını** göstermektedir: - **sanitize-html** @@ -101,8 +101,73 @@ const node = goog.dom.safeHtmlToNode(sanitized); document.body.append(node); ``` +## Yeni Araçlar & Otomasyon (2023–2025) + +* **Burp Suite DOM Invader (v2023.6)** – PortSwigger, parametre adlarını otomatik olarak değiştiren ve tarayıcı uzantısındaki sink noktalarında kirlenmiş özellikleri tespit eden özel bir *Prototype-pollution* sekmesi ekledi (örneğin `__proto__`, `constructor.prototype`). Bir gadget tetiklendiğinde, DOM Invader yürütme yığınını ve özelliğin dereferans edildiği tam satırı gösterir, bu da manuel breakpoint avlamayı gereksiz kılar. *source → sink* arasında hızlı bir geçiş yapmak için yukarıda gösterilen "Property access üzerinde dur" snippet'ı ile birleştirin. +* **protoStalker** – prototip zincirlerini gerçek zamanlı olarak görselleştiren ve `onerror`, `innerHTML`, `srcdoc`, `id` gibi küresel tehlikeli anahtarlara yazmaları işaret eden açık kaynaklı bir Chrome DevTools eklentisi (2024'te yayımlandı). Sadece bir üretim paketi olduğunda ve derleme adımını enstrümante edemediğinizde faydalıdır. +* **ppfuzz 2.0 (2025)** – araç artık ES-modüllerini, HTTP/2 ve WebSocket uç noktalarını destekliyor. Yeni `-A browser` modu, başsız bir Chromium örneği başlatır ve DOM API'lerini brute force ile zorlayarak gadget sınıflarını otomatik olarak numaralandırır (aşağıdaki bölüme bakın). + +--- + +## Son Prototype-Pollution Gadget Araştırmaları (2022–2025) + +2023 ortalarında PortSwigger araştırmacıları, *tarayıcıda yerleşik* nesnelerin kirletildiğinde güvenilir XSS gadget'larına dönüştürülebileceğini gösteren bir makale yayımladı. Bu nesneler **her** sayfada bulunduğundan, hedef uygulama kodu kirlenmiş özelliği hiç kullanmasa bile yürütme elde edebilirsiniz. + +Örnek gadget (tüm evergreen tarayıcılarda ≥ 2023-04 çalışır): +```html + +``` +Diğer yararlı global gadget'lar, kirlilikten sonra çalıştığı onaylanmıştır (test tarihi 2024-11): + +| Gadget sınıfı | Okunan özellik | Elde edilen primitive | +|---------------|----------------|-----------------------| +| `Notification` | `title` | `alert()` bildirim tıklaması ile | +| `Worker` | `name` | Özel Worker'da JS yürütme | +| `Image` | `src` | Geleneksel `onerror` XSS | +| `URLSearchParams` | `toString` | DOM tabanlı Açık Yönlendirme | + +Tam 11 gadget listesi ve sandbox kaçışları hakkında tartışma için PortSwigger makalesine bakın. + +--- + +## Dikkate Değer İstemci Tarafı PP CVE'leri (2023-2025) + +* **DOMPurify ≤ 3.0.8 – CVE-2024-45801** Bir saldırgan, temizleyici başlatılmadan önce `Node.prototype.after`'ı kirletebilir, *SAFE_FOR_TEMPLATES* profilini atlayarak saklanan XSS'ye yol açar. Satıcı, `Object.hasOwn()` kontrolleri ve iç haritalar için `Object.create(null)` kullanarak yamanmıştır. +* **jQuery 3.6.0-3.6.3 – CVE-2023-26136 / CVE-2023-26140** `extend()` `location.hash`'dan gelen işlenmiş nesnelerde kullanılabilir, tarayıcı bağlamında `Object.prototype`'a keyfi özellikler ekler. +* **sanitize-html < 2.8.1 (2023-10) prototype pollution** `{"__proto__":{"innerHTML":""}}` gibi kötü niyetli bir özellik listesi, izin listesine girmeyi başardı. + +Zayıf kütüphane **sadece istemcide** bulunsa bile, sonuçta oluşan XSS, yansıtılan parametreler, postMessage işleyicileri veya daha sonra işlenen saklanan veriler aracılığıyla uzaktan istismar edilebilir. + +--- + +## Modern Savunma Önlemleri + +1. **Global prototipi erken dondurun** (ideali ilk script olarak): +```javascript +Object.freeze(Object.prototype); +Object.freeze(Array.prototype); +Object.freeze(Map.prototype); +``` +Bu, geç uzantılara dayanan polyfill'leri bozabileceğini unutmayın. +2. `JSON.parse(JSON.stringify(obj))` veya topluluk "deepMerge" parçacıkları yerine `structuredClone()` kullanın – bu, setter'ları/getter'ları göz ardı eder ve prototip zincirini yürütmez. +3. Gerçekten derin bir birleştirme işlevselliğine ihtiyacınız olduğunda, yerleşik prototip sanitasyonu olan **lodash ≥ 4.17.22** veya **deepmerge ≥ 5.3.0**'ı seçin. +4. `script-src 'self'` ve katı bir nonce ile bir Content-Security-Policy ekleyin. CSP, tüm gadget'ları durdurmasa da (örneğin `location` manipülasyonu), `innerHTML` sink'lerinin çoğunu engeller. + ## Referanslar +- [https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746](https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746) +- [https://blog.s1r1us.ninja/research/PP](https://blog.s1r1us.ninja/research/PP) +- [https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:\~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) +- [https://portswigger.net/research/widespread-prototype-pollution-gadgets](https://portswigger.net/research/widespread-prototype-pollution-gadgets) +- [https://snyk.io/blog/dompurify-prototype-pollution-bypass-cve-2024-45801/](https://snyk.io/blog/dompurify-prototype-pollution-bypass-cve-2024-45801/) + - [https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746](https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746) - [https://blog.s1r1us.ninja/research/PP](https://blog.s1r1us.ninja/research/PP) - [https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:\~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/)