תקיפות HTTP/2 - תרגול¶
הקדמה¶
התרגולים מבוססים על מעבדות PortSwigger Web Security Academy בנושא HTTP/2 Request Smuggling. כל המעבדות דורשות שימוש ב-Burp Suite עם תמיכת HTTP/2 (גרסה 2023 ומעלה).
תרגיל 1 - הברחת H2.CL בסיסית (Practitioner)¶
מעבדה: H2.CL request smuggling
משימה:
1. פתחו את המעבדה ב-Burp Suite עם HTTP/2 מופעל
2. שלחו בקשת POST ב-HTTP/2 עם content-length: 0 ובגוף הבקשה הוסיפו בקשת GET מוברחת
3. הגישו גישה ל-/admin דרך ההברחה
4. מחקו את המשתמש carlos
רמז: ב-Burp Repeater, בחרו HTTP/2 ושלחו:
:method: POST
:path: /
:authority: <lab-url>
content-type: application/x-www-form-urlencoded
content-length: 0
GET /admin HTTP/1.1
Host: <lab-url>
תרגיל 2 - הברחת H2.TE (Practitioner)¶
מעבדה: H2.TE request smuggling
משימה:
1. שלחו בקשת HTTP/2 עם כותרת transfer-encoding: chunked
2. השרת החזיתי לא אמור לאפשר כותרת זו ב-HTTP/2, אבל אם הוא מעביר אותה - יש חולשה
3. הבריחו בקשה ל-/admin
רמז:
:method: POST
:path: /
:authority: <lab-url>
content-type: application/x-www-form-urlencoded
transfer-encoding: chunked
0
GET /admin HTTP/1.1
Host: <lab-url>
תרגיל 3 - הזרקת CRLF בכותרות HTTP/2 (Practitioner)¶
מעבדה: HTTP/2 request smuggling via CRLF injection
משימה:
1. השתמשו בהזרקת CRLF בכותרת HTTP/2 כדי להוסיף כותרת Transfer-Encoding
2. הכותרת תעבור ל-HTTP/1.1 בתרגום
3. הבריחו בקשה שתלכוד את ה-session של משתמש אחר
רמז: ב-Inspector של Burp, ערכו כותרת כך שהערך יכלול \r\nTransfer-Encoding: chunked:
תרגיל 4 - פיצול בקשות דרך CRLF (Practitioner)¶
מעבדה: HTTP/2 request splitting via CRLF injection
משימה:
1. הזריקו CRLF בכותרת פסאודו כדי לפצל את הבקשה לשתיים
2. הבקשה השנייה צריכה לפנות ל-/admin
3. לכדו את התגובה
רמז: הזריקו בגוף כותרת HTTP/2:
תרגיל 5 - הרעלת תור תגובות (Expert)¶
מעבדה: Response queue poisoning via H2.TE request smuggling
משימה:
1. השתמשו בהברחת H2.TE כדי לגרום ל-desync בתור התגובות
2. הבקשה המוברחת צריכה להיות בקשה מלאה שתקבל תגובה משלה
3. התגובה של הקורבן הבא תגיע אליכם, והתגובה שלכם תגיע לקורבן
4. לכדו טוקן session ומחקו את carlos
רמז: הבריחו בקשה מלאה (כולל כל הכותרות) כדי שהשרת יחזיר שתי תגובות לחיבור אחד - התגובה הראשונה תהיה לבקשה המוברחת, והשנייה תהיה התגובה שמיועדת לקורבן.
תרגיל 6 - h2c Smuggling (מתקדם - לא PortSwigger)¶
משימה עצמאית:
הקימו סביבת בדיקה מקומית עם nginx כ-reverse proxy ושרת Python מאחוריו:
# nginx.conf
server {
listen 80;
location / {
proxy_pass http://backend:8080;
# שים לב: proxy_set_header Upgrade לא מוגדר
}
location /admin {
return 403;
}
}
# backend.py
from http.server import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.end_headers()
self.wfile.write(f"Path: {self.path}".encode())
HTTPServer(('0.0.0.0', 8080), Handler).serve_forever()
- בדקו אם nginx מעביר את כותרת Upgrade: h2c
- נסו לבצע h2c smuggling עם הכלי h2csmuggler
- גשו ל-
/adminדרך חיבור h2c
תרגיל 7 - כתיבת סקריפט בדיקת HTTP/2¶
כתבו סקריפט Python שמבצע את הבדיקות הבאות:
#!/usr/bin/env python3
"""
כתבו סקריפט שבודק:
1. האם השרת תומך ב-HTTP/2
2. האם ניתן לשלוח Content-Length ב-HTTP/2
3. האם ניתן לשלוח Transfer-Encoding ב-HTTP/2
4. האם ניתן להזריק CRLF בכותרות HTTP/2
5. האם השרת מקבל שדרוג h2c
השתמשו בספרייה hyper או h2 של Python.
"""
משאבים נוספים¶
- PortSwigger Research - HTTP/2: The Sequel is Always Worse: https://portswigger.net/research/http2
- כלי h2csmuggler: https://github.com/BishopFox/h2csmuggler
- HTTP/2 RFC 7540: https://tools.ietf.org/html/rfc7540