Zaman zaman H1 hackktivitesinde postMessage hatası görüyoruz, bazı yazılarda postMessage kelimesinden bahsediliyor, ancak postMessage’da neler olup bittiğini gerçekten biliyor musunuz? Dürüst olmak gerekirse yapmadım, ama şimdi biliyorum, belgeleri, bazı deneyleri ve gerçek hayattaki bir hatayı okuduktan sonra, sonunda bunun neyle ilgili olduğunu bildiğimi rahatlıkla söyleyebilirim.
İlk olarak, dokümanlar bize postMessage’ın “SOP’yi” kontrollü bir şekilde atlatmaya yönelik bir girişim olduğunu söylüyor. Bu cümle her hacker’ın dikkatini çekmeli, SOP bypass’ı harika ama nasıl? İşte bazı örnek.
https://example.com/test.html
var popup = window.open('https://ngailong.com');
setInterval(post,1000);
Eğer https://ngailong.com mesaj olayı dinleyici kurulumu yok, hiçbir şey olmayacak. Mesaj olayı dinleyici kurulumu varsa, kurulumun nasıl yapıldığına bağlı olarak XSS’ye veya bilgilerin açığa çıkmasına karşı savunmasız olabilir.
https://ngailong.com/
window.addEventListener("message", function(event){alert(event.data);}, false);
Kurulumu yaptığımdan beri setInterval Her 1 saniyede bir Mesaj gönderme işlevi, https://ngailong.com buna göre her 1 saniyede bir uyarı kutusuna sahip olacaktır.
PostMessage’ın gerçek hayattaki örnek kullanımlarından bazıları nelerdir?
Belki bir şey.google.com’un kullanıcının e-posta adresini alması gerekiyor, bu yüzden e-posta adresini account.google.com’dan alması gerekiyor, CORS bu kadar basit bir görev için sorunlu, sunucu tarafı kod değişikliği gerektirdiğinden, postMessage kolay ve hızlıdır, yalnızca javascript değişikliği gereklidir.
Bu konsept oldukça hoş görünüyor değil mi? postMessage’ın web tarayıcısının (SOP) temel güvenliğini göz ardı edebileceği düşüncesi çok heyecan verici. HERHANGİ bir pencere herhangi bir zamanda HERHANGİ bir başka pencereye başvurabilir, X-Frame-Options sizi durduramaz, pencerede bir postMessage olay dinleyicisi ayarlandığı sürece her zaman herhangi bir pencereye bir şeyler gönderebilirsiniz, değil mi? O kadar hızlı değil.
Mozilla’dan
Sonuç olarak, mesajları almak için kullanılan herhangi bir olay dinleyicisinin, ilk olarak, kaynağı ve muhtemelen kaynak özelliklerini kullanarak mesajı gönderenin kimliğini kontrol etmesi gerekir. Bu abartılamaz: Kaynağın ve muhtemelen kaynak özelliklerinin kontrol edilmemesi, siteler arası komut dosyası çalıştırma saldırılarına olanak tanır.
Yani her olay dinleyicisinin, herhangi bir javascript’i çalıştırmadan önce mesajı gönderenin kimliğini kontrol etmesi gerekir. Bu, teknik özelliklerde yazılıdır; her geliştiricinin postMessage’ı kullanmadan önce bu notu okuması ve kurallara uyması gerekir! Ne yazık ki durum böyle değil, eğer geliştirici evenListener’da olay kaynağını kontrol etmeyi unutursa, XSS’ye veya hassas bilgilerin ifşa edilmesine neden olabilir.
Yukarıdaki örneği tekrar deneyin ancak bu sefer kökeni kontrol ediyoruz.
https://example.com/test.html
var popup = window.open('https://ngailong.com');
setInterval(post,1000);
Eğer https://ngailong.com mesaj olayı dinleyici kurulumu yok, hiçbir şey olmayacak. Mesaj olayı dinleyici kurulumu varsa, kurulumun nasıl yapıldığına bağlı olarak XSS’ye veya bilgilerin açığa çıkmasına karşı savunmasız olabilir.
https://ngailong.com
window.addEventListener("message", function(event){if (event.origin!="https://ngailong.com"){return}alert(event.data);}, false);
Bu sefer uyarı kutusu yok, nedeni bu sefer kontrol ediyorum even.origin!=https://ngailong.comişlevi hemen sonlandırın. Yani bir mesaj gönderiyorum https://örnek.com neden olacak olay.origin eşittir https://örnek.comdolayısıyla testte başarısız oluyor.
Umarım artık postMessage’ı biraz anlamışsınızdır. Ama tek başına okumak yeterli değil, hadi çalmaya çalışalım. {jeton} postMessage’da neler olup bittiğini gerçekten %100 anlayıp anlamadığınızı görmek için aşağıdaki HTML’yi kullanın.
(Bu alıştırmalar uzmanlara yönelik değildir, yalnızca postMessage hatasının nasıl çalıştığına dair fikir sahibi olmak isteyen biri içindir)
Seviye – 0
var token ="super_secret_token";function receiveMessage(event) { event.source.postMessage(token, event.origin); }window.addEventListener("message", receiveMessage, false);
Seviye – 1
var token ="super_secret_token";function receiveMessage(event) { if (/^(?:https?:)?\/\/www.target.com/i.test(event.origin)){event.source.postMessage(token, event.origin);}window.addEventListener("message", receiveMessage, false);
Hepsini aldın mı? Güzel, şimdi gidip oynayacak bir postMessage bul.
Egzersiz fikri Detectify’ın iki blog gönderisinden kaynaklandı. Onlara teşekkür ederiz.