שיבוש DOM - DOM Clobbering - תרגיל¶
תרגיל 1: שיבוש בסיסי¶
הקוד הבא קיים בדף:
window.onload = function() {
let defaultAvatar = window.avatarConfig || '/images/default.png';
document.getElementById('user-avatar').src = defaultAvatar;
};
א. כתבו HTML payload שישבש את window.avatarConfig כך שהתמונה תטען מ-https://attacker.com/tracking.png.¶
ב. איזה אלמנט HTML משתמש כדי שה-toString() יחזיר URL?¶
ג. האם ה-payload עובר DOMPurify? בדקו.¶
תרגיל 2: שיבוש דו-רמתי¶
הקוד הבא טוען סקריפט אנליטיקה:
let config = window.siteConfig || {};
let trackingUrl = config.tracking || '/default/track.js';
let s = document.createElement('script');
s.src = trackingUrl;
document.head.appendChild(s);
א. צריך לשבש window.siteConfig.tracking כך שיחזיר URL של התוקף. כתבו את ה-HTML.¶
ב. הסבירו מדוע צריך שני אלמנטים עם אותו id.¶
ג. מה קורה אם משתמשים ב-<form> ו-<input> במקום שני אלמנטי <a>?¶
תרגיל 3: שיבוש document properties¶
א. כתבו HTML שדורס את document.getElementById (או מנסה). מה קורה?¶
ב. כתבו HTML שדורס document.cookie. מה ההשלכות?¶
ג. כתבו HTML שדורס document.forms. איזה קוד JavaScript יכול להישבר בגלל זה?¶
תרגיל 4: שיבוש בדיקת אבטחה¶
הקוד הבא אמור להגן מפני XSS:
function safeInsert(html, target) {
if (typeof DOMPurify !== 'undefined' && DOMPurify.sanitize) {
target.innerHTML = DOMPurify.sanitize(html);
} else {
// fallback - escape HTML entities
target.textContent = html;
}
}
א. האם ניתן לשבש DOMPurify כך שהקוד יגיע ל-fallback? כתבו payload.¶
ב. האם ה-fallback בטוח? הסבירו.¶
ג. שפרו את הקוד כך שלא יהיה פגיע לשיבוש.¶
תרגיל 5: מעבדות PortSwigger¶
מעבדה 1: שיבוש DOM ל-XSS¶
- כתובת: DOM clobbering to exploit DOM XSS
- רמה: Practitioner
- משימה: השתמשו ב-DOM clobbering כדי להריץ
alert(document.cookie) - רמז: מצאו קוד שמשתמש ב-
window.defaultAvatarושבשו אותו
מעבדה 2: שיבוש DOM עם שרשור¶
- כתובת: Clobbering DOM attributes to bypass HTML filters
- רמה: Expert
- משימה: עקפו מסנן HTML באמצעות שיבוש DOM attributes
- רמז: שיבוש
attributesשל אלמנטים משפיע על איך מסננים סורקים אלמנטים
תרגיל 6: זיהוי קוד פגיע¶
בדקו את קטעי הקוד הבאים. עבור כל אחד, קבעו אם הוא פגיע לשיבוש DOM והסבירו:
א.¶
ב.¶
const API_BASE = 'https://api.example.com';
fetch(API_BASE + '/users')
.then(r => r.json())
.then(data => renderUsers(data));
ג.¶
var template = window.TEMPLATES || {};
if (template.header) {
document.getElementById('header').innerHTML = template.header;
}
ד.¶
(function() {
let config = window.APP_CONFIG;
if (config && config.cdnUrl) {
loadScript(config.cdnUrl + '/bundle.js');
}
})();
תרגיל 7: אתגר מתקדם¶
האתר הבא משתמש ב-DOMPurify לניקוי קלט ומאפשר הזרקת HTML. הקוד JavaScript בדף:
// loaded after DOMPurify sanitization
(function() {
let widgets = window.widgetRegistry || {};
for (let name in widgets) {
let widget = widgets[name];
let container = document.createElement('div');
container.className = 'widget';
if (typeof widget === 'string' || widget instanceof String) {
let s = document.createElement('script');
s.src = widget;
container.appendChild(s);
}
document.getElementById('widget-area').appendChild(container);
}
})();