From bfeb0c5f333c3cdf0dfaf0028f6e2e5f79fca15a Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 4 Aug 2025 16:14:31 +0000 Subject: [PATCH] Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p --- .../client-side-prototype-pollution.md | 81 +++++++++++++++++-- 1 file changed, 73 insertions(+), 8 deletions(-) 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 55678a073..e15e553b1 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 @@ -4,9 +4,9 @@ ## Odkrywanie za pomocą narzędzi automatycznych -Narzędzia [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **i** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) mogą być używane do **znajdowania podatności na zanieczyszczenie prototypu**. +Narzędzia [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **i** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) mogą być używane do **znajdowania luk w zanieczyszczeniu prototypu**. -Ponadto, możesz również użyć **rozszerzenia przeglądarki** [**PPScan**](https://github.com/msrkp/PPScan) do **automatycznego** **skanowania** **stron**, które **odwiedzasz** w poszukiwaniu podatności na zanieczyszczenie prototypu. +Ponadto, możesz również użyć **rozszerzenia przeglądarki** [**PPScan**](https://github.com/msrkp/PPScan) do **automatycznego** **skanowania** **stron**, które **odwiedzasz** w poszukiwaniu luk w zanieczyszczeniu prototypu. ### Debugowanie, gdzie używana jest właściwość ```javascript @@ -27,7 +27,7 @@ Dla większych i bardziej złożonych baz kodu, prostą metodą na odkrycie wra 1. Użyj narzędzia do zidentyfikowania luki i uzyskaj ładunek zaprojektowany do ustawienia właściwości w konstruktorze. Przykład podany przez ppmap może wyglądać następująco: `constructor[prototype][ppmap]=reserved`. 2. Ustaw punkt przerwania na pierwszej linii kodu JavaScript, która zostanie wykonana na stronie. Odśwież stronę z ładunkiem, wstrzymując wykonanie w tym punkcie przerwania. -3. Gdy wykonanie JavaScript jest wstrzymane, uruchom następujący skrypt w konsoli JS. Ten skrypt zasygnalizuje, kiedy właściwość 'ppmap' zostanie utworzona, co pomoże w zlokalizowaniu jej pochodzenia: +3. Gdy wykonanie JavaScript jest wstrzymane, wykonaj następujący skrypt w konsoli JS. Ten skrypt zasygnalizuje, kiedy właściwość 'ppmap' zostanie utworzona, co pomoże w zlokalizowaniu jej pochodzenia: ```javascript function debugAccess(obj, prop, debugGet = true) { var origValue = obj[prop] @@ -46,7 +46,7 @@ origValue = val debugAccess(Object.prototype, "ppmap") ``` -4. Wróć do zakładki **Sources** i wybierz „Wznów wykonywanie skryptu”. JavaScript będzie kontynuował wykonywanie, a właściwość 'ppmap' zostanie zanieczyszczona zgodnie z oczekiwaniami. Wykorzystanie dostarczonego fragmentu kodu ułatwia identyfikację dokładnej lokalizacji, w której właściwość 'ppmap' jest zanieczyszczona. Analizując **Call Stack**, można zaobserwować różne stosy, w których wystąpiło zanieczyszczenie. +4. Wróć do zakładki **Sources** i wybierz „Wznów wykonywanie skryptu”. JavaScript będzie kontynuował wykonywanie, a właściwość 'ppmap' zostanie zanieczyszczona zgodnie z oczekiwaniami. Wykorzystanie podanego fragmentu ułatwia identyfikację dokładnej lokalizacji, w której właściwość 'ppmap' jest zanieczyszczona. Analizując **Call Stack**, można zaobserwować różne stosy, w których wystąpiło zanieczyszczenie. Decydując, który stos zbadać, często warto skupić się na stosach związanych z plikami bibliotek JavaScript, ponieważ zanieczyszczenie prototypu często występuje w tych bibliotekach. Zidentyfikuj odpowiedni stos, sprawdzając jego powiązanie z plikami bibliotek (widoczne po prawej stronie, podobnie jak na dostarczonym obrazie). W scenariuszach z wieloma stosami, takimi jak te w liniach 4 i 6, logicznym wyborem jest stos w linii 4, ponieważ reprezentuje on początkowe wystąpienie zanieczyszczenia, a tym samym pierwotną przyczynę podatności. Kliknięcie na stos przeniesie cię do podatnego kodu. @@ -54,7 +54,7 @@ Decydując, który stos zbadać, często warto skupić się na stosach związany ## Znajdowanie gadżetów skryptowych -Gadżet to **kod, który będzie nadużywany po odkryciu podatności PP**. +Gadżet to **kod, który będzie wykorzystywany, gdy zostanie odkryta podatność PP**. Jeśli aplikacja jest prosta, możemy **szukać** **słów kluczowych** takich jak **`srcdoc/innerHTML/iframe/createElement`** i przeglądać kod źródłowy, aby sprawdzić, czy **prowadzi do wykonania javascriptu**. Czasami wspomniane techniki mogą w ogóle nie znaleźć gadżetów. W takim przypadku czysta analiza kodu źródłowego ujawnia kilka ciekawych gadżetów, jak w poniższym przykładzie. @@ -67,9 +67,9 @@ Sprawdź ten artykuł: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-cha - [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) -## Obejście sanitarnych filtrów HTML za pomocą PP +## Ominięcie sanitariuszy HTML za pomocą PP -[**To badanie**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) pokazuje gadżety PP do **obejścia sanitacji** zapewnianych przez niektóre biblioteki filtrów HTML: +[**To badanie**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) pokazuje gadżety PP do **ominięcia sanitizacji** zapewnianych przez niektóre biblioteki sanitariuszy HTML: - **sanitize-html** @@ -101,7 +101,72 @@ const node = goog.dom.safeHtmlToNode(sanitized); document.body.append(node); ``` -## Odniesienia +## Nowe narzędzia i automatyzacja (2023–2025) + +* **Burp Suite DOM Invader (v2023.6)** – PortSwigger dodał dedykowaną zakładkę *Prototype-pollution*, która automatycznie mutuje nazwy parametrów (np. `__proto__`, `constructor.prototype`) i wykrywa zanieczyszczone właściwości w punktach zrzutu wewnątrz rozszerzenia przeglądarki. Gdy gadżet jest wyzwolony, DOM Invader pokazuje stos wykonania i dokładną linię, w której właściwość została zdereferencjonowana, co czyni ręczne poszukiwanie punktów przerwania niepotrzebnym. Połącz to z fragmentem "Break on property access" pokazanym powyżej, aby szybko przejść z *source → sink*. +* **protoStalker** – wtyczka do Chrome DevTools typu open-source (wydana w 2024), która wizualizuje łańcuchy prototypów w czasie rzeczywistym i oznacza zapisy do globalnie niebezpiecznych kluczy, takich jak `onerror`, `innerHTML`, `srcdoc`, `id` itp. Przydatne, gdy masz tylko pakiet produkcyjny i nie możesz zainstrumentować kroku budowania. +* **ppfuzz 2.0 (2025)** – narzędzie teraz obsługuje moduły ES, HTTP/2 i punkty końcowe WebSocket. Nowy tryb `-A browser` uruchamia bezgłowy egzemplarz Chromium i automatycznie enumeruje klasy gadżetów, brutalnie forsując API DOM (zobacz sekcję poniżej). + +--- + +## Ostatnie badania nad gadżetami Prototype-Pollution (2022–2025) + +W połowie 2023 roku badacze PortSwigger opublikowali artykuł pokazujący, że obiekty *wbudowane w przeglądarkę* mogą zostać przekształcone w niezawodne gadżety XSS po zanieczyszczeniu. Ponieważ te obiekty są obecne na **każdej** stronie, możesz uzyskać wykonanie, nawet jeśli kod aplikacji docelowej nigdy nie dotyka zanieczyszczonej właściwości. + +Przykład gadżetu (działa we wszystkich przeglądarkach evergreen ≥ 2023-04): +```html + +``` +Inne przydatne globalne gadżety, które potwierdzono jako działające po zanieczyszczeniu (testowane 2024-11): + +| Klasa gadżetu | Właściwość do odczytu | Osiągnięty prymityw | +|---------------|-----------------------|---------------------| +| `Notification` | `title` | `alert()` poprzez kliknięcie powiadomienia | +| `Worker` | `name` | Wykonanie JS w dedykowanym Workerze | +| `Image` | `src` | Tradycyjne XSS `onerror` | +| `URLSearchParams` | `toString` | Otwarty przekierowanie oparte na DOM | + +Zobacz dokument PortSwigger, aby uzyskać pełną listę 11 gadżetów i dyskusję na temat ucieczek z piaskownicy. + +--- + +## Znaczące CVE PP po stronie klienta (2023-2025) + +* **DOMPurify ≤ 3.0.8 – CVE-2024-45801** Atakujący mógł zanieczyścić `Node.prototype.after` przed zainicjowaniem sanitizera, omijając profil *SAFE_FOR_TEMPLATES* i prowadząc do przechowywanego XSS. Dostawca załatał to, używając sprawdzeń `Object.hasOwn()` i `Object.create(null)` dla map wewnętrznych. +* **jQuery 3.6.0-3.6.3 – CVE-2023-26136 / CVE-2023-26140** `extend()` mogło być użyte na stworzonych obiektach pochodzących z `location.hash`, wprowadzając dowolne właściwości do `Object.prototype` w kontekście przeglądarki. +* **sanitize-html < 2.8.1 (2023-10) zanieczyszczenie prototypu** Złośliwa lista atrybutów, taka jak `{"__proto__":{"innerHTML":""}}`, ominęła listę dozwoloną. + +Nawet jeśli podatna biblioteka działa **tylko po stronie klienta**, wynikowe XSS jest nadal wykorzystywalne zdalnie poprzez odzwierciedlone parametry, obsługiwacze postMessage lub przechowywane dane renderowane później. + +--- + +## Nowoczesne środki obronne + +1. **Zamroź globalny prototyp wcześnie** (najlepiej jako pierwszy skrypt): +```javascript +Object.freeze(Object.prototype); +Object.freeze(Array.prototype); +Object.freeze(Map.prototype); +``` +Bądź świadomy, że może to zepsuć polyfille, które polegają na późnym rozszerzeniu. +2. Użyj `structuredClone()` zamiast `JSON.parse(JSON.stringify(obj))` lub fragmentów "deepMerge" z społeczności – ignoruje to settery/gettery i nie przechodzi przez łańcuch prototypów. +3. Kiedy naprawdę potrzebujesz funkcjonalności głębokiego łączenia, wybierz **lodash ≥ 4.17.22** lub **deepmerge ≥ 5.3.0**, które mają wbudowaną sanitację prototypu. +4. Dodaj politykę bezpieczeństwa treści z `script-src 'self'` i surowym nonce. Chociaż CSP nie zatrzyma wszystkich gadżetów (np. manipulacja `location`), blokuje większość zlewów `innerHTML`. + +## Odnośniki + +- [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)