זיהוי והבנת WAF¶
מהו WAF - Web Application Firewall?¶
חומת אש לאפליקציות רשת (WAF) היא שכבת הגנה שיושבת בין הלקוח לשרת ומנתחת את תעבורת ה-HTTP. בניגוד לחומת אש רגילה שעובדת ברמת רשת (שכבות 3-4), ה-WAF עובד ברמת האפליקציה (שכבה 7) ומבין את תוכן הבקשות.
מנגנוני הגנה של WAF¶
שלושה מנגנונים מרכזיים מרכיבים WAF מודרני:
התאמת דפוסים - Pattern Matching:
המנגנון הבסיסי ביותר. ה-WAF מחזיק מאגר של ביטויים רגולריים (regex) ומחפש התאמה בבקשות נכנסות. לדוגמה, חוקה שמחפשת את המחרוזת UNION SELECT תחסום ניסיונות הזרקת SQL.
זיהוי חריגות - Anomaly Detection:
המערכת בונה פרופיל של תעבורה תקינה ומזהה סטיות. כל חריגה מקבלת ניקוד, וכאשר הניקוד עובר סף מסוים - הבקשה נחסמת. גישה זו מאפשרת זיהוי התקפות חדשות שאין להן חתימה ידועה.
ניתוח התנהגותי - Behavioral Analysis:
מעקב אחרי דפוסי שימוש לאורך זמן. לדוגמה, משתמש ששולח 100 בקשות בדקה עם פרמטרים שונים - ככל הנראה מריץ סריקה אוטומטית.
סוגי WAF¶
WAF ברמת רשת - Network-based WAF¶
מותקן כהתקן פיזי או וירטואלי ברשת, לפני שרת האפליקציה. מספק ביצועים גבוהים אך יקר ודורש תחזוקת חומרה.
דוגמאות: F5 BIG-IP ASM, Fortinet FortiWeb, Barracuda WAF
WAF ברמת מארח - Host-based WAF¶
מותקן כמודול על שרת האפליקציה עצמו. גמיש יותר והתאמה אישית קלה, אך צורך משאבים מהשרת.
דוגמאות: ModSecurity (מודול של Apache/Nginx), NAXSI (מודול של Nginx)
WAF בענן - Cloud-based WAF¶
שירות ענן שמתפקד כ-reverse proxy. תעבורה עוברת דרך תשתית הספק לפני שמגיעה לשרת. קל לפריסה, מתרחב אוטומטית, אך מוסיף latency.
דוגמאות: Cloudflare WAF, AWS WAF, Akamai Kona Site Defender, Imperva Cloud WAF
ספקי WAF מרכזיים¶
Cloudflare¶
הפופולרי ביותר. פועל כ-CDN ו-reverse proxy. מזהים אותו לפי:
- כותרת תגובה: server: cloudflare
- עוגיית __cfduid או cf_clearance
- דף חסימה עם לוגו Cloudflare ו-Ray ID
AWS WAF¶
משולב בשירותי AWS כמו CloudFront ו-ALB. מזהים לפי:
- עוגיית AWSALB או AWSALBCORS
- כותרת x-amzn-requestid
- דף שגיאה של AWS
ModSecurity¶
קוד פתוח, הנפוץ ביותר כמודול שרת. מזהים לפי:
- כותרת server שמכילה Apache או Nginx
- דפי שגיאה 403 עם הודעת ModSecurity
- כותרת X-Mod-Security (אם לא הוסרה)
Akamai Kona Site Defender¶
מזהים לפי:
- כותרת server: AkamaiGHost
- דף חסימה עם Reference ID של Akamai
- כותרת X-Akamai-Transformed
Imperva / Incapsula¶
מזהים לפי:
- עוגיית visid_incap_ או incap_ses_
- כותרת X-CDN: Imperva
- דף חסימה עם הודעת Incapsula
F5 BIG-IP ASM¶
מזהים לפי:
- עוגיית TS ואחריה מחרוזת ארוכה
- עוגיית BIGipServer
- דפי שגיאה ייחודיים של F5
Fortinet FortiWeb¶
מזהים לפי:
- עוגיית FORTIWAFSID
- כותרת server: FortiWeb
- דפי חסימה ייחודיים של FortiWeb
זיהוי WAF באופן אוטומטי - wafw00f¶
הכלי wafw00f הוא כלי הסטנדרט לזיהוי WAF. הוא שולח בקשות מיוחדות ומנתח את התגובות.
התקנה ושימוש בסיסי¶
# התקנה
pip install wafw00f
# סריקה בסיסית
wafw00f https://target.com
# סריקה מפורטת
wafw00f https://target.com -v
# סריקה של כל ה-WAFs האפשריים (לא רק הראשון שנמצא)
wafw00f https://target.com -a
# הצגת רשימת WAFs נתמכים
wafw00f -l
פלט לדוגמה¶
[*] Checking https://target.com
[+] The site https://target.com is behind Cloudflare (Cloudflare Inc.) WAF.
[~] Number of requests: 6
פלט מפורט:
[*] Checking https://target.com
[+] Generic Detection results:
[-] Response code: 403
[-] Response headers:
server: cloudflare
cf-ray: 7a1b2c3d4e5f6-TLV
[-] Matched WAF: Cloudflare (Cloudflare Inc.)
[-] Detection confidence: 100%
זיהוי ידני של WAF¶
זיהוי דרך כותרות תגובה - Response Headers¶
# שליחת בקשה רגילה ובדיקת כותרות
curl -I https://target.com
# שליחת בקשה זדונית ובדיקת ההבדל
curl -I "https://target.com/?id=1' UNION SELECT 1--"
כותרות אופייניות שחושפות WAF:
# Cloudflare
server: cloudflare
cf-ray: 7a1b2c3d4e5f6-TLV
# Akamai
server: AkamaiGHost
X-Akamai-Transformed: 9 - 0
# Imperva
X-CDN: Imperva
# AWS
x-amzn-requestid: a1b2c3d4-e5f6-7890
זיהוי דרך עוגיות - Cookies¶
עוגיות אופייניות:
# Cloudflare
Set-Cookie: __cfduid=d1234567890abcdef; ...
Set-Cookie: cf_clearance=abc123; ...
# AWS ALB
Set-Cookie: AWSALB=xyz789; ...
Set-Cookie: AWSALBCORS=xyz789; ...
# Imperva
Set-Cookie: visid_incap_123456=abc; ...
Set-Cookie: incap_ses_456_123456=def; ...
# F5 BIG-IP
Set-Cookie: BIGipServerpool_web=1234567890.12345.0000; ...
# FortiWeb
Set-Cookie: FORTIWAFSID=abcdef; ...
זיהוי דרך דפי חסימה - Block Pages¶
כל WAF מציג דף חסימה שונה. שליחת בקשה זדונית בכוונה חושפת את ה-WAF:
# בקשת XSS בסיסית
curl "https://target.com/?q=<script>alert(1)</script>"
# בקשת SQLi בסיסית
curl "https://target.com/?id=1' OR 1=1--"
# בקשת traversal
curl "https://target.com/?file=../../../../etc/passwd"
זיהוי מבוסס תזמון - Timing-based Detection¶
import requests
import time
target = "https://target.com"
# בקשה רגילה
start = time.time()
r1 = requests.get(f"{target}/?q=hello")
normal_time = time.time() - start
# בקשה זדונית
start = time.time()
r2 = requests.get(f"{target}/?q=<script>alert(1)</script>")
malicious_time = time.time() - start
print(f"זמן בקשה רגילה: {normal_time:.3f}s")
print(f"זמן בקשה זדונית: {malicious_time:.3f}s")
print(f"הפרש: {malicious_time - normal_time:.3f}s")
# הפרש גדול מרמז על עיבוד נוסף של WAF
if malicious_time > normal_time * 1.5:
print("[!] WAF כנראה פעיל - זמן תגובה ארוך יותר לבקשה זדונית")
הבנת מערכות חוקים - Rule Sets¶
ModSecurity Core Rule Set - CRS¶
מערכת החוקים הפתוחה הנפוצה ביותר. מכילה מאות חוקים המחולקים לקטגוריות:
# מבנה חוקה ב-ModSecurity
SecRule ARGS "@rx (?i)(union\s+select)" \
"id:942100,\
phase:2,\
deny,\
status:403,\
msg:'SQL Injection Attack Detected',\
severity:'CRITICAL',\
tag:'attack-sqli'"
פירוש החוקה:
- ARGS - בדיקת כל הפרמטרים
- @rx - שימוש ב-regex
- (?i) - case insensitive
- union\s+select - הדפוס המבוקש
- phase:2 - בדיקה אחרי קבלת גוף הבקשה
- deny - חסימת הבקשה
רמות פרנויה - Paranoia Levels¶
ה-CRS תומך ב-4 רמות פרנויה:
רמה 1 (ברירת מחדל):
חוקים בסיסיים עם מינימום false positives. חוסם התקפות ברורות בלבד.
רמה 2:
חוקים נוספים שמזהים טכניקות עקיפה נפוצות. יותר false positives.
רמה 3:
חוקים אגרסיביים. מתאים לאפליקציות רגישות. הרבה false positives.
רמה 4:
הרמה הגבוהה ביותר. חוסם כמעט כל דבר חשוד. דורש tuning מאסיבי.
איך חוקים מתאימים - Rule Matching¶
# אופרטורים נפוצים ב-ModSecurity
@rx - ביטוי רגולרי
@pm - חיפוש מחרוזות (pattern match)
@contains - הכלה פשוטה
@eq - שוויון
@gt - גדול מ-
# טרנספורמציות - שינויים שמוחלים לפני הבדיקה
t:lowercase - המרה לאותיות קטנות
t:urlDecode - פענוח URL
t:htmlEntityDecode - פענוח ישויות HTML
t:removeWhitespace - הסרת רווחים
t:compressWhitespace - דחיסת רווחים
מצבי WAF - Detection vs Blocking¶
מצב גילוי - Detection Mode¶
ה-WAF מזהה התקפות ומתעד אותן ביומן, אך לא חוסם. שימושי בשלב הטמעה.
מצב חסימה - Blocking Mode¶
ה-WAF חוסם בקשות זדוניות באופן פעיל.
כתוקפים, חשוב לזהות באיזה מצב ה-WAF עובד. במצב גילוי, ההתקפה תעבור אך תתועד ביומן.
סקירת אסטרטגיות עקיפה¶
לפני שנצלול לטכניקות ספציפיות בשיעורים הבאים, הנה סקירה כללית:
| אסטרטגיה | תיאור | דוגמה |
|---|---|---|
| קידוד | שינוי הייצוג של התווים | %3Cscript%3E |
| זיהום פרמטרים | שליחת פרמטרים כפולים | id=1&id=1 UNION SELECT |
| נורמליזציית Unicode | תווים חלופיים | <script> |
| עקיפה ברמת פרוטוקול | ניצול הבדלי פרסור | Chunked encoding |
| תחביר חלופי | אותה פעולה במילים שונות | SELECT/**/1 |
| מניפולציית מבנה | שינוי מבנה הבקשה | Content-Type mismatch |
דפי חסימה לדוגמה¶
דף חסימה של Cloudflare¶
HTTP/1.1 403 Forbidden
Server: cloudflare
CF-RAY: 7a1b2c3d4e5f6-TLV
<!DOCTYPE html>
<html>
<head><title>Attention Required! | Cloudflare</title></head>
<body>
<h1>Sorry, you have been blocked</h1>
<p>You are unable to access this website.</p>
<p>Ray ID: 7a1b2c3d4e5f6</p>
</body>
</html>
דף חסימה של ModSecurity¶
HTTP/1.1 403 Forbidden
Server: Apache/2.4.41
<!DOCTYPE html>
<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<p>ModSecurity Action: Request denied with status 403</p>
</body>
</html>
דף חסימה של Imperva¶
HTTP/1.1 403 Forbidden
<!DOCTYPE html>
<html>
<head><title>Access Denied</title></head>
<body>
<h1>Request Blocked</h1>
<p>This request was blocked by the security rules.</p>
<p>Incident ID: 12345-67890</p>
<p>Powered by Incapsula</p>
</body>
</html>
נקודת מבט הגנתית - הגדרת WAF נכונה¶
כתוקפים, הבנת הגדרה נכונה עוזרת לנו להבין מה קשה לעקוף:
# הגדרת ModSecurity מומלצת ב-Nginx
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
# הפעלת CRS
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/*.conf
# הגדרות מומלצות ב-modsecurity.conf
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
# רמת פרנויה 2 - איזון טוב
SecAction "id:900000,phase:1,pass,t:none,nolog,\
setvar:tx.paranoia_level=2"
# הגדרת anomaly threshold
SecAction "id:900110,phase:1,pass,t:none,nolog,\
setvar:tx.inbound_anomaly_score_threshold=5"
# טרנספורמציות חובה
SecRule ARGS "@rx .*" "id:1,phase:2,pass,\
t:urlDecode,t:htmlEntityDecode,t:lowercase"
עקרונות חשובים בהגדרת WAF:
1. תמיד לבצע decode לפני בדיקה (URL decode, HTML entity decode)
2. להשתמש ברמת פרנויה מתאימה לאפליקציה
3. לעדכן חוקים באופן שוטף
4. לפקח על יומנים ולזהות false positives
5. לשלב WAF עם הגנות ברמת האפליקציה - WAF הוא שכבה נוספת, לא תחליף
סיכום¶
זיהוי ה-WAF הוא השלב הראשון בכל ניסיון עקיפה. בשיעורים הבאים נלמד טכניקות ספציפיות לעקיפה - החל מקידוד, דרך זיהום פרמטרים, נורמליזציית Unicode, ועד עקיפה ברמת פרוטוקול. הבנה עמוקה של איך ה-WAF עובד, אילו חוקים הוא מפעיל ובאיזו רמת פרנויה - היא המפתח לעקיפה מוצלחת.