Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p

This commit is contained in:
Translator 2025-08-19 22:05:02 +00:00
parent 14059262d4
commit 01df7d32b6

View File

@ -1,10 +1,10 @@
# NodeJS - \_\_proto\_\_ i zanieczyszczenie prototypu
# NodeJS - \_\_proto\_\_ & zanieczyszczenie prototypu
{{#include ../../../banners/hacktricks-training.md}}
## Obiekty w JavaScript <a href="#id-053a" id="id-053a"></a>
Obiekty w JavaScript to w zasadzie zbiory par klucz-wartość, znane jako właściwości. Obiekt można utworzyć za pomocą `Object.create` z `null` jako argumentem, aby uzyskać pusty obiekt. Ta metoda pozwala na tworzenie obiektu bez dziedziczonych właściwości.
Obiekty w JavaScript są zasadniczo kolekcjami par klucz-wartość, znanymi jako właściwości. Obiekt można utworzyć za pomocą `Object.create` z `null` jako argumentem, aby uzyskać pusty obiekt. Ta metoda pozwala na tworzenie 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.
@ -33,7 +33,7 @@ employee1.__proto__
```
### Prototypy w JavaScript
JavaScript pozwala na modyfikację, dodawanie lub usuwanie atrybutów prototypu w czasie rzeczywistym. Ta elastyczność umożliwia dynamiczne rozszerzanie funkcjonalności klas.
JavaScript pozwala na modyfikację, dodawanie lub usuwanie atrybutów prototypu w czasie wykonywania. Ta elastyczność umożliwia dynamiczne rozszerzanie funkcjonalności klas.
Funkcje takie jak `toString` i `valueOf` mogą być zmieniane, aby zmienić ich zachowanie, co pokazuje elastyczny charakter systemu prototypów JavaScript.
@ -49,7 +49,7 @@ Należy zauważyć, że gdy właściwość jest dodawana do obiektu pełniącego
Obiekty JavaScript są definiowane przez pary klucz-wartość i dziedziczą z prototypu obiektu JavaScript. Oznacza to, że modyfikacja prototypu obiektu może wpływać na wszystkie obiekty w środowisku.
Użyjmy innego przykładu, aby to zobrazować:
Użyjmy innego przykładu, aby to zilustrować:
```javascript
function Vehicle(model) {
this.model = model
@ -156,7 +156,7 @@ c[1] // 2 -- not
```
### Zanieczyszczenie elementów Html
Podczas generowania elementu HTML za pomocą JS możliwe jest **nadpisanie** atrybutu **`innerHTML`**, aby umożliwić zapis **dowolnego kodu HTML.** [Pomysł i przykład z tego opracowania](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
Kiedy generujesz element HTML za pomocą JS, możliwe jest **nadpisanie** atrybutu **`innerHTML`**, aby umożliwić zapis **dowolnego kodu HTML.** [Pomysł i przykład z tego opracowania](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
```javascript
// Create element
devSettings["root"] = document.createElement('main')
@ -173,7 +173,7 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
Zanieczyszczenie prototypu występuje z powodu błędu w aplikacji, który pozwala na nadpisywanie właściwości w `Object.prototype`. Oznacza to, że ponieważ większość obiektów dziedziczy swoje właściwości z `Object.prototype`
Najłatwiejszym przykładem jest dodanie wartości do **niezdefiniowanego atrybutu obiektu**, który ma być sprawdzany, jak:
Najłatwiejszym przykładem jest dodanie wartości do **niezdefiniowanej atrybutu obiektu**, który ma być sprawdzany, jak:
```javascript
if (user.admin) {
```
@ -213,7 +213,7 @@ client-side-prototype-pollution.md
### CVE-201911358: Atak zanieczyszczenia prototypu przez jQuery $ .extend
[For further details check this article](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) W jQuery funkcja `$ .extend` może prowadzić do zanieczyszczenia prototypu, jeśli funkcja głębokiego kopiowania jest wykorzystywana niewłaściwie. Funkcja ta jest powszechnie używana do klonowania obiektów lub łączenia właściwości z obiektu domyślnego. Jednak w przypadku niewłaściwej konfiguracji, właściwości przeznaczone dla nowego obiektu mogą zostać przypisane do prototypu. Na przykład:
[W celu uzyskania dalszych 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 głębokiego kopiowania jest wykorzystywana niewłaściwie. Funkcja ta jest powszechnie używana do klonowania obiektów lub łączenia właściwości z obiektu domyślnego. Jednak w przypadku niewłaściwej konfiguracji, właściwości przeznaczone dla nowego obiektu mogą zostać przypisane do prototypu. Na przykład:
```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
console.log({}.devMode) // Outputs: true
@ -222,20 +222,20 @@ Ta luka, zidentyfikowana jako CVE-201911358, ilustruje, jak głębokie kopiow
### CVE-20183721, CVE-201910744: Atak zanieczyszczenia prototypu przez lodash
[Po więcej szczegółów sprawdź ten artykuł](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[For further details check this article](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[Lodash](https://www.npmjs.com/package/lodash) napotkał podobne luki zanieczyszczenia prototypu (CVE-20183721, CVE-201910744). Problemy te zostały rozwiązane w wersji 4.17.11.
[Lodash](https://www.npmjs.com/package/lodash) napotkał podobne luki w zanieczyszczeniu prototypu (CVE-20183721, CVE-201910744). Problemy te zostały rozwiązane w wersji 4.17.11.
### Inny samouczek z CVE
{{#ref}}
https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2
{{#endref}}
- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](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 analizy luk zanieczyszczenia prototypu po stronie serwera w aplikacjach internetowych. To narzędzie 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ń - szczególnie koncentrując się na bibliotekach Node.js.
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): To rozszerzenie identyfikuje luki zanieczyszczenia prototypu po stronie serwera. Wykorzystuje techniki opisane w [zanieczyszczeniu prototypu po stronie serwera](https://portswigger.net/research/server-side-prototype-pollution).
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Rozszerzenie Burp Suite zaprojektowane do wykrywania i analizy luk w zanieczyszczeniu prototypu po stronie serwera w aplikacjach internetowych. To narzędzie automatyzuje proces skanowania żądań w celu zidentyfikowania potencjalnych problemów z zanieczyszczeniem prototypu. Wykorzystuje znane gadżety - metody wykorzystania zanieczyszczenia prototypu do wykonywania szkodliwych działań - szczególnie koncentrując się na bibliotekach Node.js.
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): To rozszerzenie identyfikuje luki w zanieczyszczeniu prototypu po stronie serwera. Wykorzystuje techniki opisane w [server side prototype pollution](https://portswigger.net/research/server-side-prototype-pollution).
### Zanieczyszczenie prototypu AST w NodeJS
@ -283,9 +283,9 @@ console.log(eval("(" + template + ")")["main"].toString())
```
Ten kod pokazuje, jak atakujący może wstrzyknąć dowolny kod do szablonu Handlebars.
**External Reference**: Zgłoszono problem związany z zanieczyszczeniem prototypu w bibliotece 'flat', jak szczegółowo opisano tutaj: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
**Zewnętrzne odniesienie**: Problem związany z zanieczyszczeniem prototypu został znaleziony w bibliotece 'flat', jak szczegółowo opisano tutaj: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
**External Reference**: [Issue related to prototype pollution in the 'flat' library](https://github.com/hughsk/flat/issues/105)
**Zewnętrzne odniesienie**: [Issue related to prototype pollution in the 'flat' library](https://github.com/hughsk/flat/issues/105)
Przykład wykorzystania zanieczyszczenia prototypu w Pythonie:
```python
@ -313,11 +313,11 @@ requests.post(TARGET_URL + '/vulnerable', json = {
# execute
requests.get(TARGET_URL)
```
#### Luka w Pug
#### Pug Vulnerability
Pug, inny silnik szablonów, stoi przed podobnym ryzykiem zanieczyszczenia prototypu. Szczegółowe informacje są dostępne w dyskusji na temat [AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug).
Przykład zanieczyszczenia prototypu w Pug:
Example of prototype pollution in Pug:
```python
import requests
@ -339,16 +339,16 @@ requests.get(TARGET_URL)
Aby zmniejszyć ryzyko zanieczyszczenia prototypu, można zastosować poniższe strategie:
1. **Niemutowalność obiektów**: `Object.prototype` można uczynić niemutowalnym, stosując `Object.freeze`.
2. **Walidacja wejścia**: Wejścia JSON powinny być rygorystycznie walidowane zgodnie z schematem aplikacji.
2. **Walidacja wejścia**: Wejścia JSON powinny być rygorystycznie walidowane względem schematu 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**: Łatki bezpieczeństwa można wprowadzać poprzez regularne aktualizowanie bibliotek.
7. **Narzędzia lintera i analizy statycznej**: Używaj narzędzi takich jak ESLint z odpowiednimi wtyczkami, aby wykrywać i zapobiegać lukom związanym z zanieczyszczeniem prototypu.
7. **Narzędzia do analizy statycznej i lintery**: Używaj narzędzi takich jak ESLint z odpowiednimi wtyczkami, aby wykrywać i zapobiegać lukom związanym z zanieczyszczeniem prototypu.
8. **Przeglądy kodu**: Wprowadź dokładne przeglądy kodu, aby zidentyfikować i usunąć potencjalne ryzyka związane z zanieczyszczeniem prototypu.
9. **Szkolenie w zakresie bezpieczeństwa**: Edukuj programistów na temat ryzyk związanych z zanieczyszczeniem prototypu i najlepszych praktyk pisania bezpiecznego kodu.
9. **Szkolenie w zakresie bezpieczeństwa**: Edukuj programistów na temat ryzyk związanych z zanieczyszczeniem prototypu oraz najlepszych praktyk pisania bezpiecznego kodu.
10. **Ostrożne korzystanie z bibliotek**: Bądź ostrożny podczas korzystania z bibliotek osób trzecich. Oceń ich bezpieczeństwo i przeglądaj ich kod, szczególnie te, które manipulują obiektami.
11. **Ochrona w czasie wykonywania**: Wprowadź mechanizmy ochrony w czasie wykonywania, takie jak użycie pakietów npm skoncentrowanych na bezpieczeństwie, które mogą wykrywać i zapobiegać atakom zanieczyszczenia prototypu.
11. **Ochrona w czasie wykonywania**: Wprowadź mechanizmy ochrony w czasie wykonywania, takie jak użycie pakietów npm skoncentrowanych na bezpieczeństwie, które mogą wykrywać i zapobiegać atakom związanym z zanieczyszczeniem prototypu.
## Odniesienia