עקיפה באמצעות קידוד - תרגיל¶
הכנה¶
עבור תרגיל זה, הקימו סביבת בדיקה מקומית עם 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:
ה-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)