hacktricks/pentesting-web/postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md

3.2 KiB
Raw Blame History

Ana sayfayı engelleyerek postmessage çalmak

{% hint style="success" %} AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}

Iframe'lerle RC'leri Kazanmak

Bu Terjanq yazısı'na göre, null kökenlerden oluşturulan blob belgeleri güvenlik faydaları için izole edilmiştir, bu da demektir ki, ana sayfayı meşgul tutarsanız, iframe sayfası çalıştırılacaktır.

Temelde bu zorlukta bir izole iframe çalıştırılmaktadır ve hemen yüklenmesinden sonra ebeveyn sayfa bir post mesajı gönderecektir.
Ancak, bu postmessage iletişimi XSS'e karşı savunmasızdır (iframe JS kodu çalıştırabilir).

Bu nedenle, saldırganın amacı ebeveynin iframe oluşturmasına izin vermek, ancak önce ebeveyn sayfanın hassas verileri (flag) göndermesini engelleyip meşgul tutmak ve payload'ı iframe'e göndermektir. Ebeveyn meşgulken, iframe payload'ı çalıştırır; bu, ebeveyn postmessage mesajını dinleyecek ve flag'i sızdıracak bir JS olacaktır.
Sonunda, iframe payload'ı çalıştırır ve ebeveyn sayfa meşgul olmayı bırakır, böylece flag'i gönderir ve payload onu sızdırır.

Ama ebeveyni iframe'i oluşturduktan hemen sonra ve sadece iframe'in hassas verileri göndermeye hazır olmasını beklerken meşgul hale nasıl getirebilirsiniz? Temelde, ebeveynin çalıştırabileceği bir async hareket bulmanız gerekiyor. Örneğin, bu zorlukta ebeveyn postmessages dinliyordu:

window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});

bu nedenle, o karşılaştırmada string'e dönüştürülecek bir postmessage'da büyük bir tam sayı göndermek mümkün oldu, bu da biraz zaman alacaktır:

const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);

Ve tam olarak doğru olmak için, o postmessage'i iframe oluşturulduktan hemen sonra ama ana sayfadan veri almaya hazır olmadan göndermeniz gerekecek, bu yüzden bir setTimeout'ın milisaniyeleriyle oynamanız gerekecek.