הזרקת תבניות - SSTI - תרגיל¶
תרגיל 1 - זיהוי מנוע תבניות¶
PortSwigger Lab: Server-side template injection with information disclosure via user-supplied objects
משימות¶
- גשו לאפליקציה ומצאו נקודה שבה קלט המשתמש מעובד כתבנית
- השתמשו בעץ ההחלטות כדי לזהות את מנוע התבניות:
- נסו
{{7*7}} - נסו
{{7*'7'}} - נסו
${7*7} - תעדו את מנוע התבניות שזיהיתם ואת הראיות
תרגיל 2 - SSTI בסיסי ל-RCE ב-Jinja2¶
PortSwigger Lab: Server-side template injection in an unknown language with a documented exploit
משימות¶
- מצאו את נקודת ההזרקה באפליקציה
- אשרו שמדובר ב-SSTI עם
{{7*7}} - זהו שמדובר ב-Jinja2 עם
{{7*'7'}} - בנו שרשרת MRO להגיע ל-RCE:
- התחילו עם
{{''.__class__.__mro__}} - מצאו את כל תת-המחלקות
- מצאו מחלקה שמאפשרת הרצת קוד
- קראו את הקובץ הסודי והשלימו את התרגיל
תרגיל 3 - SSTI ב-Twig¶
PortSwigger Lab: Server-side template injection in a sandboxed environment
משימות¶
- מצאו את נקודת ההזרקה
- זהו שמדובר ב-Twig (איך אתם מבחינים בין Twig ל-Jinja2?)
- נסו את ה-payload הבא:
- אם יש sandbox, נסו לעקוף אותו
- הריצו פקודה שקוראת את הקובץ הנדרש
תרגיל 4 - SSTI ב-Freemarker¶
משימות¶
- הקימו סביבת תרגול מקומית עם Spring Boot ו-Freemarker
- צרו endpoint פגיע שמקבל קלט מהמשתמש ומכניס אותו לתבנית
- נסו את הפיילואדים הבאים ותעדו את התוצאות:
- כתבו payload שקורא את התוכן של
/etc/passwd
תרגיל 5 - עקיפת סינון¶
PortSwigger Lab: Server-side template injection with a custom exploit
משימות¶
- מצאו את נקודת ההזרקה
- גלו אילו תווים או מילים חסומים
- נסו טכניקות עקיפה:
- שרשור מחרוזות
- קידוד hex
- שימוש ב-
attr() - שימוש ב-
request.args - השיגו RCE למרות הסינון
רמזים¶
- אם
__class__חסום, נסו:''|attr('\x5f\x5fclass\x5f\x5f') - אם נקודות חסומות, נסו:
''['__class__']['__mro__'] - אם
_חסום, נסו:''|attr(request.args.a)עם?a=__class__
תרגיל 6 - זיהוי SSTI מהודעות שגיאה¶
משימות¶
בהינתן הודעות השגיאה הבאות, זהו את מנוע התבניות:
jinja2.exceptions.UndefinedError: 'x' is undefinedTwig\Error\SyntaxError: Unexpected tokenfreemarker.core.ParseException: Encountered "}" at line 1org.thymeleaf.exceptions.TemplateProcessingExceptionTraceback: mako.exceptions.SyntaxException
לכל מנוע - כתבו payload מתאים להשגת RCE.
תרגיל 7 - כל מעבדות PortSwigger¶
השלימו את כל המעבדות של PortSwigger בנושא SSTI:
- Basic server-side template injection (Apprentice)
- Basic server-side template injection (code context) (Practitioner)
- Server-side template injection using documentation (Practitioner)
- Server-side template injection in an unknown language (Practitioner)
- Server-side template injection with information disclosure (Practitioner)
- Server-side template injection in a sandboxed environment (Expert)
- Server-side template injection with a custom exploit (Expert)
לכל מעבדה תעדו¶
- את נקודת ההזרקה שמצאתם
- את מנוע התבניות שזיהיתם
- את שרשרת הניצול שבניתם
- את ה-payload הסופי
תרגיל 8 - בניית כלי זיהוי SSTI¶
משימות¶
כתבו סקריפט Python שמקבל URL ופרמטר, ובודק אוטומטית:
- האם קיים SSTI
- איזה מנוע תבניות פעיל
- האם ניתן להגיע ל-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.
משימות¶
- אשרו שקיים SSTI
- חלצו את ה-SECRET_KEY של Flask
- השיגו RCE
- קראו את הקובץ
/flag.txt - תעדו את כל השלבים ב-writeup מסודר