ניצול 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¶
- כתובת: DOM XSS using web messages and JSON.parse
- רמה: Practitioner
- משימה: הריצו
print()תוך עקיפת בדיקת origin חלקית
מעבדה 3: DOM XSS באמצעות postMessage ו-location.href¶
- כתובת: DOM XSS using web messages and a JavaScript URL
- רמה: Practitioner
- משימה: שלחו web message שגורם לניווט ל-JavaScript URL
תרגיל 6: מציאת handlers פגיעים¶
כתבו סקריפט JavaScript שרץ ב-DevTools Console ועושה את הפעולות הבאות:
- מוצא את כל ה-event listeners מסוג
messageבדף - מנתח כל listener ומחפש שימוש ב-
innerHTML,eval,location - בודק אם יש ולידציית origin
- מדפיס דוח של חולשות שנמצאו
רמז: השתמשו ב-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;
}
});