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

HTTP/2 θεωρείται γενικά ανθεκτικό σε κλασικές τεχνικές request-smuggling επειδή το μήκος κάθε DATA frame είναι ρητό. Αυτή η προστασία εξαφανίζεται μόλις ένας front-end proxy “κατεβάσει” το αίτημα σε HTTP/1.x πριν το προωθήσει σε έναν back-end. Τη στιγμή που δύο διαφορετικοί αναλυτές (ο front-end HTTP/2 και ο back-end HTTP/1) προσπαθούν να συμφωνήσουν για το πού τελειώνει ένα αίτημα και πού αρχίζει το επόμενο, όλα τα παλιά tricks desync επιστρέφουν – συν μερικά νέα.


Γιατί συμβαίνουν οι υποβαθμίσεις

  1. Οι περιηγητές ήδη μιλούν HTTP/2, αλλά πολλές κληρονομημένες υποδομές προέλευσης κατανοούν μόνο HTTP/1.1.
  2. Οι αντίστροφοι proxies (CDNs, WAFs, load-balancers) επομένως τερματίζουν TLS + HTTP/2 στην άκρη και αναδιατυπώνουν κάθε αίτημα ως HTTP/1.1 για την προέλευση.
  3. Το βήμα μετάφρασης πρέπει να δημιουργήσει και τα δύο Content-Length και/ή Transfer-Encoding: chunked headers ώστε η προέλευση να μπορεί να προσδιορίσει το μήκος του σώματος.

Όποτε ο front-end εμπιστεύεται το μήκος του frame HTTP/2 αλλά ο back-end εμπιστεύεται CL ή TE, ένας επιτιθέμενος μπορεί να τους αναγκάσει να διαφωνήσουν.


Δύο κυρίαρχες κλάσεις πρωτογενών

VariantFront-end lengthBack-end lengthTypical payload
H2.TEHTTP/2 frameTransfer-Encoding: chunkedΕνσωματώστε ένα επιπλέον σώμα μηνύματος chunked του οποίου το τελικό 0\r\n\r\n δεν αποστέλλεται, έτσι ώστε ο back-end να περιμένει το “επόμενο” αίτημα που παρέχεται από τον επιτιθέμενο.
H2.CLHTTP/2 frameContent-LengthΣτείλτε ένα μικρότερο CL από το πραγματικό σώμα, έτσι ώστε ο back-end να διαβάσει πέρα από τα όρια στο επόμενο αίτημα.

Αυτά είναι πανομοιότυπα με τα κλασικά TE.CL / CL.TE, απλά με το HTTP/2 να αντικαθιστά έναν από τους αναλυτές.


Αναγνώριση μιας αλυσίδας υποβάθμισης

  1. Χρησιμοποιήστε ALPN σε μια χειραψία TLS (openssl s_client -alpn h2 -connect host:443) ή curl:
bash
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)

http
: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
  1. Το front-end διαβάζει ακριβώς 13 bytes (HELLO\r\n0\r\n\r\nGE), νομίζει ότι το αίτημα έχει τελειώσει και προωθεί τόσα στον προορισμό.
  2. Το back-end εμπιστεύεται την κεφαλίδα TE, συνεχίζει να διαβάζει μέχρι να δει το δεύτερο 0\r\n\r\n, καταναλώνοντας έτσι το πρόθεμα του δεύτερου αιτήματος του επιτιθέμενου (GET /admin …).
  3. Το υπόλοιπο (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 για την αυτοματοποίηση της επίθεσης αναβάθμισης σε καθαρό κείμενο:
bash
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.

Αμυντικά μέτρα

  1. End-to-end HTTP/2 – εξαλείψτε τη μετάφραση υποβάθμισης εντελώς.
  2. Μοναδική πηγή αλήθειας μήκους – κατά την υποβάθμιση, πάντα δημιουργήστε μια έγκυρη Content-Length και αφαιρέστε οποιεσδήποτε κεφαλίδες Content-Length/Transfer-Encoding που παρέχονται από τον χρήστη.
  3. Κανονικοποιήστε πριν από τη διαδρομή – εφαρμόστε την απολύμανση κεφαλίδων πριν από τη λογική δρομολόγησης/αναδιάρθρωσης.
  4. Απομόνωση σύνδεσης – μην επαναχρησιμοποιείτε τις TCP συνδέσεις back-end μεταξύ χρηστών; “ένα αίτημα ανά σύνδεση” καταστρέφει τις εκμεταλλεύσεις που βασίζονται σε ουρές.
  5. Αφαιρέστε το Upgrade εκτός αν είναι WebSocket – αποτρέπει τη σήραγγα h2c.

Αναφορές

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