לדלג לתוכן

הזרקת תבניות - SSTI - תרגיל

תרגיל 1 - זיהוי מנוע תבניות

PortSwigger Lab: Server-side template injection with information disclosure via user-supplied objects

משימות

  1. גשו לאפליקציה ומצאו נקודה שבה קלט המשתמש מעובד כתבנית
  2. השתמשו בעץ ההחלטות כדי לזהות את מנוע התבניות:
  3. נסו {{7*7}}
  4. נסו {{7*'7'}}
  5. נסו ${7*7}
  6. תעדו את מנוע התבניות שזיהיתם ואת הראיות

תרגיל 2 - SSTI בסיסי ל-RCE ב-Jinja2

PortSwigger Lab: Server-side template injection in an unknown language with a documented exploit

משימות

  1. מצאו את נקודת ההזרקה באפליקציה
  2. אשרו שמדובר ב-SSTI עם {{7*7}}
  3. זהו שמדובר ב-Jinja2 עם {{7*'7'}}
  4. בנו שרשרת MRO להגיע ל-RCE:
  5. התחילו עם {{''.__class__.__mro__}}
  6. מצאו את כל תת-המחלקות
  7. מצאו מחלקה שמאפשרת הרצת קוד
  8. קראו את הקובץ הסודי והשלימו את התרגיל

תרגיל 3 - SSTI ב-Twig

PortSwigger Lab: Server-side template injection in a sandboxed environment

משימות

  1. מצאו את נקודת ההזרקה
  2. זהו שמדובר ב-Twig (איך אתם מבחינים בין Twig ל-Jinja2?)
  3. נסו את ה-payload הבא:
{{['id']|filter('system')}}
  1. אם יש sandbox, נסו לעקוף אותו
  2. הריצו פקודה שקוראת את הקובץ הנדרש

תרגיל 4 - SSTI ב-Freemarker

משימות

  1. הקימו סביבת תרגול מקומית עם Spring Boot ו-Freemarker
  2. צרו endpoint פגיע שמקבל קלט מהמשתמש ומכניס אותו לתבנית
  3. נסו את הפיילואדים הבאים ותעדו את התוצאות:
${7*7}
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
  1. כתבו payload שקורא את התוכן של /etc/passwd

תרגיל 5 - עקיפת סינון

PortSwigger Lab: Server-side template injection with a custom exploit

משימות

  1. מצאו את נקודת ההזרקה
  2. גלו אילו תווים או מילים חסומים
  3. נסו טכניקות עקיפה:
  4. שרשור מחרוזות
  5. קידוד hex
  6. שימוש ב-attr()
  7. שימוש ב-request.args
  8. השיגו RCE למרות הסינון

רמזים

  • אם __class__ חסום, נסו: ''|attr('\x5f\x5fclass\x5f\x5f')
  • אם נקודות חסומות, נסו: ''['__class__']['__mro__']
  • אם _ חסום, נסו: ''|attr(request.args.a) עם ?a=__class__

תרגיל 6 - זיהוי SSTI מהודעות שגיאה

משימות

בהינתן הודעות השגיאה הבאות, זהו את מנוע התבניות:

  1. jinja2.exceptions.UndefinedError: 'x' is undefined
  2. Twig\Error\SyntaxError: Unexpected token
  3. freemarker.core.ParseException: Encountered "}" at line 1
  4. org.thymeleaf.exceptions.TemplateProcessingException
  5. Traceback: mako.exceptions.SyntaxException

לכל מנוע - כתבו payload מתאים להשגת RCE.


תרגיל 7 - כל מעבדות PortSwigger

השלימו את כל המעבדות של PortSwigger בנושא SSTI:

  1. Basic server-side template injection (Apprentice)
  2. Basic server-side template injection (code context) (Practitioner)
  3. Server-side template injection using documentation (Practitioner)
  4. Server-side template injection in an unknown language (Practitioner)
  5. Server-side template injection with information disclosure (Practitioner)
  6. Server-side template injection in a sandboxed environment (Expert)
  7. Server-side template injection with a custom exploit (Expert)

לכל מעבדה תעדו

  • את נקודת ההזרקה שמצאתם
  • את מנוע התבניות שזיהיתם
  • את שרשרת הניצול שבניתם
  • את ה-payload הסופי

תרגיל 8 - בניית כלי זיהוי SSTI

משימות

כתבו סקריפט Python שמקבל URL ופרמטר, ובודק אוטומטית:

  1. האם קיים SSTI
  2. איזה מנוע תבניות פעיל
  3. האם ניתן להגיע ל-RCE
# מבנה בסיסי - השלימו את הקוד
import requests

PAYLOADS = {
    'jinja2': {'detect': '{{7*7}}', 'expected': '49', 'confirm': "{{7*'7'}}", 'confirm_expected': '7777777'},
    'twig': {'detect': '{{7*7}}', 'expected': '49', 'confirm': "{{7*'7'}}", 'confirm_expected': '49'},
    'freemarker': {'detect': '${7*7}', 'expected': '49'},
    'erb': {'detect': '<%= 7*7 %>', 'expected': '49'},
    'mako': {'detect': '${7*7}', 'expected': '49'},
}

def detect_ssti(url, param):
    # השלימו את הפונקציה
    pass

אתגר מסכם

תרחיש

אתם מבצעים בדיקת חדירה לאפליקציית Flask. מצאתם עמוד שמציג הודעת שגיאה מותאמת אישית עם פרמטר message ב-URL.

משימות

  1. אשרו שקיים SSTI
  2. חלצו את ה-SECRET_KEY של Flask
  3. השיגו RCE
  4. קראו את הקובץ /flag.txt
  5. תעדו את כל השלבים ב-writeup מסודר