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
14059262d4
commit
01df7d32b6
@ -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-2019–11358: 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-2019–11358, ilustruje, jak głębokie kopiow
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: 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-2018–3721, CVE-2019–10744). 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-2018–3721, CVE-2019–10744). 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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user