אתגר CTF - עקיפת WAF¶
מבוא¶
אתגר זה משלב את כל הטכניקות שנלמדו בפרק 8. תעברו חמישה שלבים, כל אחד דורש שילוב של טכניקות עקיפה שונות. כל שלב נותן דגל (flag) שמאפשר גישה לשלב הבא.
שלב 1 - זיהוי ה-WAF¶
תיאור¶
הגישו בקשה לאפליקציית היעד ב-http://TARGET:8080/ וזהו את ה-WAF.
משימות¶
-
השתמשו ב-wafw00f לזיהוי ראשוני:
-
בצעו זיהוי ידני:
-
זהו את רמת הפרנויה על ידי בדיקה שיטתית:
import requests target = "http://TARGET:8080" # מטענים לפי רמת פרנויה tests = { "PL1 - basic SQLi": "1' OR 1=1--", "PL1 - basic XSS": "<script>alert(1)</script>", "PL2 - encoded SQLi": "1' UNION ALL SELECT 1--", "PL2 - alt XSS": "<img src=x onerror=alert(1)>", "PL3 - suspicious chars": "SELECT FROM WHERE", "PL3 - any HTML tag": "<div onmouseover=x>", "PL4 - special chars": "(); {}", } for name, payload in tests.items(): r = requests.get(f"{target}/search", params={"q": payload}) status = "BLOCKED" if r.status_code == 403 else "PASSED" print(f"[{status}] {name}: {payload}") -
תעדו את הממצאים שלכם:
- סוג ה-WAF
- גרסה (אם זיהיתם)
- רמת פרנויה משוערת
- חוקים ספציפיים שזיהיתם
דגל שלב 1: לאחר זיהוי נכון, הגישו את התשובה ב-/api/stage1?waf=WAF_NAME¶noia=LEVEL
שלב 2 - עקיפת XSS¶
תיאור¶
נקודת הזרקת XSS מוחזרת (Reflected XSS) בכתובת:
הקלט מוזרק ישירות ל-HTML:
ה-WAF חוסם:
- כל סוגי תגיות <script>
- Event handlers נפוצים: onerror, onload, onclick, onfocus
- פונקציות: alert, eval, Function
- javascript: protocol
- קידוד URL של הנ"ל
משימות¶
-
נסו שרשרת קידוד:
-
נסו תגיות חלופיות עם event handlers חלופיים:
-
נסו פונקציות חלופיות:
-
שלבו טכניקות:
- תגית חלופית + event handler חלופי + קידוד של הפונקציה
- Unicode full-width + פונקציה חלופית
-
HPP לפיצול המטען
-
המטרה: להריץ
alert(document.domain)בדפדפן
דגל שלב 2: כאשר ה-JavaScript רץ, הוא חושף את הדגל בעמוד.
שלב 3 - עקיפת SQLi¶
תיאור¶
נקודת הזרקת SQL בכתובת:
שאילתה בצד השרת:
טבלת flags:
ה-WAF חוסם:
- UNION SELECT (כל הווריאציות הנפוצות)
- OR 1=1, AND 1=1
- information_schema
- SLEEP(), BENCHMARK()
- הערות /**/ ו---
- קידוד URL של הנ"ל
משימות¶
-
נסו תחביר חלופי:
-
שלבו עם טכניקות קידוד:
-
שלבו עם טכניקות פרוטוקול:
-
המטרה: חלצו את הדגל מטבלת flags:
דגל שלב 3: תוכן שדה flag בטבלת flags.
שלב 4 - SSRF מאחורי WAF¶
תיאור¶
נקודת SSRF בכתובת:
השרת מבצע בקשת HTTP ל-URL ומחזיר את התוכן. שרת פנימי רץ על http://127.0.0.1:9090/flag ומכיל את הדגל.
ה-WAF חוסם:
- 127.0.0.1 (כל הפורמטים הנפוצים)
- localhost
- 0.0.0.0
- 169.254.x.x
- כתובות פרטיות (10.x, 172.16.x, 192.168.x)
- file://, gopher://, dict://
- IPv6 [::1]
משימות¶
-
נסו ייצוגים חלופיים של 127.0.0.1:
-
נסו DNS-based bypass:
-
נסו redirect-based bypass:
- הקימו שרת שמחזיר:
-
שלחו ל-
http://YOUR_SERVER/redirect -
שלבו עם טכניקות קידוד:
דגל שלב 4: תוכן התגובה מ-http://127.0.0.1:9090/flag.
שלב 5 - אתגר סופי - RCE¶
תיאור¶
השלב הסופי משלב את כל מה שלמדתם. נקודת הזרקת פקודות:
השרת מריץ:
הדגל נמצא בקובץ /flag.txt.
ה-WAF חוסם (רמת פרנויה 4):
- כל מפרידי פקודות: ;, |, &, `
- $( ו-)
- cat, head, tail, less, more, nl, tac
- /flag, flag.txt
- שורות חדשות בגוף JSON
- Wildcards: *, ?
- קידוד URL של כל הנ"ל
- הערות #
- Backticks
משימות¶
זה האתגר הקשה ביותר. תצטרכו לשלב מספר טכניקות:
- ברמת פרוטוקול:
- שנו Content-Type
- השתמשו ב-chunked encoding
-
נסו HPP
-
ברמת קידוד:
- קידוד כפול
- Unicode
-
Hex
-
ברמת פקודה:
- הרחבת משתנים:
$'\x63\x61\x74' - מרכאות:
c""at - Base64:
echo ... | base64 -d | bash -
Variable splitting:
a=c;b=at;$a$b -
ברמת נתיב:
- Wildcards:
/????.??? - Symlinks
-
/proc/self/root/flag.txt -
רמזים:
- שורות חדשות בתוך JSON עשויות לעבוד אם מקודדות כ-
\n(JSON escape) ולא כ-%0a - חלק מה-WAFs לא בודקים גוף JSON באותו אופן כמו form-urlencoded
- נסו
\nכמפריד פקודות בתוך JSON string - שילוב של Variable expansion עם hex escape:
$'\x63\x61\x74'=cat - נתיב חלופי לקובץ:
/proc/self/root/flag.txtאו symlink
דגל שלב 5: תוכן /flag.txt.
משאבים מומלצים¶
מעבדות PortSwigger¶
- SQL injection with filter bypass via XML encoding
- Reflected XSS with some SVG markup allowed
- SSRF with filter bypass via open redirection
אתגרי HackTheBox¶
- WAF bypass challenges בקטגוריית Web
- Machines עם WAF: Bounty Hunter, Nunchucks, Trick
כלים¶
- wafw00f - זיהוי WAF
- SQLMap - עם tamper scripts לעקיפת WAF:
- Burp Suite + Hackvertor - שרשראות קידוד
- XSStrike - מציאת מטעני XSS שעוקפים פילטרים
מערכת ניקוד¶
| שלב | ניקוד | נושא |
|---|---|---|
| שלב 1 | 10 נקודות | זיהוי WAF |
| שלב 2 | 20 נקודות | עקיפה ל-XSS |
| שלב 3 | 25 נקודות | עקיפה ל-SQLi |
| שלב 4 | 20 נקודות | עקיפה ל-SSRF |
| שלב 5 | 25 נקודות | שילוב לכל טכניקות ל-RCE |
| סהכ | 100 נקודות |
בונוסים¶
- שלב 2: מטען XSS ללא תגיות כלל (בתוך הקשר JavaScript) - 5 נקודות בונוס
- שלב 3: חילוץ כל הנתונים מכל הטבלאות - 5 נקודות בונוס
- שלב 5: ביצוע reverse shell - 10 נקודות בונוס
דוח¶
בסיום האתגר, הגישו דוח שמכיל:
- לכל שלב:
- המטען שעבד
- רשימת הניסיונות שנחסמו
- הסבר למה העקיפה עובדת
-
הדגל
-
סיכום:
- איזו טכניקה הכי יעילה באופן כללי?
- איזה שילוב טכניקות הכי עוצמתי?
-
אילו המלצות הגנה הייתם נותנים?
-
סקריפטים:
- צרפו את כל הסקריפטים שכתבתם
- תעדו כל סקריפט עם הסבר לשימוש