NodeJS - __proto__ & prototype Pollution
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Vitu katika JavaScript ni kwa msingi makusanyo ya funguo-thamani, yanayojulikana kama mali. Kitu kinaweza kuundwa kwa kutumia Object.create
na null
kama hoja ili kuzalisha kitu kisicho na maudhui. Njia hii inaruhusu uundaji wa kitu bila mali zozote zilizorithiwa.
An empty object is akin to an empty dictionary, represented as {}
.
Katika JavaScript, madarasa na kazi zinahusiana kwa karibu, ambapo kazi mara nyingi hutumikia kama wajenzi wa madarasa. Licha ya ukosefu wa msaada wa asili wa darasa katika JavaScript, wajenzi wanaweza kuiga tabia ya darasa.
JavaScript inaruhusu mabadiliko, kuongeza, au kufuta sifa za prototype wakati wa utekelezaji. Uwezo huu unaruhusu upanuzi wa kazi za darasa kwa njia ya dinamik.
Mifunction kama toString
na valueOf
inaweza kubadilishwa kubadilisha tabia zao, ikionyesha asili inayoweza kubadilika ya mfumo wa prototype wa JavaScript.
Katika programu inayotegemea prototype, mali/mifano inarithiwa na vitu kutoka kwa madarasa. Madarasa haya yanaundwa kwa kuongeza mali/mifano ama kwa mfano wa darasa lingine au kwa kitu kisicho na kitu.
Inapaswa kuzingatiwa kwamba wakati mali inaongezwa kwa kitu kinachofanya kazi kama prototype kwa vitu vingine (kama myPersonObj
), vitu vinavyorithi vinapata ufikiaji wa mali hii mpya. Hata hivyo, mali hii haionekani moja kwa moja isipokuwa itakapoitwa wazi.
Vitu vya JavaScript vin defined by key-value pairs na vinarithi kutoka kwa prototype ya JavaScript Object. Hii inamaanisha kubadilisha prototype ya Object kunaweza kuathiri vitu vyote katika mazingira.
Hebu tumia mfano tofauti kuonyesha:
Upatikanaji wa prototype ya Object unapatikana kupitia:
Kwa kuongeza mali kwenye prototype ya Object, kila kitu cha JavaScript kitapata urithi wa mali hizi mpya:
Kwa hali ambapo matumizi ya __proto__
yamepunguziliwa, kubadilisha prototype ya kazi ni chaguo mbadala:
Hii inahusisha tu vitu vilivyoundwa kutoka kwa Vehicle
constructor, ikiwapa mali za beep
, hasWheels
, honk
, na isElectric
.
Njia mbili za kuathiri kwa ujumla vitu vya JavaScript kupitia uchafuzi wa prototype ni pamoja na:
Kuchafua Object.prototype
moja kwa moja:
Kuchafulia prototipu ya mjenzi wa muundo unaotumika sana:
Baada ya operesheni hizi, kila kitu cha JavaScript kinaweza kutekeleza goodbye
na greet
mbinu.
Katika hali ambapo unaweza kuingiza kitu maalum na unahitaji kufikia Object.prototype
unaweza kutafuta kwa kutumia kitu kama kificho kifuatacho:
Kumbuka kwamba kadri unavyoweza kuharibu sifa za vitu katika JS, ikiwa una ufikiaji wa kuharibu array unaweza pia kuharibu thamani za array zinazopatikana kwa viashiria (kumbuka kwamba huwezi kuandika upya thamani, hivyo unahitaji kuharibu viashiria ambavyo vinatumika kwa namna fulani lakini havijaandikwa).
Wakati wa kuunda kipengele cha HTML kupitia JS inawezekana kufuta sifa ya innerHTML
ili kufanya iweze kuandika kanuni za HTML zisizo na mpangilio. Wazo na mfano kutoka kwa andiko hili.
Uchafuzi wa prototype unatokea kutokana na kasoro katika programu inayoruhusu kubadilisha mali kwenye Object.prototype
. Hii inamaanisha kwamba kwa sababu vitu vingi vinapata mali zao kutoka Object.prototype
Mfano rahisi ni kuongeza thamani kwenye sifa isiyofafanuliwa ya kitu ambacho kitakaguliwa, kama:
Ikiwa sifa admin
haijafafanuliwa inawezekana kutumia PP na kuipatia Thamani ya Kweli kwa kitu kama:
Mechanism nyuma ya hii inahusisha kubadilisha mali ili ikiwa mshambuliaji ana udhibiti juu ya ingizo fulani, wanaweza kubadilisha prototype ya vitu vyote katika programu. Manipulation hii kwa kawaida inahusisha kuweka mali ya __proto__
, ambayo, katika JavaScript, ni sawa na kubadilisha moja kwa moja prototype ya kitu.
Masharti ambayo shambulio hili linaweza kutekelezwa kwa mafanikio, kama ilivyoainishwa katika study maalum, ni pamoja na:
Kufanya muungano wa kurudi.
Kuweka mali kulingana na njia.
Kutoa vitu.
Mifanozo mingine:
Kwa maelezo zaidi angalia makala hii Katika jQuery, kazi ya $ .extend
inaweza kusababisha prototype pollution ikiwa kipengele cha nakala ya kina kinatumika vibaya. Kazi hii hutumiwa mara nyingi kwa ajili ya kunakili vitu au kuunganisha mali kutoka kwa kitu cha kawaida. Hata hivyo, wakati imewekwa vibaya, mali zinazokusudiwa kwa kitu kipya zinaweza kupewa prototype badala yake. Kwa mfano:
This vulnerability, identified as CVE-2019–11358, illustrates how a deep copy can inadvertently modify the prototype, leading to potential security risks, such as unauthorized admin access if properties like isAdmin
are checked without proper existence verification.
Kwa maelezo zaidi angalia makala hii
Lodash ilikumbana na udhaifu wa uchafuzi wa prototype kama hizo (CVE-2018–3721, CVE-2019–10744). Masuala haya yalishughulikiwa katika toleo 4.17.11.
Server-Side-Prototype-Pollution-Gadgets-Scanner: Kiendelezi cha Burp Suite kilichoundwa kugundua na kuchambua udhaifu wa uchafuzi wa prototype upande wa seva katika programu za wavuti. Zana hii inafanya mchakato wa skanning maombi ili kubaini masuala yanayoweza kuwa ya uchafuzi wa prototype. Inatumia vifaa vilivyojulikana - mbinu za kutumia uchafuzi wa prototype kutekeleza vitendo vya hatari - hasa ikilenga maktaba za Node.js.
server-side-prototype-pollution: Kiendelezi hiki kinatambua udhaifu wa uchafuzi wa prototype upande wa seva. Kinatumia mbinu zilizoelezwa katika uchafuzi wa prototype upande wa seva.
NodeJS inatumia sana Miti ya Sintaksia ya Abstrakti (AST) katika JavaScript kwa kazi kama vile injini za templeti na TypeScript. Sehemu hii inachunguza udhaifu unaohusiana na uchafuzi wa prototype katika injini za templeti, hasa Handlebars na Pug.
Injini ya templeti ya Handlebars inakabiliwa na shambulio la uchafuzi wa prototype. Udhaifu huu unatokana na kazi maalum ndani ya faili ya javascript-compiler.js
. Kazi ya appendContent
, kwa mfano, inachanganya pendingContent
ikiwa ipo, wakati kazi ya pushSource
inarejesha pendingContent
kuwa undefined
baada ya kuongeza chanzo.
Mchakato wa Kutumia
Matumizi yanatumia AST (Miti ya Sintaksia ya Abstrakti) inayozalishwa na Handlebars, ikifuatia hatua hizi:
Manipulation ya Parser: Kwanza, parser, kupitia node ya NumberLiteral
, inasisitiza kwamba thamani ni za nambari. Uchafuzi wa prototype unaweza kuzunguka hili, kuruhusu kuingiza nyuzi zisizo za nambari.
Kushughulikia na Compiler: Compiler inaweza kushughulikia Objekti ya AST au templeti ya nyuzi. Ikiwa input.type
ni sawa na Program
, ingizo linachukuliwa kama limeandaliwa mapema, ambalo linaweza kutumika.
Kuingiza Msimbo: Kupitia manipulation ya Object.prototype
, mtu anaweza kuingiza msimbo wowote katika kazi ya templeti, ambayo inaweza kusababisha utekelezaji wa msimbo wa mbali.
Mfano unaoonyesha matumizi ya udhaifu wa Handlebars:
Hii nambari inaonyesha jinsi mshambuliaji anaweza kuingiza nambari isiyo na mpangilio katika kiolezo cha Handlebars.
Marejeo ya Nje: Tatizo linalohusiana na uchafuzi wa prototype lilipatikana katika maktaba ya 'flat', kama ilivyoelezwa hapa: Tatizo kwenye GitHub.
Marejeo ya Nje: Tatizo linalohusiana na uchafuzi wa prototype katika maktaba ya 'flat'
Mfano wa unyakuzi wa uchafuzi wa prototype katika Python:
Pug, injini nyingine ya kiolezo, inakabiliwa na hatari sawa ya uchafuzi wa prototype. Taarifa za kina zinapatikana katika mjadala kuhusu AST Injection in Pug.
Mfano wa uchafuzi wa prototype katika Pug:
Ili kupunguza hatari ya prototype pollution, mikakati iliyoorodheshwa hapa chini inaweza kutumika:
Object Immutability: Object.prototype
inaweza kufanywa isiyoweza kubadilishwa kwa kutumia Object.freeze
.
Input Validation: Ingizo la JSON linapaswa kuthibitishwa kwa makini dhidi ya muundo wa programu.
Safe Merge Functions: Matumizi yasiyo salama ya kazi za kuunganisha za recursive yanapaswa kuepukwa.
Prototype-less Objects: Vitu bila mali za prototype vinaweza kuundwa kwa kutumia Object.create(null)
.
Use of Map: Badala ya Object
, Map
inapaswa kutumika kwa kuhifadhi jozi za funguo-thamani.
Library Updates: Mipango ya usalama inaweza kuingizwa kwa kusasisha maktaba mara kwa mara.
Linter and Static Analysis Tools: Tumia zana kama ESLint pamoja na plugins zinazofaa kugundua na kuzuia udhaifu wa prototype pollution.
Code Reviews: Tekeleza ukaguzi wa kina wa msimbo ili kubaini na kurekebisha hatari zinazoweza kuhusiana na prototype pollution.
Security Training: Wafundishe waendelezaji kuhusu hatari za prototype pollution na mbinu bora za kuandika msimbo salama.
Using Libraries with Caution: Kuwa makini unapokuwa ukitumia maktaba za watu wengine. Kadiria hali yao ya usalama na ukaguzi wa msimbo wao, hasa wale wanaoshughulikia vitu.
Runtime Protection: Tumia mitambo ya ulinzi wa wakati wa utekelezaji kama vile kutumia pakiti za npm zinazolenga usalama ambazo zinaweza kugundua na kuzuia mashambulizi ya prototype pollution.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)