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

This commit is contained in:
Translator 2025-08-19 22:04:32 +00:00
parent ad6ace9def
commit a624694de5

View File

@ -1,10 +1,10 @@
# NodeJS - \_\_proto\_\_ i zagađenje prototipa
# NodeJS - \_\_proto\_\_ & prototype Pollution
{{#include ../../../banners/hacktricks-training.md}}
## Objekti u JavaScript-u <a href="#id-053a" id="id-053a"></a>
Objekti u JavaScript-u su suštinski kolekcije parova ključ-vrednost, poznate kao svojstva. Objekat se može kreirati koristeći `Object.create` sa `null` kao argumentom da bi se proizveo prazan objekat. Ova metoda omogućava kreiranje objekta bez nasleđenih svojstava.
Objekti u JavaScript-u su suštinski kolekcije parova ključ-vrednost, poznatih kao svojstva. Objekat se može kreirati koristeći `Object.create` sa `null` kao argumentom da bi se proizveo prazan objekat. Ova metoda omogućava kreiranje objekta bez nasleđenih svojstava.
```javascript
// Run this in the developers tools console
console.log(Object.create(null)) // This will output an empty object.
@ -13,7 +13,7 @@ Prazan objekat je sličan praznom rečniku, predstavljen kao `{}`.
### Funkcije i klase u JavaScript-u
U JavaScript-u, klase i funkcije su usko povezane, pri čemu funkcije često služe kao konstruktori za klase. I pored toga što JavaScript nema podršku za klase, konstruktori mogu emulirati ponašanje klasa.
U JavaScript-u, klase i funkcije su usko povezane, pri čemu funkcije često služe kao konstruktori za klase. I pored nedostatka podrške za klase u JavaScript-u, konstruktori mogu emulirati ponašanje klasa.
```javascript
// Run this in the developers tools console
@ -41,7 +41,7 @@ Funkcije kao što su `toString` i `valueOf` mogu se menjati kako bi se promenilo
U programiranju zasnovanom na prototipovima, svojstva/metode se nasleđuju od objekata iz klasa. Ove klase se kreiraju dodavanjem svojstava/metoda ili instanci druge klase ili praznom objektu.
Treba napomenuti da kada se svojstvo doda objektu koji služi kao prototip za druge objekte (kao što je `myPersonObj`), nasleđujući objekti dobijaju pristup ovom novom svojstvu. Međutim, ovo svojstvo se ne prikazuje automatski osim ako nije eksplicitno pozvano.
Treba napomenuti da kada se svojstvo doda objektu koji služi kao prototip za druge objekte (kao što je `myPersonObj`), nasleđeni objekti dobijaju pristup ovom novom svojstvu. Međutim, ovo svojstvo se ne prikazuje automatski osim ako nije eksplicitno pozvano.
## \_\_proto\_\_ pollution <a href="#id-0d0a" id="id-0d0a"></a>
@ -61,7 +61,7 @@ Pristup Object prototipu je moguć kroz:
car1.__proto__.__proto__
Vehicle.__proto__.__proto__
```
Dodavanjem svojstava prototipu objekta, svaki JavaScript objekat će naslediti ova nova svojstva:
Dodavanjem svojstava u Object prototip, svaki JavaScript objekat će naslediti ova nova svojstva:
```javascript
function Vehicle(model) {
this.model = model
@ -115,13 +115,13 @@ example.constructor.prototype.greet = function () {
console.log("Hello!")
}
```
После ових операција, сваки JavaScript објекат може да изврши `goodbye` и `greet` методе.
Nakon ovih operacija, svaki JavaScript objekat može izvršiti `goodbye` i `greet` metode.
## Контаминирање других објеката
## Zagađivanje drugih objekata
### Из класе у Object.prototype
### Iz klase u Object.prototype
У сценарију где можете **контаминирати одређени објекат** и потребно вам је да **досегнете `Object.prototype`**, можете га потражити са нечим попут следећег кода:
U scenariju gde možete **zagađivati određeni objekat** i potrebno je da **dođete do `Object.prototype`**, možete ga potražiti sa nečim poput sledećeg koda:
```javascript
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
```
### Zagađenje elemenata niza
Imajte na umu da, kao što možete zagađivati atribute objekata u JS-u, ako imate pristup da zagađujete niz, možete takođe **zagađivati vrednosti niza** dostupne **preko indeksa** (imajte na umu da ne možete prepisivati vrednosti, tako da morate zagađivati indekse koji se na neki način koriste, ali se ne pišu).
Napomena: pošto možete zagađivati atribute objekata u JS-u, ako imate pristup da zagađujete niz, možete takođe **zagađivati vrednosti niza** dostupne **preko indeksa** (napomena: ne možete prepisivati vrednosti, tako da treba da zagađujete indekse koji se na neki način koriste, ali ne pišu).
```javascript
c = [1, 2]
a = []
@ -154,9 +154,9 @@ b[0] //undefined
b[1] //"yolo"
c[1] // 2 -- not
```
### Zagađenje HTML elemenata
### Html elements pollution
Kada se generiše HTML element putem JS-a, moguće je **prepisati** **`innerHTML`** atribut kako bi se napisao **arbitrarni HTML kod.** [Ideja i primer iz ovog članka](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
Kada se generiše HTML element putem JS-a, moguće je **prepisati** **`innerHTML`** atribut kako bi se napisao **arbitrarni HTML kod.** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
```javascript
// Create element
devSettings["root"] = document.createElement('main')
@ -228,13 +228,11 @@ Ova ranjivost, identifikovana kao CVE-201911358, ilustruje kako duboka kopija
### Još jedan tutorijal sa CVE-ima
{{#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)
### Alati za otkrivanje zagađenja prototipa
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Ekstenzija za Burp Suite dizajnirana za otkrivanje i analizu ranjivosti zagađenja prototipa na serverskoj strani u web aplikacijama. Ovaj alat automatizuje proces skeniranja zahteva kako bi identifikovao potencijalne probleme zagađenja prototipa. Iskorišćava poznate gadgete - metode korišćenja zagađenja prototipa za izvršavanje štetnih radnji - posebno se fokusirajući na Node.js biblioteke.
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Ekstenzija za Burp Suite dizajnirana za otkrivanje i analizu ranjivosti zagađenja prototipa na serverskoj strani u web aplikacijama. Ovaj alat automatizuje proces skeniranja zahteva kako bi identifikovao potencijalne probleme sa zagađenjem prototipa. Iskorišćava poznate gadgete - metode korišćenja zagađenja prototipa za izvršavanje štetnih radnji - posebno se fokusirajući na Node.js biblioteke.
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): Ova ekstenzija identifikuje ranjivosti zagađenja prototipa na serverskoj strani. Koristi tehnike opisane u [zagađenju prototipa na serverskoj strani](https://portswigger.net/research/server-side-prototype-pollution).
### AST zagađenje prototipa u NodeJS
@ -243,7 +241,7 @@ NodeJS široko koristi Apstraktna Sintaktička Stabla (AST) u JavaScript-u za fu
#### Analiza ranjivosti Handlebars
Engine za šablone Handlebars je podložan napadu zagađenja prototipa. Ova ranjivost proizašla je iz specifičnih funkcija unutar datoteke `javascript-compiler.js`. Funkcija `appendContent`, na primer, konkatenira `pendingContent` ako je prisutan, dok funkcija `pushSource` resetuje `pendingContent` na `undefined` nakon dodavanja izvora.
Engine za šablone Handlebars je podložan napadu zagađenja prototipa. Ova ranjivost proističe iz specifičnih funkcija unutar datoteke `javascript-compiler.js`. Funkcija `appendContent`, na primer, konkatenira `pendingContent` ako je prisutan, dok funkcija `pushSource` resetuje `pendingContent` na `undefined` nakon dodavanja izvora.
**Proces eksploatacije**
@ -253,7 +251,7 @@ Eksploatacija koristi AST (Apstraktno Sintaktičko Stablo) koje proizvodi Handle
2. **Obrada od strane Kompajlera**: Kompajler može obraditi AST objekat ili string šablon. Ako `input.type` jednako `Program`, ulaz se tretira kao prethodno analiziran, što se može iskoristiti.
3. **Umetanje Koda**: Kroz manipulaciju `Object.prototype`, može se umetnuti proizvoljan kod u funkciju šablona, što može dovesti do daljinskog izvršavanja koda.
Primer koji demonstrira eksploataciju ranjivosti Handlebars:
Primer koji ilustruje eksploataciju ranjivosti Handlebars:
```javascript
const Handlebars = require("handlebars")
@ -283,9 +281,9 @@ console.log(eval("(" + template + ")")["main"].toString())
```
Ovaj kod prikazuje kako napadač može ubrizgati proizvoljan kod u Handlebars šablon.
**Spoljašnja referenca**: Problem vezan za zagađenje prototipa pronađen je u 'flat' biblioteci, kako je detaljno opisano ovde: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
**Spoljašnja Referenca**: Problem vezan za zagađenje prototipa pronađen je u 'flat' biblioteci, kako je detaljno opisano ovde: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
**Spoljašnja referenca**: [Issue related to prototype pollution in the 'flat' library](https://github.com/hughsk/flat/issues/105)
**Spoljašnja Referenca**: [Issue related to prototype pollution in the 'flat' library](https://github.com/hughsk/flat/issues/105)
Primer eksploatacije zagađenja prototipa u Python-u:
```python
@ -336,19 +334,19 @@ requests.get(TARGET_URL)
```
### Preventivne Mere
Da se smanji rizik od zagađenja prototipa, mogu se primeniti sledeće strategije:
Da bi se smanjio rizik od zagađenja prototipa, mogu se primeniti sledeće strategije:
1. **Imutabilnost objekta**: `Object.prototype` se može učiniti imutabilnim primenom `Object.freeze`.
2. **Validacija ulaza**: JSON ulazi treba rigorozno validirati prema šemi aplikacije.
3. **Sigurne funkcije spajanja**: Treba izbegavati nesigurno korišćenje rekurzivnih funkcija spajanja.
4. **Objekti bez prototipa**: Objekti bez svojstava prototipa mogu se kreirati korišćenjem `Object.create(null)`.
3. **Sigurne funkcije spajanja**: Treba izbegavati nesigurnu upotrebu rekurzivnih funkcija spajanja.
4. **Objekti bez prototipa**: Objekti bez svojstava prototipa mogu se kreirati koristeći `Object.create(null)`.
5. **Korišćenje Map**: Umesto `Object`, treba koristiti `Map` za čuvanje parova ključ-vrednost.
6. **Ažuriranje biblioteka**: Sigurnosne zakrpe mogu se uključiti redovnim ažuriranjem biblioteka.
7. **Linter i alati za statičku analizu**: Koristite alate poput ESLint-a sa odgovarajućim dodacima za otkrivanje i sprečavanje ranjivosti na zagađenje prototipa.
7. **Linter i alati za statičku analizu**: Koristite alate poput ESLint-a sa odgovarajućim plugin-ovima za otkrivanje i sprečavanje ranjivosti na zagađenje prototipa.
8. **Revizije koda**: Implementirati temeljne revizije koda kako bi se identifikovali i otklonili potencijalni rizici vezani za zagađenje prototipa.
9. **Obuka o bezbednosti**: Obrazovati programere o rizicima zagađenja prototipa i najboljim praksama za pisanje sigurnog koda.
10. **Korišćenje biblioteka sa oprezom**: Budite oprezni prilikom korišćenja biblioteka trećih strana. Procijenite njihovu sigurnosnu poziciju i pregledajte njihov kod, posebno one koji manipulišu objektima.
11. **Zaštita u vreme izvođenja**: Primena mehanizama zaštite u vreme izvođenja kao što su korišćenje npm paketa fokusiranih na bezbednost koji mogu otkriti i sprečiti napade zagađenja prototipa.
10. **Korišćenje biblioteka sa oprezom**: Budite oprezni prilikom korišćenja biblioteka trećih strana. Procijenite njihov sigurnosni položaj i pregledajte njihov kod, posebno onih koji manipulišu objektima.
11. **Zaštita u vreme izvođenja**: Primena mehanizama zaštite u vreme izvođenja, kao što su korišćenje npm paketa fokusiranih na bezbednost koji mogu otkriti i sprečiti napade zagađenja prototipa.
## Reference