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
80fa17d35c
commit
e07692064a
@ -4,7 +4,7 @@
|
||||
|
||||
## JavaScript'teki Nesneler <a href="#id-053a" id="id-053a"></a>
|
||||
|
||||
JavaScript'teki nesneler esasen anahtar-değer çiftlerinin, yani özelliklerin, koleksiyonlarıdır. Bir nesne, `null` argümanı ile `Object.create` kullanılarak boş bir nesne oluşturmak için yaratılabilir. Bu yöntem, miras alınan özellik olmadan bir nesne oluşturulmasına olanak tanır.
|
||||
JavaScript'teki nesneler esasen anahtar-değer çiftlerinin, yani özelliklerin, koleksiyonlarıdır. Bir nesne, `null` argümanı ile `Object.create` kullanılarak boş bir nesne oluşturmak için yaratılabilir. Bu yöntem, miras alınan özellikler olmadan bir nesne oluşturulmasına olanak tanır.
|
||||
```javascript
|
||||
// Run this in the developers tools console
|
||||
console.log(Object.create(null)) // This will output an empty object.
|
||||
@ -56,7 +56,7 @@ this.model = model
|
||||
}
|
||||
var car1 = new Vehicle("Tesla Model S")
|
||||
```
|
||||
Object prototipine erişim mümkündür:
|
||||
Object prototipine erişim şu yollarla mümkündür:
|
||||
```javascript
|
||||
car1.__proto__.__proto__
|
||||
Vehicle.__proto__.__proto__
|
||||
@ -121,7 +121,7 @@ Bu işlemlerden sonra, her JavaScript nesnesi `goodbye` ve `greet` yöntemlerini
|
||||
|
||||
### Bir sınıftan Object.prototype'a
|
||||
|
||||
Belirli bir nesneyi **kirletebileceğiniz** ve **`Object.prototype`'a ulaşmanız gerektiği** bir senaryoda, aşağıdaki gibi bir kod ile arama yapabilirsiniz:
|
||||
Belirli bir nesneyi **kirletebileceğiniz** ve **Object.prototype'a ulaşmanız gerektiği** bir senaryoda, aşağıdaki gibi bir kod ile arama yapabilirsiniz:
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
|
||||
```
|
||||
### Dizi elemanları kirliliği
|
||||
|
||||
JS'de nesnelerin niteliklerini kirletebildiğiniz gibi, bir diziye kirletme erişiminiz varsa, dizinin **indeksler aracılığıyla erişilebilir değerlerini de kirletebilirsiniz** (değerleri üzerine yazamayacağınızı unutmayın, bu nedenle bir şekilde kullanılan ancak yazılmayan indeksleri kirletmeniz gerekir).
|
||||
JS'de nesnelerin niteliklerini kirletebildiğiniz gibi, bir diziye erişiminiz varsa, dizinin **indeksler aracılığıyla erişilebilen değerlerini de kirletebilirsiniz** (değerleri üzerine yazamayacağınızı unutmayın, bu nedenle bir şekilde kullanılan ancak yazılmayan indeksleri kirletmeniz gerekir).
|
||||
```javascript
|
||||
c = [1, 2]
|
||||
a = []
|
||||
@ -156,7 +156,7 @@ c[1] // 2 -- not
|
||||
```
|
||||
### Html elemanları kirliliği
|
||||
|
||||
JS aracılığıyla bir HTML elemanı oluştururken, **keyfi HTML kodu yazmak için** **`innerHTML`** özniteliğini **üstüne yazmak** mümkündür. [Bu yazıdan fikir ve örnek](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
JS aracılığıyla bir HTML elemanı oluştururken **`innerHTML`** özniteliğini **üstüne yazmak** mümkün olup, **rastgele HTML kodu yazmasına** olanak tanır. [Bu yazıdan fikir ve örnek](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
```javascript
|
||||
// Create element
|
||||
devSettings["root"] = document.createElement('main')
|
||||
@ -201,7 +201,7 @@ customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
prototype-pollution-to-rce.md
|
||||
{{#endref}}
|
||||
|
||||
Diğer yükler:
|
||||
Diğer payloadlar:
|
||||
|
||||
- [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
||||
|
||||
@ -211,14 +211,14 @@ Diğer yükler:
|
||||
client-side-prototype-pollution.md
|
||||
{{#endref}}
|
||||
|
||||
### CVE-2019–11358: jQuery $ .extend aracılığıyla prototip kirlenmesi saldırısı
|
||||
### CVE-2019–11358: Prototype pollution attack through jQuery $ .extend
|
||||
|
||||
[Detaylar için bu makaleye bakın](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery'de, `$ .extend` fonksiyonu derin kopyalama özelliği yanlış kullanıldığında prototip kirlenmesine yol açabilir. Bu fonksiyon genellikle nesneleri klonlamak veya varsayılan bir nesneden özellikleri birleştirmek için kullanılır. Ancak, yanlış yapılandırıldığında, yeni bir nesne için tasarlanan özellikler yerine prototipe atanabilir. Örneğin:
|
||||
[Detaylar için bu makaleye bakın](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery'de, `$ .extend` fonksiyonu derin kopyalama özelliği yanlış kullanıldığında prototype pollution'a yol açabilir. Bu fonksiyon, nesneleri klonlamak veya varsayılan bir nesneden özellikleri birleştirmek için yaygın olarak kullanılır. Ancak, yanlış yapılandırıldığında, yeni bir nesne için tasarlanan özellikler prototipe atanabilir. Örneğin:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode) // Outputs: true
|
||||
```
|
||||
Bu zafiyet, CVE-2019–11358 olarak tanımlanmıştır ve derin bir kopyanın prototipi istemeden nasıl değiştirebileceğini, `isAdmin` gibi özelliklerin uygun varlık doğrulaması olmadan kontrol edilmesi durumunda yetkisiz yönetici erişimi gibi potansiyel güvenlik risklerine yol açabileceğini göstermektedir.
|
||||
Bu zafiyet, CVE-2019–11358 olarak tanımlanmıştır ve derin bir kopyanın prototipi yanlışlıkla değiştirebileceğini, bu durumun da `isAdmin` gibi özelliklerin uygun varlık doğrulaması olmadan kontrol edilmesi durumunda yetkisiz yönetici erişimi gibi potansiyel güvenlik risklerine yol açabileceğini göstermektedir.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: lodash üzerinden prototip kirlenmesi saldırısı
|
||||
|
||||
@ -228,22 +228,20 @@ Bu zafiyet, CVE-2019–11358 olarak tanımlanmıştır ve derin bir kopyanın pr
|
||||
|
||||
### CVE'ler ile başka bir eğitim
|
||||
|
||||
{{#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)
|
||||
|
||||
### Prototip Kirlenmesini Tespit Etmek için Araçlar
|
||||
|
||||
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Web uygulamalarında sunucu tarafı prototip kirlenmesi zafiyetlerini tespit etmek ve analiz etmek için tasarlanmış Burp Suite eklentisi. Bu araç, potansiyel prototip kirlenmesi sorunlarını tanımlamak için istekleri tarama sürecini otomatikleştirir. Bilinen gadget'ları - prototip kirlenmesini kullanarak zararlı eylemleri gerçekleştirme yöntemleri - özellikle Node.js kütüphanelerine odaklanarak kullanır.
|
||||
- [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Web uygulamalarında sunucu tarafı prototip kirlenmesi zafiyetlerini tespit etmek ve analiz etmek için tasarlanmış Burp Suite eklentisi. Bu araç, potansiyel prototip kirlenmesi sorunlarını tanımlamak için istekleri tarama sürecini otomatikleştirir. Bilinen gadget'ları - prototip kirlenmesini kullanarak zararlı eylemler gerçekleştirme yöntemleri - özellikle Node.js kütüphanelerine odaklanarak kullanır.
|
||||
- [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): Bu eklenti, sunucu tarafı prototip kirlenmesi zafiyetlerini tanımlar. [sunucu tarafı prototip kirlenmesi](https://portswigger.net/research/server-side-prototype-pollution) konusundaki teknikleri kullanır.
|
||||
|
||||
### NodeJS'de AST Prototip Kirlenmesi
|
||||
|
||||
NodeJS, JavaScript'te şablon motorları ve TypeScript gibi işlevler için Soyut Sözdizim Ağaçları (AST) kullanmaktadır. Bu bölüm, şablon motorlarındaki prototip kirlenmesi ile ilgili zafiyetleri, özellikle Handlebars ve Pug'u incelemektedir.
|
||||
NodeJS, JavaScript'te şablon motorları ve TypeScript gibi işlevler için Soyut Sözdizim Ağaçları (AST) kullanmaktadır. Bu bölüm, Handlebars ve Pug gibi şablon motorlarındaki prototip kirlenmesi ile ilgili zafiyetleri keşfetmektedir.
|
||||
|
||||
#### Handlebars Zafiyet Analizi
|
||||
|
||||
Handlebars şablon motoru, bir prototip kirlenmesi saldırısına karşı hassastır. Bu zafiyet, `javascript-compiler.js` dosyasındaki belirli işlevlerden kaynaklanmaktadır. Örneğin, `appendContent` işlevi, `pendingContent` mevcutsa bunu birleştirirken, `pushSource` işlevi kaynağı ekledikten sonra `pendingContent`'i `undefined` olarak sıfırlar.
|
||||
Handlebars şablon motoru, bir prototip kirlenmesi saldırısına karşı hassastır. Bu zafiyet, `javascript-compiler.js` dosyasındaki belirli işlevlerden kaynaklanmaktadır. Örneğin, `appendContent` işlevi, `pendingContent` mevcutsa bunu birleştirirken, `pushSource` işlevi kaynak eklendikten sonra `pendingContent`'i `undefined` olarak sıfırlar.
|
||||
|
||||
**Sömürü Süreci**
|
||||
|
||||
@ -283,9 +281,9 @@ console.log(eval("(" + template + ")")["main"].toString())
|
||||
```
|
||||
Bu kod, bir saldırganın Handlebars şablonuna keyfi kod enjekte edebileceğini göstermektedir.
|
||||
|
||||
**Dış Referans**: 'flat' kütüphanesinde prototip kirlenmesi ile ilgili bir sorun bulundu, burada detaylandırılmıştır: [GitHub'daki Sorun](https://github.com/hughsk/flat/issues/105).
|
||||
**Dış Referans**: 'flat' kütüphanesinde prototip kirlenmesi ile ilgili bir sorun bulundu, detaylar burada: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
||||
|
||||
**Dış Referans**: [‘flat’ kütüphanesindeki prototip kirlenmesi ile ilgili sorun](https://github.com/hughsk/flat/issues/105)
|
||||
**Dış Referans**: [flat kütüphanesindeki prototip kirlenmesi ile ilgili sorun](https://github.com/hughsk/flat/issues/105)
|
||||
|
||||
Python'da prototip kirlenmesi istismarına örnek:
|
||||
```python
|
||||
@ -338,16 +336,16 @@ requests.get(TARGET_URL)
|
||||
|
||||
Prototip kirlenmesi riskini azaltmak için aşağıdaki stratejiler uygulanabilir:
|
||||
|
||||
1. **Nesne Değişmezliği**: `Object.prototype`'ı `Object.freeze` uygulayarak değişmez hale getirebilirsiniz.
|
||||
2. **Girdi Doğrulama**: JSON girdileri, uygulamanın şemasına karşı titizlikle doğrulanmalıdır.
|
||||
3. **Güvenli Birleştirme Fonksiyonları**: Güvensiz birleştirme fonksiyonlarının özyinelemeli kullanımı kaçınılmalıdır.
|
||||
1. **Nesne Değişmezliği**: `Object.prototype` `Object.freeze` uygulanarak değişmez hale getirilebilir.
|
||||
2. **Girdi Doğrulama**: JSON girdileri uygulamanın şemasına karşı titizlikle doğrulanmalıdır.
|
||||
3. **Güvenli Birleştirme Fonksiyonları**: Güvensiz birleştirme fonksiyonlarının rekürsif kullanımı kaçınılmalıdır.
|
||||
4. **Prototipsiz Nesneler**: Prototip özellikleri olmayan nesneler `Object.create(null)` kullanılarak oluşturulabilir.
|
||||
5. **Map Kullanımı**: Anahtar-değer çiftlerini depolamak için `Object` yerine `Map` kullanılmalıdır.
|
||||
6. **Kütüphane Güncellemeleri**: Güvenlik yamaları, kütüphaneleri düzenli olarak güncelleyerek entegre edilebilir.
|
||||
7. **Linter ve Statik Analiz Araçları**: Prototip kirlenmesi zafiyetlerini tespit ve önlemek için uygun eklentilere sahip ESLint gibi araçlar kullanılmalıdır.
|
||||
7. **Linter ve Statik Analiz Araçları**: Prototip kirlenmesi zafiyetlerini tespit ve önlemek için uygun eklentilerle birlikte ESLint gibi araçlar kullanılmalıdır.
|
||||
8. **Kod İncelemeleri**: Prototip kirlenmesi ile ilgili potansiyel riskleri belirlemek ve düzeltmek için kapsamlı kod incelemeleri uygulanmalıdır.
|
||||
9. **Güvenlik Eğitimi**: Geliştiricileri prototip kirlenmesi riskleri ve güvenli kod yazma en iyi uygulamaları hakkında eğitmek.
|
||||
10. **Kütüphaneleri Dikkatle Kullanma**: Üçüncü taraf kütüphaneleri kullanırken dikkatli olun. Güvenlik duruşlarını değerlendirin ve özellikle nesneleri manipüle edenlerin kodunu gözden geçirin.
|
||||
10. **Kütüphaneleri Dikkatli Kullanma**: Üçüncü taraf kütüphaneleri kullanırken dikkatli olun. Güvenlik durumlarını değerlendirin ve özellikle nesneleri manipüle edenlerin kodunu gözden geçirin.
|
||||
11. **Çalışma Zamanı Koruması**: Prototip kirlenmesi saldırılarını tespit ve önlemek için güvenlik odaklı npm paketleri gibi çalışma zamanı koruma mekanizmaları kullanın.
|
||||
|
||||
## Referanslar
|
||||
|
Loading…
x
Reference in New Issue
Block a user