הברחת בקשות - HTTP Request Smuggling - תרגול¶
הקדמה¶
התרגולים מבוססים על מעבדות PortSwigger Web Security Academy בנושא HTTP Request Smuggling. עבדו על כל מעבדה בסדר המוצג - הרמה עולה בהדרגה.
תרגיל 1 - הברחת CL.TE בסיסית (Practitioner)¶
מעבדה: HTTP request smuggling, basic CL.TE vulnerability
משימה:
1. היכנסו למעבדה וזהו שהשרת החזיתי משתמש ב-Content-Length והאחורי ב-Transfer-Encoding
2. בנו בקשת POST שמבריחה את המחרוזת GPOST לתחילת הבקשה הבאה
3. שלחו את הבקשה פעמיים - בפעם השנייה צריך להתקבל שגיאת "Unrecognized method GPOST"
רמז:
POST / HTTP/1.1
Host: <lab-url>
Content-Type: application/x-www-form-urlencoded
Content-Length: ???
Transfer-Encoding: chunked
0
GPOST / HTTP/1.1
Content-Length: 5
x=1
חשבו מה צריך להיות ה-Content-Length כדי שהשרת החזיתי יעביר את כל הגוף.
תרגיל 2 - הברחת TE.CL בסיסית (Practitioner)¶
מעבדה: HTTP request smuggling, basic TE.CL vulnerability
משימה:
1. זהו שהשרת החזיתי משתמש ב-Transfer-Encoding והאחורי ב-Content-Length
2. בנו בקשה שמבריחה prefix של בקשת GPOST
3. אשרו את ההברחה על ידי שליחת שתי בקשות
רמז: ב-TE.CL, הגוף המוברח צריך להיות בתוך חלק chunked. ה-Content-Length הנמוך גורם לשרת האחורי לקרוא רק חלק מהנתונים.
תרגיל 3 - ערפול TE.TE (Practitioner)¶
מעבדה: HTTP request smuggling, obfuscating the TE header
משימה:
1. שני השרתים תומכים ב-Transfer-Encoding, אבל אחד מהם ניתן לערפול
2. נסו את כל טכניקות הערפול עד שתמצאו את זו שעובדת:
- Transfer-Encoding: xchunked
- Transfer-Encoding : chunked
- Transfer-Encoding: chunked (עם רווח בסוף)
- Transfer-Encoding:\tchunked
- ושאר הוריאציות
3. לאחר שמצאתם את הערפול הנכון, הבריחו בקשה שגורמת לשגיאה
תרגיל 4 - עקיפת בקרות גישה (Practitioner)¶
מעבדה: Exploiting HTTP request smuggling to bypass front-end security controls, CL.TE
משימה:
1. הפאנל /admin חסום על ידי השרת החזיתי
2. השתמשו בהברחת CL.TE כדי לגשת לפאנל הניהול
3. מחקו את המשתמש carlos
רמז: הבקשה המוברחת צריכה לכלול את הכותרת Host ואת Content-Length מתאים.
תרגיל 5 - עקיפת בקרות גישה TE.CL (Practitioner)¶
מעבדה: Exploiting HTTP request smuggling to bypass front-end security controls, TE.CL
משימה:
1. אותה מטרה כמו תרגיל 4, אבל הפעם הסוג הוא TE.CL
2. גשו ל-/admin דרך הברחה ומחקו את carlos
תרגיל 6 - חשיפת שכתוב בקשות (Practitioner)¶
מעבדה: Exploiting HTTP request smuggling to reveal front-end request rewriting
משימה:
1. השרת החזיתי מוסיף כותרות לבקשה (כמו X-Forwarded-For). אתם צריכים לגלות אילו
2. השתמשו בהברחה כדי ללכוד את הכותרות שהשרת החזיתי מוסיף
3. השתמשו במידע הזה כדי לגשת ל-/admin
רמז: הבריחו POST לנתיב שמציג את הקלט בתגובה (חיפוש, תגובה). הגוף של הבקשה הבאה יצורף לפרמטר ותוכלו לראות את הכותרות.
תרגיל 7 - לכידת בקשות משתמשים (Practitioner)¶
מעבדה: Exploiting HTTP request smuggling to capture other users' requests
משימה:
1. השתמשו בהברחה כדי ללכוד את הבקשה של משתמש אחר
2. חלצו את עוגיית ה-session שלו
3. השתמשו בעוגייה כדי לגשת לחשבון שלו
רמז: הבריחו POST שכותב תגובה לפוסט, עם Content-Length גדול שיגרום לשרת להמשיך לקרוא את הבקשה הבאה ולצרף אותה לגוף התגובה.
תרגיל 8 - XSS דרך הברחה (Practitioner)¶
מעבדה: Exploiting HTTP request smuggling to deliver reflected XSS
משימה:
1. מצאו נקודת XSS מוחזר באפליקציה (בכותרת User-Agent)
2. השתמשו בהברחה כדי להפעיל את ה-XSS על בקשת המשתמש הבא
3. הפעילו alert(1)
תרגיל 9 - הפניה פתוחה דרך הברחה (Practitioner)¶
מעבדה: Exploiting HTTP request smuggling to perform web cache poisoning
משימה:
1. מצאו הפניה (redirect) שמשתמשת בכותרת Host
2. השתמשו בהברחה כדי להפנות את הבקשה הבאה לדומיין של exploit server
3. הגישו JavaScript זדוני דרך ה-redirect
תרגיל 10 - הרעלת מטמון דרך הברחה (Expert)¶
מעבדה: Exploiting HTTP request smuggling to perform web cache poisoning
משימה:
1. שלבו הברחת בקשות עם הרעלת מטמון
2. גרמו לכך שמשאב JavaScript שנשמר במטמון יכיל קוד זדוני
3. הפעילו alert(document.cookie) על כל מבקר באתר
רמז: הבריחו בקשה שנתיב ה-URL שלה מצביע על ה-JavaScript הסטטי, אבל ה-Host מצביע על שרת התוקף. התגובה מהשרת הזדוני תישמר במטמון.
תרגיל 11 - הרעלת תור תגובות (Expert)¶
מעבדה: Response queue poisoning via H2.TE request smuggling
משימה:
1. השתמשו בהברחת HTTP/2 כדי לגרום ל-desync של תור התגובות
2. לכדו תגובה שמכילה טוקן session של משתמש אחר
3. השתמשו בטוקן כדי לגשת לחשבון הקורבן
תרגיל 12 - הברחה לביצוע CL.0 (Expert)¶
מעבדה: CL.0 request smuggling
משימה:
1. מצאו endpoint שהשרת האחורי מתעלם מ-Content-Length עבורו
2. השתמשו בהתנהגות זו כדי להבריח בקשה
3. גשו לפאנל הניהול ומחקו את carlos
רמז: חפשו endpoints כמו /resources שמגישים קבצים סטטיים - שרתים לפעמים מתעלמים מגוף הבקשה במקרים כאלה.
תרגיל בונוס - כתיבת סקריפט זיהוי¶
כתבו סקריפט Python שמבצע בדיקה אוטומטית של הברחת בקשות:
#!/usr/bin/env python3
"""
כתבו סקריפט שמקבל URL ובודק:
1. האם יש חולשת CL.TE (באמצעות תזמון)
2. האם יש חולשת TE.CL (באמצעות תזמון)
3. האם יש חולשת TE.TE (עם ניסיון ערפולים שונים)
הסקריפט צריך:
- לשלוח בקשות HTTP גולמיות באמצעות socket
- למדוד את זמן התגובה
- להחליט על סמך timeout אם יש חולשה
- להדפיס את הממצאים
"""
משאבים נוספים¶
- PortSwigger Web Security Academy - HTTP Request Smuggling: https://portswigger.net/web-security/request-smuggling
- כלי HTTP Request Smuggler ל-Burp Suite
- מאמר המחקר המקורי של James Kettle: "HTTP Desync Attacks"