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
12473176c9
commit
09026094aa
@ -4,14 +4,14 @@
|
||||
|
||||
## Objects in JavaScript <a href="#id-053a" id="id-053a"></a>
|
||||
|
||||
Vitu katika JavaScript kimsingi ni makusanyo ya jozi za funguo-thamani, zinazojulikana kama mali. Kitu kinaweza kuundwa kwa kutumia `Object.create` na `null` kama hoja ili kuzalisha kitu kisicho na kitu. Njia hii inaruhusu uundaji wa kitu bila mali zozote zilizorithiwa.
|
||||
Vitu katika JavaScript kimsingi ni makusanyo ya jozi za funguo-thamani, zinazojulikana kama mali. Kitu kinaweza kuundwa kwa kutumia `Object.create` na `null` kama hoja ili kuzalisha kitu kisicho na maadili ya kurithi. Njia hii inaruhusu uundaji wa kitu bila mali zozote za kurithi.
|
||||
```javascript
|
||||
// Run this in the developers tools console
|
||||
console.log(Object.create(null)) // This will output an empty object.
|
||||
```
|
||||
Kitu kisichokuwa na kitu ni sawa na kamusi isiyo na kitu, inawakilishwa kama `{}`.
|
||||
Objekti tupu ni sawa na kamusi tupu, inawakilishwa kama `{}`.
|
||||
|
||||
### Kazi na Madarasa katika JavaScript
|
||||
### Functions and Classes in JavaScript
|
||||
|
||||
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
|
||||
@ -31,25 +31,25 @@ var employee1 = new Employee("Generic Employee", "Developer")
|
||||
|
||||
employee1.__proto__
|
||||
```
|
||||
### Prototypes katika JavaScript
|
||||
### Prototypes in JavaScript
|
||||
|
||||
JavaScript inaruhusu mabadiliko, kuongeza, au kufuta sifa za prototype wakati wa utendaji. Uwezo huu unaruhusu upanuzi wa kazi za darasa kwa njia ya dinamik.
|
||||
JavaScript inaruhusu mabadiliko, kuongeza, au kufuta sifa za prototype wakati wa runtime. Uwezo huu unaruhusu upanuzi wa kazi za darasa kwa njia ya dinamik.
|
||||
|
||||
Mifunction kama `toString` na `valueOf` zinaweza kubadilishwa kubadilisha tabia zao, ikionyesha asili inayoweza kubadilika ya mfumo wa prototype wa JavaScript.
|
||||
Functions kama `toString` na `valueOf` zinaweza kubadilishwa kubadilisha tabia zao, kuonyesha asili inayoweza kubadilika ya mfumo wa prototype wa JavaScript.
|
||||
|
||||
## Urithi
|
||||
## Inheritance
|
||||
|
||||
Katika programu inayotegemea prototype, mali/mifunction zinarithiwa na vitu kutoka kwa madarasa. Madarasa haya yanaundwa kwa kuongeza mali/mifunction ama kwa mfano wa darasa lingine au kwa kitu kisicho na kitu.
|
||||
Katika programu inayotegemea prototype, mali/mifano zinarithiwa 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 kinachotumikia 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.
|
||||
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.
|
||||
|
||||
## \_\_proto\_\_ uchafuzi <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
## \_\_proto\_\_ pollution <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
|
||||
## Kuchunguza Uchafuzi wa Prototype katika JavaScript
|
||||
## Exploring Prototype Pollution in JavaScript
|
||||
|
||||
Vitu vya JavaScript vin defined na jozi za funguo-thamani na vinarithi kutoka kwa prototype ya JavaScript Object. Hii inamaanisha kubadilisha prototype ya Object kunaweza kuathiri vitu vyote katika mazingira.
|
||||
JavaScript objects zinafafanuliwa na jozi za funguo-thamani na zinarithi kutoka kwa prototype ya JavaScript Object. Hii inamaanisha kubadilisha prototype ya Object kunaweza kuathiri vitu vyote katika mazingira.
|
||||
|
||||
Hebu tumia mfano tofauti kuonyesha:
|
||||
Tuchukue mfano tofauti kuonyesha:
|
||||
```javascript
|
||||
function Vehicle(model) {
|
||||
this.model = model
|
||||
@ -78,7 +78,7 @@ console.log(car1.isVehicle) // Outputs true
|
||||
```
|
||||
## prototype pollution
|
||||
|
||||
Katika hali ambapo matumizi ya `__proto__` yamepunguziliwa, kubadilisha prototype ya kazi ni chaguo mbadala:
|
||||
Kwa hali ambapo matumizi ya `__proto__` yamepunguziliwa, kubadilisha prototype ya kazi ni chaguo mbadala:
|
||||
```javascript
|
||||
function Vehicle(model) {
|
||||
this.model = model
|
||||
@ -108,7 +108,7 @@ Object.prototype.goodbye = function () {
|
||||
console.log("Goodbye!")
|
||||
}
|
||||
```
|
||||
2. Kuchafulia prototype ya mjenzi wa muundo unaotumika sana:
|
||||
2. Kuchafulia prototipu ya mjenzi wa muundo unaotumika sana:
|
||||
```javascript
|
||||
var example = { key: "value" }
|
||||
example.constructor.prototype.greet = function () {
|
||||
@ -117,11 +117,11 @@ console.log("Hello!")
|
||||
```
|
||||
Baada ya operesheni hizi, kila kitu cha JavaScript kinaweza kutekeleza `goodbye` na `greet` mbinu.
|
||||
|
||||
## Kuingiza vitu vingine
|
||||
## Kuathiri vitu vingine
|
||||
|
||||
### Kutoka kwa darasa hadi Object.prototype
|
||||
### Kutoka darasani hadi Object.prototype
|
||||
|
||||
Katika hali ambapo unaweza **kuingiza kitu maalum** na unahitaji **kufikia `Object.prototype`** unaweza kutafuta kwa kutumia kitu kama ifuatavyo:
|
||||
Katika hali ambapo unaweza **kuathiri kitu maalum** na unahitaji **kufikia `Object.prototype`** unaweza kutafuta kwa kutumia kitu kama ifuatavyo:
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
@ -154,7 +154,7 @@ b[0] //undefined
|
||||
b[1] //"yolo"
|
||||
c[1] // 2 -- not
|
||||
```
|
||||
### Uchafuzi wa vipengele vya Html
|
||||
### Html elements pollution
|
||||
|
||||
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](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
```javascript
|
||||
@ -183,9 +183,9 @@ Object.prototype.isAdmin = true
|
||||
let user = {}
|
||||
user.isAdmin // true
|
||||
```
|
||||
Mechanism nyuma ya hii inahusisha kubadilisha mali kwa namna kwamba 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.
|
||||
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 ilivyoelezwa katika [study](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf) maalum, ni pamoja na:
|
||||
Masharti ambayo shambulio hili linaweza kutekelezwa kwa mafanikio, kama ilivyoainishwa katika [study](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf) maalum, ni pamoja na:
|
||||
|
||||
- Kufanya muungano wa kurudi.
|
||||
- Kuweka mali kulingana na njia.
|
||||
@ -218,7 +218,7 @@ client-side-prototype-pollution.md
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode) // Outputs: true
|
||||
```
|
||||
Uthibitisho huu, ulioainishwa kama CVE-2019–11358, unaonyesha jinsi nakala ya kina inaweza kubadilisha kwa bahati mbaya prototype, ikisababisha hatari za usalama, kama vile ufikiaji wa admin usioidhinishwa ikiwa mali kama `isAdmin` zitakaguliwa bila uthibitisho sahihi wa kuwepo.
|
||||
Hali hii ya usalama, inayojulikana kama CVE-2019–11358, inaonyesha jinsi nakala ya kina inaweza kubadilisha kwa bahati mbaya prototype, na kusababisha hatari za usalama, kama vile ufikiaji wa admin usioidhinishwa ikiwa mali kama `isAdmin` zitakaguliwa bila uthibitisho sahihi wa kuwepo.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: Shambulio la uchafuzi wa prototype kupitia lodash
|
||||
|
||||
@ -226,34 +226,32 @@ Uthibitisho huu, ulioainishwa kama CVE-2019–11358, unaonyesha jinsi nakala ya
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash) ilikumbana na udhaifu sawa wa uchafuzi wa prototype (CVE-2018–3721, CVE-2019–10744). Masuala haya yalishughulikiwa katika toleo 4.17.11.
|
||||
|
||||
### Mafunzo mengine na CVEs
|
||||
### Mafunzo mengine yenye CVEs
|
||||
|
||||
{{#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)
|
||||
|
||||
### Zana za kugundua Uchafuzi wa Prototype
|
||||
|
||||
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/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**](https://github.com/portswigger/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](https://portswigger.net/research/server-side-prototype-pollution).
|
||||
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/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 kuskania 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**](https://github.com/portswigger/server-side-prototype-pollution): Kiendelezi hiki kinatambua udhaifu wa uchafuzi wa prototype upande wa seva. Kinatumia mbinu zilizoelezwa katika [server side prototype pollution](https://portswigger.net/research/server-side-prototype-pollution).
|
||||
|
||||
### Uchafuzi wa Prototype wa AST katika NodeJS
|
||||
|
||||
NodeJS inatumia kwa kiasi kikubwa 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.
|
||||
NodeJS inatumia kwa wingi Miti ya Sintaksia ya Kiholela (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.
|
||||
|
||||
#### Uchambuzi wa Uthibitisho wa Handlebars
|
||||
#### Uchambuzi wa Udhaifu wa Handlebars
|
||||
|
||||
Injini ya templeti ya Handlebars inakabiliwa na shambulio la uchafuzi wa prototype. Uthibitisho huu unatokana na kazi maalum ndani ya faili ya `javascript-compiler.js`. Kazi ya `appendContent`, kwa mfano, inakusanya `pendingContent` ikiwa ipo, wakati kazi ya `pushSource` inarejesha `pendingContent` kuwa `undefined` baada ya kuongeza chanzo.
|
||||
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, inaunganisha `pendingContent` ikiwa ipo, wakati kazi ya `pushSource` inarudisha `pendingContent` kuwa `undefined` baada ya kuongeza chanzo.
|
||||
|
||||
**Mchakato wa Utekelezaji**
|
||||
**Mchakato wa Kutumia**
|
||||
|
||||
Utekelezaji unatumia AST (Miti ya Sintaksia ya Abstrakti) inayozalishwa na Handlebars, ikifuatia hatua hizi:
|
||||
Matumizi yanatumia AST (Miti ya Sintaksia ya Kiholela) inayozalishwa na Handlebars, ikifuatia hatua hizi:
|
||||
|
||||
1. **Manipulation ya Parser**: Kwanza, parser, kupitia node ya `NumberLiteral`, inasisitiza kwamba thamani ni za nambari. Uchafuzi wa prototype unaweza kuzunguka hili, kuruhusu kuingizwa kwa nyuzi zisizo za nambari.
|
||||
2. **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.
|
||||
3. **Kuingiza Msimbo**: Kupitia manipulation ya `Object.prototype`, mtu anaweza kuingiza msimbo wowote katika kazi ya templeti, ambayo inaweza kusababisha utekelezaji wa msimbo wa mbali.
|
||||
1. **Manipulation of the 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.
|
||||
2. **Handling by the Compiler**: Kiholela kinaweza kushughulikia Objekti ya AST au templeti ya nyuzi. Ikiwa `input.type` ni sawa na `Program`, ingizo linachukuliwa kama lililopangwa mapema, ambalo linaweza kutumiwa.
|
||||
3. **Injection of Code**: Kupitia manipulation ya `Object.prototype`, mtu anaweza kuingiza msimbo wa bahati mbaya katika kazi ya templeti, ambayo inaweza kusababisha utekelezaji wa msimbo wa mbali.
|
||||
|
||||
Mfano unaoonyesha utekelezaji wa udhaifu wa Handlebars:
|
||||
Mfano unaoonyesha matumizi ya udhaifu wa Handlebars:
|
||||
```javascript
|
||||
const Handlebars = require("handlebars")
|
||||
|
||||
@ -313,9 +311,9 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
#### Uthibitisho wa Pug
|
||||
#### Pug Vulnerability
|
||||
|
||||
Pug, injini nyingine ya kielelezo, inakabiliwa na hatari sawa ya uchafuzi wa prototype. Taarifa za kina zinapatikana katika mjadala kuhusu [AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug).
|
||||
Pug, injini nyingine ya kiolezo, inakabiliwa na hatari sawa ya uchafuzi wa prototype. Taarifa za kina zinapatikana katika mjadala kuhusu [AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug).
|
||||
|
||||
Mfano wa uchafuzi wa prototype katika Pug:
|
||||
```python
|
||||
@ -334,23 +332,23 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
### Hatua za Kuzuia
|
||||
### Preventive Measures
|
||||
|
||||
Ili kupunguza hatari ya uchafuzi wa prototype, mikakati iliyoorodheshwa hapa chini inaweza kutumika:
|
||||
|
||||
1. **Uthibitisho wa Kitu**: `Object.prototype` inaweza kufanywa isiyoweza kubadilishwa kwa kutumia `Object.freeze`.
|
||||
2. **Uthibitishaji wa Ingizo**: Ingizo la JSON linapaswa kuthibitishwa kwa makini dhidi ya muundo wa programu.
|
||||
3. **Mifumo Salama ya Kuunganisha**: Matumizi yasiyo salama ya mifumo ya kuunganisha ya kurudiwa yanapaswa kuepukwa.
|
||||
4. **Vitu Visivyo na Prototype**: Vitu bila mali za prototype vinaweza kuundwa kwa kutumia `Object.create(null)`.
|
||||
5. **Matumizi ya Ramani**: Badala ya `Object`, `Map` inapaswa kutumika kwa kuhifadhi jozi za funguo-thamani.
|
||||
6. **Sasisho za Maktaba**: Vidokezo vya usalama vinaweza kuingizwa kwa kusasisha maktaba mara kwa mara.
|
||||
7. **Zana za Linter na Uchambuzi wa Kimuundo**: Tumia zana kama ESLint zikiwa na nyongeza zinazofaa kugundua na kuzuia udhaifu wa uchafuzi wa prototype.
|
||||
8. **Mapitio ya Kanuni**: Tekeleza mapitio ya kina ya kanuni ili kubaini na kurekebisha hatari zinazoweza kuhusiana na uchafuzi wa prototype.
|
||||
9. **Mafunzo ya Usalama**: Wafundishe waendelezaji kuhusu hatari za uchafuzi wa prototype na mbinu bora za kuandika kanuni salama.
|
||||
10. **Kutumia Maktaba kwa Uangalifu**: Kuwa makini unapokuwa ukitumia maktaba za upande wa tatu. Kadiria hali yao ya usalama na pitia kanuni zao, hasa zile zinazoshughulikia vitu.
|
||||
11. **Ulinzi wa Wakati wa Uendeshaji**: Tumia mitambo ya ulinzi wa wakati wa uendeshaji kama vile kutumia pakiti za npm zinazolenga usalama ambazo zinaweza kugundua na kuzuia mashambulizi ya uchafuzi wa prototype.
|
||||
1. **Object Immutability**: `Object.prototype` inaweza kufanywa isiyoweza kubadilishwa kwa kutumia `Object.freeze`.
|
||||
2. **Input Validation**: Ingizo la JSON linapaswa kuthibitishwa kwa makini dhidi ya muundo wa programu.
|
||||
3. **Safe Merge Functions**: Matumizi yasiyo salama ya kazi za kuunganisha za kurudiwa yanapaswa kuepukwa.
|
||||
4. **Prototype-less Objects**: Vitu bila mali za prototype vinaweza kuundwa kwa kutumia `Object.create(null)`.
|
||||
5. **Use of Map**: Badala ya `Object`, `Map` inapaswa kutumika kwa kuhifadhi jozi za funguo-thamani.
|
||||
6. **Library Updates**: Mipango ya usalama inaweza kuingizwa kwa kusasisha maktaba mara kwa mara.
|
||||
7. **Linter and Static Analysis Tools**: Tumia zana kama ESLint zikiwa na nyongeza zinazofaa kugundua na kuzuia udhaifu wa uchafuzi wa prototype.
|
||||
8. **Code Reviews**: Tekeleza ukaguzi wa kina wa msimbo ili kubaini na kurekebisha hatari zinazoweza kuhusiana na uchafuzi wa prototype.
|
||||
9. **Security Training**: Wafundishe waendelezaji kuhusu hatari za uchafuzi wa prototype na mbinu bora za kuandika msimbo salama.
|
||||
10. **Using Libraries with Caution**: Kuwa makini unapotumia maktaba za upande wa tatu. Kadiria hali yao ya usalama na ukaguzi wa msimbo wao, hasa wale wanaoshughulikia vitu.
|
||||
11. **Runtime Protection**: Tumia mitambo ya ulinzi wa wakati wa kukimbia kama vile kutumia pakiti za npm zinazolenga usalama ambazo zinaweza kugundua na kuzuia mashambulizi ya uchafuzi wa prototype.
|
||||
|
||||
## Marejeleo
|
||||
## References
|
||||
|
||||
- [https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/)
|
||||
- [https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l](https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l)
|
||||
|
Loading…
x
Reference in New Issue
Block a user