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
ad6ace9def
commit
a624694de5
@ -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-2019–11358, 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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user