NodeJS - __proto__ & prototype Pollution
Last updated
Last updated
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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.
Prazan objekat je sličan praznom rečniku, predstavljen kao {}
.
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 omogućava modifikaciju, dodavanje ili brisanje atributa prototipa u vreme izvođenja. Ova fleksibilnost omogućava dinamičko proširenje funkcionalnosti klasa.
Funkcije kao što su toString
i valueOf
mogu se menjati kako bi se promenilo njihovo ponašanje, što pokazuje prilagodljivu prirodu JavaScript-ovog prototipnog sistema.
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.
JavaScript objekti su definisani parovima ključ-vrednost i nasleđuju iz JavaScript Object prototipa. To znači da modifikacija Object prototipa može uticati na sve objekte u okruženju.
Hajde da upotrebimo drugi primer da ilustrujemo:
Pristup Object prototipu je moguć kroz:
Dodavanjem svojstava u Object prototip, svaki JavaScript objekat će naslediti ova nova svojstva:
Za scenario gde je korišćenje __proto__
ograničeno, modifikacija prototipa funkcije je alternativa:
Ovo utiče samo na objekte kreirane iz Vehicle
konstruktora, dajući im beep
, hasWheels
, honk
i isElectric
svojstva.
Dve metode za globalno utiču na JavaScript objekte kroz zagađenje prototipa uključuju:
Zagađenje Object.prototype
direktno:
Zagađivanje prototipa konstruktora za često korišćenu strukturu:
Nakon ovih operacija, svaki JavaScript objekat može izvršiti goodbye
i greet
metode.
U scenariju gde možete zagađivati određeni objekat i treba da dođete do Object.prototype
, možete ga potražiti sa nečim poput sledećeg koda:
Napomena: pošto možete zagađivati atribute objekata u JS, ako imate pristup da zagađujete niz, takođe možete 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 i pišu).
Kada se generiše HTML element putem JS, moguće je prepisati innerHTML
atribut kako bi se napisao arbitrarni HTML kod. Ideja i primer iz ovog članka.
Zagađenje prototipa se dešava zbog greške u aplikaciji koja omogućava prepisivanje svojstava na Object.prototype
. To znači da pošto većina objekata nasleđuje svoja svojstva iz Object.prototype
Najlakši primer je dodavanje vrednosti neodređenom atributu objekta koji će biti proveravan, kao:
Ako je atribut admin
neodređen, moguće je zloupotrebiti PP i postaviti ga na True sa nečim poput:
Mehanizam iza ovoga uključuje manipulaciju svojstvima tako da, ako napadač ima kontrolu nad određenim ulazima, može modifikovati prototip svih objekata u aplikaciji. Ova manipulacija obično uključuje postavljanje __proto__
svojstva, koje je u JavaScript-u sinonim za direktno modifikovanje prototipa objekta.
Uslovi pod kojima se ovaj napad može uspešno izvršiti, kako je navedeno u specifičnoj studiji, uključuju:
Izvršavanje rekurzivnog spajanja.
Definisanje svojstava na osnovu puta.
Kloniranje objekata.
Ostali payloadi:
Za više detalja pogledajte ovaj članak U jQuery, funkcija $ .extend
može dovesti do prototipskog zagađenja ako se funkcija dubokog kopiranja koristi nepravilno. Ova funkcija se obično koristi za kloniranje objekata ili spajanje svojstava iz podrazumevanog objekta. Međutim, kada je pogrešno konfigurisana, svojstva namenjena novom objektu mogu biti dodeljena prototipu umesto toga. Na primer:
Ova ranjivost, identifikovana kao CVE-2019–11358, ilustruje kako duboka kopija može nenamerno da izmeni prototip, što može dovesti do potencijalnih bezbednosnih rizika, kao što je neovlašćen pristup administratoru ako se svojstva poput isAdmin
proveravaju bez odgovarajuće verifikacije postojanja.
Za više detalja pogledajte ovaj članak
Lodash se suočio sa sličnim ranjivostima prototipne kontaminacije (CVE-2018–3721, CVE-2019–10744). Ovi problemi su rešeni u verziji 4.17.11.
Server-Side-Prototype-Pollution-Gadgets-Scanner: Ekstenzija za Burp Suite dizajnirana za otkrivanje i analizu ranjivosti prototipne kontaminacije na serverskoj strani u web aplikacijama. Ovaj alat automatizuje proces skeniranja zahteva kako bi identifikovao potencijalne probleme prototipne kontaminacije. Iskorišćava poznate gadgete - metode korišćenja prototipne kontaminacije za izvršavanje štetnih radnji - posebno se fokusirajući na Node.js biblioteke.
server-side-prototype-pollution: Ova ekstenzija identifikuje ranjivosti prototipne kontaminacije na serverskoj strani. Koristi tehnike opisane u prototipnoj kontaminaciji na serverskoj strani.
NodeJS široko koristi Apstraktna Sintaktička Stabla (AST) u JavaScript-u za funkcionalnosti poput engine-a za šablone i TypeScript-a. Ovaj deo istražuje ranjivosti povezane sa prototipnom kontaminacijom u engine-ima za šablone, posebno Handlebars i Pug.
Engine za šablone Handlebars je podložan napadu prototipne kontaminacije. Ova ranjivost proističe iz specifičnih funkcija unutar javascript-compiler.js
datoteke. Funkcija appendContent
, na primer, konkatenira pendingContent
ako je prisutan, dok funkcija pushSource
resetuje pendingContent
na undefined
nakon dodavanja izvora.
Proces eksploatacije
Eksploatacija koristi AST (Apstraktno Sintaktičko Stablo) koje proizvodi Handlebars, prateći ove korake:
Manipulacija Parserom: U početku, parser, putem NumberLiteral
čvora, nameće da su vrednosti numeričke. Prototipna kontaminacija može to zaobići, omogućavajući umetanje nenumeričkih stringova.
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.
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:
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.
Spoljašnja referenca: Problem vezan za zagađenje prototipa u 'flat' biblioteci
Primer eksploatacije zagađenja prototipa u Python-u:
Pug, još jedan engine za šablone, suočava se sa sličnim rizikom od zagađenja prototipa. Detaljne informacije su dostupne u diskusiji o AST Injection in Pug.
Primer zagađenja prototipa u Pug:
Da bi se smanjio rizik od zagađenja prototipa, mogu se primeniti sledeće strategije:
Imutabilnost objekta: Object.prototype
se može učiniti imutabilnim primenom Object.freeze
.
Validacija ulaza: JSON ulazi treba rigorozno validirati prema šemi aplikacije.
Sigurne funkcije spajanja: Treba izbegavati nesigurnu upotrebu rekurzivnih funkcija spajanja.
Objekti bez prototipa: Objekti bez svojstava prototipa mogu se kreirati koristeći Object.create(null)
.
Korišćenje Map: Umesto Object
, treba koristiti Map
za čuvanje parova ključ-vrednost.
Ažuriranje biblioteka: Sigurnosne zakrpe mogu se uključiti redovnim ažuriranjem biblioteka.
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.
Revizije koda: Implementirati temeljne revizije koda kako bi se identifikovali i otklonili potencijalni rizici vezani za zagađenje prototipa.
Obuka o bezbednosti: Obrazovati programere o rizicima zagađenja prototipa i najboljim praksama za pisanje sigurnog koda.
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.
Zaštita u vreme izvođenja: Primena mehanizama zaštite u vreme izvođenja kao što su korišćenje npm paketa fokusiranih na sigurnost koji mogu otkriti i sprečiti napade zagađenja prototipa.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)