תקיפות 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:
תרגיל 4 - פיצול בקשות דרך CRLF (Practitioner)¶
מעבדה: HTTP/2 request splitting via CRLF injection
משימה:
1. הזריקו CRLF בheader פסאודו כדי לפצל את הבקשה לשתיים
2. הבקשה השנייה צריכה לפנות ל-/admin
3. לכדו את התגובה
רמז: הזריקו בגוף header HTTP/2:
תרגיל 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()
- בדקו אם nginx מעביר את header Upgrade: h2c
- נסו לבצע h2c smuggling עם הכלי h2csmuggler
- גשו ל-
/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