לדלג לתוכן

עקיפה באמצעות קידוד - תרגיל

הכנה

עבור תרגיל זה, הקימו סביבת בדיקה מקומית עם ModSecurity CRS ברמת פרנויה 2.

# הקמת סביבה עם Docker
docker run -d --name modsec-test \
    -p 8080:80 \
    -e PARANOIA=2 \
    owasp/modsecurity-crs:apache

תרגיל 1 - עקיפת חוקת XSS עם קידוד URL

האפליקציה בכתובת http://localhost:8080/search?q= מציגה את הפרמטר q בדף ללא סינון (Reflected XSS). אולם, ModSecurity חוסם מטענים שמכילים <script>.

משימה:
1. ודאו שהמטען <script>alert(1)</script> נחסם
2. מצאו שיטת קידוד URL שעוקפת את החסימה
3. נסו קידוד URL כפול - האם עובד? מדוע כן או לא?
4. נסו קידוד חלקי - קדדו רק תו אחד מהמילה script


תרגיל 2 - שרשרת קידוד לעקיפת SQLi

נקודת הזרקה בכתובת http://localhost:8080/user?id=1. ה-WAF חוסם UNION SELECT.

משימה:
1. נסו את המטען 1' UNION SELECT username, password FROM users-- וודאו שנחסם
2. השתמשו בפונקציית CHAR() כדי לקודד מחרוזות
3. השתמשו ב-hex encoding (0x) למחרוזות
4. שלבו קידוד URL כפול עם הטכניקות מסעיף 2 ו-3
5. מצאו שרשרת קידוד מינימלית שעוקפת את ה-WAF


תרגיל 3 - ישויות HTML לעקיפת XSS

נקודת הזרקה בתוך attribute של HTML:

<input type="text" value="USER_INPUT">

ה-WAF חוסם onerror, onload, onfocus ו-alert.

משימה:
1. בנו מטען שיוצא מה-attribute ומריץ JavaScript
2. השתמשו בישויות HTML עשרוניות (decimal entities) לקידוד event handler
3. השתמשו בישויות HTML הקסדצימליות עם אפסים מובילים
4. שלבו ישויות HTML עם Unicode escapes בתוך ה-JavaScript
5. מצאו מטען שעובד עם לפחות שתי שכבות קידוד


תרגיל 4 - קידוד Unicode לעקיפה

ה-WAF חוסם את המילים: alert, prompt, confirm, eval, script.

משימה:
1. כתבו מטען XSS שמשתמש ב-Unicode escape sequences (\u00XX) כדי לעקוף
2. כתבו מטען שמשתמש בתווי Unicode ברוחב מלא (full-width)
3. כתבו מטען שמשתמש ב-hex escapes (\xXX)
4. כתבו מטען שמשלב Unicode escapes עם אוקטלי
5. בדקו: האם המטענים עובדים אם ה-WAF מפעיל t:utf8toUnicode בחוקים?


תרגיל 5 - Base64 ו-JSFuck

משימה:
1. כתבו מטען XSS שמשתמש ב-atob() לפענוח Base64 בזמן ריצה:
- קדדו alert(document.cookie) ל-Base64
- בנו מטען שמשתמש ב-eval(atob(...))
- עטפו את הכל בתגית HTML מתאימה
2. כתבו את הפקודה alert(1) ב-JSFuck (ניתן להשתמש בממיר אונליין)
3. מצאו הקשר שבו מטען JSFuck יעבוד בפועל (איזה תגית HTML תתמוך?)


תרגיל 6 - Hackvertor ב-Burp Suite

משימה:
1. התקינו את התוסף Hackvertor ב-Burp Suite
2. בנו שרשראות קידוד הבאות ב-Hackvertor ובדקו אותן:
- קידוד URL כפול של מטען XSS
- ישויות HTML בתוך קידוד URL
- Base64 בתוך קידוד URL
3. צרו שרשרת קידוד מותאמת אישית שעוקפת את כל החוקים הבאים בו-זמנית:
- חסימת <script>
- חסימת alert
- חסימת onerror


תרגיל 7 - אתגר מסכם

בקשה לשרת הבדיקה:

POST /api/comment HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

comment=USER_INPUT

ה-WAF (ModSecurity CRS ברמת פרנויה 3) חוסם:
- כל תגיות HTML
- כל event handlers
- את המילים alert, prompt, confirm, eval, Function
- ישויות HTML
- javascript: protocol

משימה:
1. מצאו דרך להריץ JavaScript למרות כל החסימות
2. תעדו כל ניסיון - מה נחסם ומדוע
3. הגיעו למטען עובד עם מינימום שכבות קידוד
4. כתבו סקריפט Python שמייצר את המטען אוטומטית ושולח אותו

import requests
import urllib.parse

target = "http://localhost:8080/api/comment"

# השלימו את הקוד
def generate_encoded_payload(original_payload):
    # כאן הקידוד שלכם
    pass

def test_payload(payload):
    data = {"comment": payload}
    r = requests.post(target, data=data)
    if r.status_code == 200:
        print(f"[+] עבר! מטען: {payload[:50]}...")
    else:
        print(f"[-] נחסם ({r.status_code}): {payload[:50]}...")
    return r.status_code

# בדיקה
payload = generate_encoded_payload("<script>alert(1)</script>")
test_payload(payload)