לדלג לתוכן

ניצול PostMessage - תרגיל

תרגיל 1: זיהוי חולשות בולידציית origin

עבור כל handler, זהו את החולשה וכתבו דף תוקף שמנצל אותה:

א. ללא בדיקה

window.addEventListener('message', function(event) {
  document.getElementById('status').innerHTML = event.data.message;
});

ב. בדיקה חלקית עם indexOf

window.addEventListener('message', function(event) {
  if (event.origin.indexOf('trusted.com') > -1) {
    eval(event.data);
  }
});

ג. בדיקה עם endsWith

window.addEventListener('message', function(event) {
  if (event.origin.endsWith('.example.com')) {
    document.getElementById('widget').innerHTML = event.data.html;
  }
});

ד. בדיקה עם regex לא מעוגן

window.addEventListener('message', function(event) {
  if (/https:\/\/.*example\.com/.test(event.origin)) {
    processMessage(event.data);
  }
});

תרגיל 2: ניצול postMessage ל-XSS

האתר https://vulnerable-shop.com מכיל את ה-handler הבא:

window.addEventListener('message', function(event) {
  if (event.data.action === 'showPromotion') {
    let promoDiv = document.getElementById('promotion');
    promoDiv.innerHTML = '<h2>' + event.data.title + '</h2><p>' + event.data.description + '</p>';
    promoDiv.style.display = 'block';
  }

  if (event.data.action === 'redirect') {
    window.location.href = event.data.url;
  }
});

א. כתבו דף HTML מלא שפותח את האתר ב-iframe ומבצע XSS דרך showPromotion.

ב. כתבו דף HTML שמבצע redirect לכתובת javascript:.

ג. כתבו דף HTML שגונב cookies דרך XSS ושולח אותם לשרת התוקף.


תרגיל 3: גניבת מידע

האתר https://banking.example.com שולח נתוני משתמש ל-parent window:

// בתוך iframe של banking.example.com
function sendUserInfo() {
  let userData = {
    name: document.getElementById('user-name').textContent,
    balance: document.getElementById('balance').textContent,
    csrfToken: document.querySelector('meta[name="csrf-token"]').content
  };
  window.parent.postMessage(userData, '*');
}

window.onload = sendUserInfo;

א. כתבו דף HTML שטוען את הבנק ב-iframe ומאזין למידע.

ב. שלחו את המידע שנגנב לשרת שלכם.

ג. מה הבעיה בקוד? איך הייתם מתקנים?


תרגיל 4: null origin

ה-handler הבא מקבל הודעות עם null origin:

window.addEventListener('message', function(event) {
  // "תומך" ב-local files וב-sandboxed iframes
  if (event.origin === 'https://trusted.com' || event.origin === 'null') {
    let data = JSON.parse(event.data);
    eval(data.code);
  }
});

א. כיצד ניתן לשלוח הודעה עם null origin? הדגימו עם sandboxed iframe.

ב. כתבו PoC מלא שמנצל את החולשה.


תרגיל 5: מעבדות PortSwigger

מעבדה 1: DOM XSS באמצעות postMessage

  • כתובת: DOM XSS using web messages
  • רמה: Practitioner
  • משימה: הריצו print() באמצעות שליחת web message

מעבדה 2: DOM XSS באמצעות postMessage ו-JSON.parse

מעבדה 3: DOM XSS באמצעות postMessage ו-location.href


תרגיל 6: מציאת handlers פגיעים

כתבו סקריפט JavaScript שרץ ב-DevTools Console ועושה את הפעולות הבאות:

  1. מוצא את כל ה-event listeners מסוג message בדף
  2. מנתח כל listener ומחפש שימוש ב-innerHTML, eval, location
  3. בודק אם יש ולידציית origin
  4. מדפיס דוח של חולשות שנמצאו

רמז: השתמשו ב-getEventListeners(window) ב-Chrome DevTools.


תרגיל 7: תיקון handler פגיע

ה-handler הבא משמש מערכת תשלומים. תקנו את כל החולשות:

window.addEventListener('message', function(event) {
  let data = event.data;

  switch (data.command) {
    case 'updateTotal':
      document.getElementById('total').innerHTML = '$' + data.amount;
      break;

    case 'setPaymentMethod':
      let method = data.method;
      document.getElementById('method-display').innerHTML = method;
      break;

    case 'processPayment':
      fetch('/api/pay', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ amount: data.amount, method: data.method })
      });
      break;

    case 'getReceipt':
      let receipt = generateReceipt();
      event.source.postMessage(receipt, '*');
      break;
  }
});

א. רשמו את כל החולשות בקוד.

ב. כתבו גרסה מתוקנת עם ולידציית origin, sanitization, ו-targetOrigin.

ג. כתבו בדיקות (tests) שמוודאות שה-handler דוחה הודעות ממקורות לא מורשים.