From 8e596a4b9f0f395aaf652f8053cb03924ba8df13 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 5 Sep 2025 11:20:52 +0000 Subject: [PATCH] Translated ['src/pentesting-web/http-request-smuggling/README.md', 'src/ --- .../pentesting-web/special-http-headers.md | 160 ++++--- .../http-request-smuggling/README.md | 394 ++++++++++-------- theme/sponsor.js | 3 +- 3 files changed, 315 insertions(+), 242 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index b78caf200..88df83058 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -1,15 +1,15 @@ -# Ειδικοί HTTP επικεφαλίδες +# Ειδικές HTTP κεφαλίδες {{#include ../../banners/hacktricks-training.md}} -## Λίστες Λέξεων & Εργαλεία +## Λίστες λέξεων & Εργαλεία - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) -## Επικεφαλίδες για Αλλαγή Τοποθεσίας +## Επικεφαλίδες για αλλαγή τοποθεσίας -Αναδιατύπωση **IP πηγής**: +Αντικατάσταση **πηγής IP**: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -26,19 +26,20 @@ - `True-Client-IP: 127.0.0.1` - `Cluster-Client-IP: 127.0.0.1` - `Via: 1.0 fred, 1.1 127.0.0.1` -- `Connection: close, X-Forwarded-For` (Ελέγξτε τις επικεφαλίδες hop-by-hop) +- `Connection: close, X-Forwarded-For` (Έλεγχος hop-by-hop κεφαλίδων) -Αναδιατύπωση **τοποθεσίας**: +Αλλαγή **τοποθεσίας**: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## Επικεφαλίδες Hop-by-Hop +## Hop-by-Hop κεφαλίδες -Μια επικεφαλίδα hop-by-hop είναι μια επικεφαλίδα που έχει σχεδιαστεί για να επεξεργάζεται και να καταναλώνεται από τον proxy που χειρίζεται την αίτηση, σε αντίθεση με μια επικεφαλίδα end-to-end. +Μια hop-by-hop κεφαλίδα είναι μια κεφαλίδα που προορίζεται να επεξεργαστεί και να καταναλωθεί από το proxy που χειρίζεται τη συγκεκριμένη αίτηση, σε αντίθεση με μια end-to-end κεφαλίδα. - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} @@ -48,78 +49,98 @@ - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} -## Επικεφαλίδες Cache +## Η κεφαλίδα Expect -**Επικεφαλίδες Cache Διακομιστή**: +Είναι δυνατόν ο client να στείλει την κεφαλίδα `Expect: 100-continue` και τότε ο server να απαντήσει με `HTTP/1.1 100 Continue` ώστε ο client να συνεχίσει την αποστολή του σώματος του αιτήματος. Ωστόσο, κάποια proxies δεν χειρίζονται σωστά αυτήν την κεφαλίδα. + +Ενδιαφέροντα αποτελέσματα του `Expect: 100-continue`: +- Αποστολή ενός HEAD αιτήματος με σώμα — ο server δεν έλαβε υπόψη ότι τα HEAD αιτήματα δεν έχουν σώμα και κράτησε τη σύνδεση ανοιχτή μέχρι να λήξει ο χρόνος αναμονής. +- Άλλοι servers επέστρεψαν περίεργα δεδομένα: τυχαία δεδομένα διαβασμένα από το socket στην απάντηση, μυστικά κλειδιά ή ακόμα επέτρεψαν στο front-end να μην αφαιρέσει τιμές κεφαλίδων. +- Προκάλεσε επίσης ένα `0.CL` desync επειδή το backend απάντησε με 400 αντί για 100, αλλά το proxy front-end ήταν έτοιμο να στείλει το σώμα του αρχικού αιτήματος, οπότε το έστειλε και το backend το θεώρησε ως νέο αίτημα. +- Η αποστολή μιας παραλλαγής `Expect: y 100-continue` προκάλεσε επίσης το `0.CL` desync. +- Ένα παρόμοιο σφάλμα όπου το backend απάντησε με 404 δημιούργησε `CL.0` desync επειδή το κακόβουλο αίτημα υποδεικνύει `Content-Length`, έτσι το backend στέλνει το κακόβουλο αίτημα + τα `Content-Length` bytes του επόμενου αιτήματος (ένος θύματος). Αυτό αποσυντονίζει την ουρά επειδή το backend στέλνει την απάντηση 404 για το κακόβουλο αίτημα + την απάντηση του θύματος, αλλά το front-end νόμιζε ότι εστάλη μόνο 1 αίτημα, οπότε η δεύτερη απάντηση πηγαίνει σε δεύτερο θύμα κ.ο.κ. + +Για περισσότερες πληροφορίες σχετικά με HTTP Request Smuggling δείτε: + +{{#ref}} +../../pentesting-web/http-request-smuggling/ +{{#endref}} + + +## Cache κεφαλίδες + +**Server Cache Headers**: + +- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν το αίτημα δεν ήταν cached και την τιμή **`hit`** όταν ήταν cached +- Παρόμοια συμπεριφορά στην κεφαλίδα **`Cf-Cache-Status`** +- **`Cache-Control`** υποδεικνύει αν ένας πόρος γίνεται cache και πότε θα επανελεγχθεί: `Cache-Control: public, max-age=1800` +- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει επιπλέον κεφαλίδες** που θεωρούνται **μέρος του cache key** ακόμη και αν κανονικά δεν είναι keyed. +- **`Age`** ορίζει σε δευτερόλεπτα πόσο καιρό το αντικείμενο βρίσκεται στο proxy cache. +- **`Server-Timing: cdn-cache; desc=HIT`** επίσης δείχνει ότι ένας πόρος ήταν cached -- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν η αίτηση δεν έχει αποθηκευτεί στην cache και την τιμή **`hit`** όταν είναι αποθηκευμένη -- Παρόμοια συμπεριφορά στην επικεφαλίδα **`Cf-Cache-Status`** -- **`Cache-Control`** υποδεικνύει αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800` -- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει επιπλέον επικεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες. -- **`Age`** ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy. -- **`Server-Timing: cdn-cache; desc=HIT`** υποδεικνύει επίσης ότι ένας πόρος έχει αποθηκευτεί στην cache {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} -**Τοπικές επικεφαλίδες Cache**: +**Τοπικές κεφαλίδες cache**: -- `Clear-Site-Data`: Επικεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"` -- `Expires`: Περιέχει ημερομηνία/ώρα όταν η απάντηση πρέπει να λήξει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` -- `Pragma: no-cache` το ίδιο με `Cache-Control: no-cache` -- `Warning`: Η **`Warning`** γενική HTTP επικεφαλίδα περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία `Warning` επικεφαλίδες μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Clear-Site-Data`: Κεφαλίδα για να υποδείξει ποιο cache πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Περιέχει ημερομηνία/ώρα πότε η απάντηση λήγει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Pragma: no-cache` ίδιο με `Cache-Control: no-cache` +- `Warning`: Η γενική HTTP κεφαλίδα **`Warning`** περιέχει πληροφορίες σχετικά με πιθανά προβλήματα στην κατάσταση του μηνύματος. Μπορεί να εμφανιστούν περισσότερες από μία κεφαλίδες `Warning` στην απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"` -## Συνθήκες +## Conditionals -- Οι αιτήσεις που χρησιμοποιούν αυτές τις επικεφαλίδες: **`If-Modified-Since`** και **`If-Unmodified-Since`** θα απαντηθούν με δεδομένα μόνο αν η επικεφαλίδα απάντησης **`Last-Modified`** περιέχει διαφορετική ώρα. -- Οι συνθήκες αιτήσεων που χρησιμοποιούν **`If-Match`** και **`If-None-Match`** χρησιμοποιούν μια τιμή Etag ώστε ο διακομιστής ιστού να στείλει το περιεχόμενο της απάντησης αν τα δεδομένα (Etag) έχουν αλλάξει. Το `Etag` λαμβάνεται από την HTTP απάντηση. -- Η τιμή **Etag** υπολογίζεται συνήθως **βάσει** του **περιεχομένου** της απάντησης. Για παράδειγμα, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` υποδεικνύει ότι το `Etag` είναι το **Sha1** των **37 bytes**. +- Τα αιτήματα που χρησιμοποιούν αυτές τις κεφαλίδες: **`If-Modified-Since`** και **`If-Unmodified-Since`** θα απαντηθούν με δεδομένα μόνο αν η κεφαλίδα απόκρισης **`Last-Modified`** περιέχει διαφορετικό χρόνο. +- Τα conditional αιτήματα που χρησιμοποιούν **`If-Match`** και **`If-None-Match`** χρησιμοποιούν μια τιμή ETag ώστε ο web server να στείλει το περιεχόμενο της απάντησης αν τα δεδομένα (Etag) έχουν αλλάξει. Το `Etag` προέρχεται από την HTTP απάντηση. +- Η τιμή **Etag** συνήθως **υπολογίζεται βάσει** του **περιεχομένου** της απάντησης. Για παράδειγμα, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` υποδεικνύει ότι το `Etag` είναι το **Sha1** των **37 bytes**. -## Αιτήσεις Εύρους +## Range requests -- **`Accept-Ranges`**: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το εύρος. `Accept-Ranges: ` -- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. Για παράδειγμα, `Range:80-100` θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με κωδικό κατάστασης 206 Partial Content. Επίσης, θυμηθείτε να αφαιρέσετε την επικεφαλίδα `Accept-Encoding` από την αίτηση. -- Αυτό θα μπορούσε να είναι χρήσιμο για να αποκτήσετε μια απάντηση με αυθαίρετο κωδικό javascript που διαφορετικά θα μπορούσε να διαφύγει. Αλλά για να το εκμεταλλευτείτε αυτό θα χρειαστεί να εισάγετε αυτές τις επικεφαλίδες στην αίτηση. -- **`If-Range`**: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτρέψει τη λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου. -- **`Content-Range`**: Υποδεικνύει πού σε ένα πλήρες μήνυμα σώματος ανήκει ένα μερικό μήνυμα. +- **`Accept-Ranges`**: Υποδεικνύει αν ο server υποστηρίζει range requests, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το range. `Accept-Ranges: ` +- **`Range`**: Υποδεικνύει το τμήμα ενός εγγράφου που ο server πρέπει να επιστρέψει. Για παράδειγμα, `Range:80-100` θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με status code 206 Partial Content. Επίσης θυμηθείτε να αφαιρέσετε την κεφαλίδα `Accept-Encoding` από το αίτημα. +- Αυτό μπορεί να είναι χρήσιμο για να πάρει μια response με αυθαίρετο reflected javascript code που αλλιώς θα γινόταν escape. Αλλά για να το εκμεταλλευτείτε θα χρειαστεί να inject αυτές τις κεφαλίδες στο αίτημα. +- **`If-Range`**: Δημιουργεί ένα conditional range request που εκπληρώνεται μόνο αν το δοσμένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτρέψει το κατέβασμα δύο ranges από ασύμβατες εκδόσεις του πόρου. +- **`Content-Range`**: Υποδεικνύει σε ποιο μέρος ενός πλήρους σώματος ανήκει ένα μερικό μήνυμα. ## Πληροφορίες σώματος μηνύματος -- **`Content-Length`:** Το μέγεθος του πόρου, σε δεκαδικούς αριθμούς bytes. -- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου του πόρου -- **`Content-Encoding`**: Χρησιμοποιείται για να προσδιορίσει τον αλγόριθμο συμπίεσης. -- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με την προτιμώμενη γλώσσα του. -- **`Content-Location`**: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστρεφόμενα δεδομένα. +- **`Content-Length`:** Το μέγεθος του πόρου, σε δεκαδικά bytes. +- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου (media type) του πόρου +- **`Content-Encoding`**: Χρησιμοποιείται για να καθορίσει τον αλγόριθμο συμπίεσης. +- **`Content-Language`**: Περιγράφει τη γλώσσα/γλώσσες για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί ανάλογα με την προτιμώμενη γλώσσα του. +- **`Content-Location`**: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστραφέντα δεδομένα. -Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι **προστατευμένος** από έναν 401 ή 403 και μπορείτε να βρείτε κάποιο **τρόπο** να **πάρετε** αυτές τις **πληροφορίες**, αυτό θα μπορούσε να είναι **ενδιαφέρον.**\ -Για παράδειγμα, ένας συνδυασμός **`Range`** και **`Etag`** σε μια αίτηση HEAD μπορεί να διαρρεύσει το περιεχόμενο της σελίδας μέσω αιτήσεων HEAD: +Από την σκοπιά ενός pentest αυτή η πληροφορία συνήθως είναι "άχρηστη", αλλά αν ο πόρος είναι **protected** από ένα 401 ή 403 και μπορέσετε να βρείτε κάποιον **τρόπο** να **get** αυτές τις **info**, αυτό μπορεί να είναι **interesting.**\ +Για παράδειγμα, ένας συνδυασμός `Range` και `Etag` σε ένα HEAD request μπορεί να leak το περιεχόμενο της σελίδας μέσω HEAD requests: -- Μια αίτηση με την επικεφαλίδα `Range: bytes=20-20` και με μια απάντηση που περιέχει `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` διαρρέει ότι το SHA1 του byte 20 είναι `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` +- Ένα αίτημα με την κεφαλίδα `Range: bytes=20-20` και με μια απάντηση που περιέχει `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` leak ότι το SHA1 του byte 20 είναι `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` -## Πληροφορίες Διακομιστή +## Πληροφορίες Server - `Server: Apache/2.4.1 (Unix)` - `X-Powered-By: PHP/5.3.3` -## Έλεγχοι +## Controls -- **`Allow`**: Αυτή η επικεφαλίδα χρησιμοποιείται για να επικοινωνήσει τις HTTP μεθόδους που μπορεί να χειριστεί ένας πόρος. Για παράδειγμα, μπορεί να καθοριστεί ως `Allow: GET, POST, HEAD`, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους. -- **`Expect`**: Χρησιμοποιείται από τον πελάτη για να μεταφέρει προσδοκίες που πρέπει να πληροί ο διακομιστής για να επεξεργαστεί επιτυχώς την αίτηση. Μια κοινή περίπτωση χρήσης περιλαμβάνει την επικεφαλίδα `Expect: 100-continue`, η οποία σηματοδοτεί ότι ο πελάτης σκοπεύει να στείλει ένα μεγάλο φορτίο δεδομένων. Ο πελάτης αναζητά μια απάντηση `100 (Continue)` πριν προχωρήσει με τη μετάδοση. Αυτός ο μηχανισμός βοηθά στη βελτιστοποίηση της χρήσης του δικτύου περιμένοντας επιβεβαίωση από τον διακομιστή. +- **`Allow`**: Αυτή η κεφαλίδα χρησιμοποιείται για να επικοινωνήσει ποιες HTTP μέθοδοι μπορεί να χειριστεί ένας πόρος. Για παράδειγμα, μπορεί να οριστεί ως `Allow: GET, POST, HEAD`, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους. +- **`Expect`**: Χρησιμοποιείται από τον client για να μεταφέρει προσδοκίες που ο server πρέπει να ικανοποιήσει ώστε το αίτημα να επεξεργαστεί επιτυχώς. Μια κοινή χρήση είναι η κεφαλίδα `Expect: 100-continue`, η οποία σηματοδοτεί ότι ο client σκοπεύει να στείλει μεγάλο payload δεδομένων. Ο client περιμένει μια απάντηση `100 (Continue)` πριν προχωρήσει στην αποστολή. Αυτό βοηθά στην βελτιστοποίηση της χρήσης του δικτύου περιμένοντας επιβεβαίωση από τον server. ## Λήψεις -- Η **`Content-Disposition`** επικεφαλίδα στις HTTP απαντήσεις καθορίζει αν ένα αρχείο πρέπει να εμφανίζεται **inline** (μέσα στη σελίδα) ή να αντιμετωπίζεται ως **συνημμένο** (κατεβασμένο). Για παράδειγμα: +- Η κεφαλίδα `Content-Disposition` στις HTTP απαντήσεις καθορίζει εάν ένα αρχείο πρέπει να προβάλλεται inline (εντός της ιστοσελίδας) ή να αντιμετωπίζεται ως attachment (να γίνει λήψη). Για παράδειγμα: ``` Content-Disposition: attachment; filename="filename.jpg" ``` -Αυτό σημαίνει ότι το αρχείο με το όνομα "filename.jpg" προορίζεται να κατέβει και να αποθηκευτεί. +Αυτό σημαίνει ότι το αρχείο με όνομα "filename.jpg" προορίζεται να ληφθεί και να αποθηκευτεί. -## Security Headers +## Κεφαλίδες ασφάλειας ### Content Security Policy (CSP) @@ -130,7 +151,7 @@ Content-Disposition: attachment; filename="filename.jpg" ### **Trusted Types** -Με την επιβολή των Trusted Types μέσω του CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Trusted Types διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με τις καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή. +Με την επιβολή των Trusted Types μέσω του CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Trusted Types εξασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, συμβατά με καθιερωμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, προστατεύοντας έτσι τον κώδικα JavaScript από προεπιλογή. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -149,70 +170,71 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -Αυτή η κεφαλίδα αποτρέπει την ανίχνευση τύπου MIME, μια πρακτική που θα μπορούσε να οδηγήσει σε ευπάθειες XSS. Διασφαλίζει ότι οι περιηγητές σέβονται τους τύπους MIME που καθορίζονται από τον διακομιστή. +Αυτό το header αποτρέπει την ανίχνευση τύπου MIME, μια πρακτική που μπορεί να οδηγήσει σε ευπάθειες XSS. Εξασφαλίζει ότι οι περιηγητές σέβονται τους τύπους MIME που καθορίζονται από τον server. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε ``, `