Request Smuggling in HTTP/2 Downgrades
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HTTP/2 θεωρείται γενικά ανθεκτικό σε κλασικές τεχνικές request-smuggling επειδή το μήκος κάθε DATA frame είναι ρητό. Αυτή η προστασία εξαφανίζεται μόλις ένας front-end proxy “κατεβάσει” το αίτημα σε HTTP/1.x πριν το προωθήσει σε έναν back-end. Τη στιγμή που δύο διαφορετικοί αναλυτές (ο front-end HTTP/2 και ο back-end HTTP/1) προσπαθούν να συμφωνήσουν για το πού τελειώνει ένα αίτημα και πού αρχίζει το επόμενο, όλα τα παλιά tricks desync επιστρέφουν – συν μερικά νέα.
Γιατί συμβαίνουν οι υποβαθμίσεις
- Οι περιηγητές ήδη μιλούν HTTP/2, αλλά πολλές κληρονομημένες υποδομές προέλευσης κατανοούν μόνο HTTP/1.1.
- Οι αντίστροφοι proxies (CDNs, WAFs, load-balancers) επομένως τερματίζουν TLS + HTTP/2 στην άκρη και αναδιατυπώνουν κάθε αίτημα ως HTTP/1.1 για την προέλευση.
- Το βήμα μετάφρασης πρέπει να δημιουργήσει και τα δύο
Content-Length
και/ήTransfer-Encoding: chunked
headers ώστε η προέλευση να μπορεί να προσδιορίσει το μήκος του σώματος.
Όποτε ο front-end εμπιστεύεται το μήκος του frame HTTP/2 αλλά ο back-end εμπιστεύεται CL ή TE, ένας επιτιθέμενος μπορεί να τους αναγκάσει να διαφωνήσουν.
Δύο κυρίαρχες κλάσεις πρωτογενών
Variant | Front-end length | Back-end length | Typical payload |
---|---|---|---|
H2.TE | HTTP/2 frame | Transfer-Encoding: chunked | Ενσωματώστε ένα επιπλέον σώμα μηνύματος chunked του οποίου το τελικό 0\r\n\r\n δεν αποστέλλεται, έτσι ώστε ο back-end να περιμένει το “επόμενο” αίτημα που παρέχεται από τον επιτιθέμενο. |
H2.CL | HTTP/2 frame | Content-Length | Στείλτε ένα μικρότερο CL από το πραγματικό σώμα, έτσι ώστε ο back-end να διαβάσει πέρα από τα όρια στο επόμενο αίτημα. |
Αυτά είναι πανομοιότυπα με τα κλασικά TE.CL / CL.TE, απλά με το HTTP/2 να αντικαθιστά έναν από τους αναλυτές.
Αναγνώριση μιας αλυσίδας υποβάθμισης
- Χρησιμοποιήστε ALPN σε μια χειραψία TLS (
openssl s_client -alpn h2 -connect host:443
) ή curl:
curl -v --http2 https://target
Αν εμφανιστεί * Using HTTP2
, η άκρη μιλάει H2.
2. Στείλτε ένα σκόπιμα κακοδιαμορφωμένο αίτημα CL/TE πάνω από HTTP/2 (το Burp Repeater έχει τώρα ένα αναπτυσσόμενο μενού για να αναγκάσει το HTTP/2). Αν η απάντηση είναι ένα σφάλμα HTTP/1.1 όπως 400 Bad chunk
, έχετε απόδειξη ότι η άκρη μετέτρεψε την κίνηση για έναν αναλυτή HTTP/1 downstream.
Ροή εκμετάλλευσης (παράδειγμα H2.TE)
:method: POST
:path: /login
:scheme: https
:authority: example.com
content-length: 13 # ignored by the edge
transfer-encoding: chunked
5;ext=1\r\nHELLO\r\n
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
- Το front-end διαβάζει ακριβώς 13 bytes (
HELLO\r\n0\r\n\r\nGE
), νομίζει ότι το αίτημα έχει τελειώσει και προωθεί τόσα στον προορισμό. - Το back-end εμπιστεύεται την κεφαλίδα TE, συνεχίζει να διαβάζει μέχρι να δει το δεύτερο
0\r\n\r\n
, καταναλώνοντας έτσι το πρόθεμα του δεύτερου αιτήματος του επιτιθέμενου (GET /admin …
). - Το υπόλοιπο (
GET /admin …
) αντιμετωπίζεται ως νέο αίτημα που έχει προγραμματιστεί πίσω από του θύματος.
Αντικαταστήστε το λαθραίο αίτημα με:
POST /api/logout
για να αναγκάσετε την αποτυχία συνεδρίαςGET /users/1234
για να κλέψετε έναν πόρο συγκεκριμένο για το θύμα
h2c smuggling (αναβαθμίσεις σε καθαρό κείμενο)
Μια μελέτη του 2023 έδειξε ότι αν ένα front-end περάσει την κεφαλίδα HTTP/1.1 Upgrade: h2c
σε ένα back-end που υποστηρίζει καθαρό κείμενο HTTP/2, ένας επιτιθέμενος μπορεί να στείλει ακατέργαστα HTTP/2 frames μέσω μιας άκρης που επικυρώνει μόνο το HTTP/1.1. Αυτό παρακάμπτει την κανονικοποίηση κεφαλίδων, τους κανόνες WAF και ακόμη και την τερματισμό TLS.
Βασικές απαιτήσεις:
- Η άκρη προωθεί και τις δύο
Connection: Upgrade
καιUpgrade: h2c
χωρίς αλλαγές. - Ο προορισμός αυξάνει σε HTTP/2 και διατηρεί τη σημασιολογία επαναχρησιμοποίησης σύνδεσης που επιτρέπει την προγραμματισμένη ουρά αιτημάτων.
Η μείωση είναι απλή – αφαιρέστε ή σκληροκωδικοποιήστε την κεφαλίδα Upgrade
στην άκρη εκτός από τα WebSockets.
Σημαντικά πραγματικά CVEs (2022-2025)
- CVE-2023-25690 – Οι κανόνες αναδιάρθρωσης mod_proxy του Apache HTTP Server θα μπορούσαν να αλυσοδεθούν για διαχωρισμό και λαθραία αιτήματα. (διορθώθηκε στην 2.4.56)
- CVE-2023-25950 – HAProxy 2.7/2.6 λαθραία αιτήματα/απαντήσεις όταν ο αναλυτής HTX χειριζόταν λανθασμένα τις αιτήσεις σε σωλήνα.
- CVE-2022-41721 – Ο Go
MaxBytesHandler
προκάλεσε την ανάλυση των υπολειπόμενων bytes σώματος ως HTTP/2 frames, επιτρέποντας τη διασυνοριακή λαθραία μεταφορά.
Εργαλεία
- Burp Request Smuggler – από την έκδοση v1.26, δοκιμάζει αυτόματα την υποστήριξη H2.TE/H2.CL και κρυφών ALPN. Ενεργοποιήστε την “HTTP/2 probing” στις επιλογές της επέκτασης.
- h2cSmuggler – Python PoC από τον Bishop Fox για την αυτοματοποίηση της επίθεσης αναβάθμισης σε καθαρό κείμενο:
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
- curl/
hyper
– δημιουργία χειροκίνητων payloads:curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target
.
Αμυντικά μέτρα
- End-to-end HTTP/2 – εξαλείψτε τη μετάφραση υποβάθμισης εντελώς.
- Μοναδική πηγή αλήθειας μήκους – κατά την υποβάθμιση, πάντα δημιουργήστε μια έγκυρη
Content-Length
και αφαιρέστε οποιεσδήποτε κεφαλίδεςContent-Length
/Transfer-Encoding
που παρέχονται από τον χρήστη. - Κανονικοποιήστε πριν από τη διαδρομή – εφαρμόστε την απολύμανση κεφαλίδων πριν από τη λογική δρομολόγησης/αναδιάρθρωσης.
- Απομόνωση σύνδεσης – μην επαναχρησιμοποιείτε τις TCP συνδέσεις back-end μεταξύ χρηστών; “ένα αίτημα ανά σύνδεση” καταστρέφει τις εκμεταλλεύσεις που βασίζονται σε ουρές.
- Αφαιρέστε το
Upgrade
εκτός αν είναι WebSocket – αποτρέπει τη σήραγγα h2c.
Αναφορές
- PortSwigger Research – “HTTP/2: The Sequel is Always Worse” https://portswigger.net/research/http2
- Bishop Fox – “h2c Smuggling: request smuggling via HTTP/2 clear-text” https://bishopfox.com/blog/h2c-smuggling-request
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.