mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p
This commit is contained in:
parent
3f62db180b
commit
bfeb0c5f33
@ -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ść <a href="#id-5530" id="id-5530"></a>
|
||||
```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);
|
||||
</script>
|
||||
```
|
||||
## 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
|
||||
<script>
|
||||
// Source (e.g. https://victim/?__proto__[href]=javascript:alert(document.domain))
|
||||
// For demo we just pollute manually:
|
||||
Object.prototype.href = 'javascript:alert(`polluted`)' ;
|
||||
|
||||
// Sink – URL() constructor implicitly reads `href`
|
||||
new URL('#'); // breaks into JS; in Chrome you get an alert, Firefox loads "javascript:" URL
|
||||
</script>
|
||||
```
|
||||
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":"<img/src/onerror=alert(1)>"}}`, 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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user