diff --git a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md index 6de0ad3c1..b9bbc8003 100644 --- a/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md +++ b/src/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md @@ -1,10 +1,10 @@ -# NodeJS - \_\_proto\_\_ i zagađenje prototipa +# NodeJS - \_\_proto\_\_ & prototype Pollution {{#include ../../../banners/hacktricks-training.md}} ## Objekti u JavaScript-u -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 @@ -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