Ειδικοί HTTP επικεφαλίδες
Reading time: 11 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Λίστες Λέξεων & Εργαλεία
- https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers
- https://github.com/rfc-st/humble
Επικεφαλίδες για Αλλαγή Τοποθεσίας
Αναδιατύπωση IP πηγής:
X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Forwarded: 127.0.0.1
Forwarded-For: 127.0.0.1
X-Forwarded-Host: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
X-Original-URL: 127.0.0.1
Client-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Host: 127.0.0.1
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)
Αναδιατύπωση τοποθεσίας:
X-Original-URL: /admin/console
X-Rewrite-URL: /admin/console
Επικεφαλίδες Hop-by-Hop
Μια επικεφαλίδα hop-by-hop είναι μια επικεφαλίδα που έχει σχεδιαστεί για να επεξεργάζεται και να καταναλώνεται από τον proxy που χειρίζεται την αίτηση, σε αντίθεση με μια επικεφαλίδα end-to-end.
Connection: close, X-Forwarded-For
HTTP Request Smuggling
Content-Length: 30
Transfer-Encoding: chunked
HTTP Request Smuggling / HTTP Desync Attack
Επικεφαλίδες Cache
Επικεφαλίδες Cache Διακομιστή:
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
Cache Poisoning and Cache Deception
Τοπικές επικεφαλίδες 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"
Συνθήκες
- Οι αιτήσεις που χρησιμοποιούν αυτές τις επικεφαλίδες:
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.
Αιτήσεις Εύρους
Accept-Ranges
: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το εύρος.Accept-Ranges: <range-unit>
Range
: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. Για παράδειγμα,Range:80-100
θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με κωδικό κατάστασης 206 Partial Content. Επίσης, θυμηθείτε να αφαιρέσετε την επικεφαλίδαAccept-Encoding
από την αίτηση.- Αυτό θα μπορούσε να είναι χρήσιμο για να αποκτήσετε μια απάντηση με αυθαίρετο κωδικό javascript που διαφορετικά θα μπορούσε να διαφύγει. Αλλά για να το εκμεταλλευτείτε αυτό θα χρειαστεί να εισάγετε αυτές τις επικεφαλίδες στην αίτηση.
If-Range
: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτρέψει τη λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου.Content-Range
: Υποδεικνύει πού σε ένα πλήρες μήνυμα σώματος ανήκει ένα μερικό μήνυμα.
Πληροφορίες σώματος μηνύματος
Content-Length
: Το μέγεθος του πόρου, σε δεκαδικούς αριθμούς bytes.Content-Type
: Υποδεικνύει τον τύπο μέσου του πόρουContent-Encoding
: Χρησιμοποιείται για να προσδιορίσει τον αλγόριθμο συμπίεσης.Content-Language
: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με την προτιμώμενη γλώσσα του.Content-Location
: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστρεφόμενα δεδομένα.
Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι προστατευμένος από έναν 401 ή 403 και μπορείτε να βρείτε κάποιο τρόπο να πάρετε αυτές τις πληροφορίες, αυτό θα μπορούσε να είναι ενδιαφέρον.
Για παράδειγμα, ένας συνδυασμός Range
και Etag
σε μια αίτηση HEAD μπορεί να διαρρεύσει το περιεχόμενο της σελίδας μέσω αιτήσεων HEAD:
- Μια αίτηση με την επικεφαλίδα
Range: bytes=20-20
και με μια απάντηση που περιέχειETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"
διαρρέει ότι το SHA1 του byte 20 είναιETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y
Πληροφορίες Διακομιστή
Server: Apache/2.4.1 (Unix)
X-Powered-By: PHP/5.3.3
Έλεγχοι
Allow
: Αυτή η επικεφαλίδα χρησιμοποιείται για να επικοινωνήσει τις HTTP μεθόδους που μπορεί να χειριστεί ένας πόρος. Για παράδειγμα, μπορεί να καθοριστεί ωςAllow: GET, POST, HEAD
, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους.Expect
: Χρησιμοποιείται από τον πελάτη για να μεταφέρει προσδοκίες που πρέπει να πληροί ο διακομιστής για να επεξεργαστεί επιτυχώς την αίτηση. Μια κοινή περίπτωση χρήσης περιλαμβάνει την επικεφαλίδαExpect: 100-continue
, η οποία σηματοδοτεί ότι ο πελάτης σκοπεύει να στείλει ένα μεγάλο φορτίο δεδομένων. Ο πελάτης αναζητά μια απάντηση100 (Continue)
πριν προχωρήσει με τη μετάδοση. Αυτός ο μηχανισμός βοηθά στη βελτιστοποίηση της χρήσης του δικτύου περιμένοντας επιβεβαίωση από τον διακομιστή.
Λήψεις
- Η
Content-Disposition
επικεφαλίδα στις HTTP απαντήσεις καθορίζει αν ένα αρχείο πρέπει να εμφανίζεται inline (μέσα στη σελίδα) ή να αντιμετωπίζεται ως συνημμένο (κατεβασμένο). Για παράδειγμα:
Content-Disposition: attachment; filename="filename.jpg"
Αυτό σημαίνει ότι το αρχείο με το όνομα "filename.jpg" προορίζεται να κατέβει και να αποθηκευτεί.
Security Headers
Content Security Policy (CSP)
Content Security Policy (CSP) Bypass
Trusted Types
Με την επιβολή των Trusted Types μέσω του CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Trusted Types διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με τις καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή.
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '<').replace(/>/g, '>');
});
}
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = "some string" // Throws an exception.
const escaped = policy.createHTML("<img src=x onerror=alert(1)>")
el.innerHTML = escaped // Results in safe assignment.
X-Content-Type-Options
Αυτή η κεφαλίδα αποτρέπει την ανίχνευση τύπου MIME, μια πρακτική που θα μπορούσε να οδηγήσει σε ευπάθειες XSS. Διασφαλίζει ότι οι περιηγητές σέβονται τους τύπους MIME που καθορίζονται από τον διακομιστή.
X-Content-Type-Options: nosniff
X-Frame-Options
Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε <frame>
, <iframe>
, <embed>
, ή <object>
tags, προτείνοντας σε όλα τα έγγραφα να καθορίζουν ρητά τις άδειες ενσωμάτωσής τους.
X-Frame-Options: DENY
Cross-Origin Resource Policy (CORP) και Cross-Origin Resource Sharing (CORS)
CORP είναι κρίσιμη για τον καθορισμό ποιες πόροι μπορούν να φορτωθούν από ιστοσελίδες, μετριάζοντας τις διαρροές μεταξύ ιστότοπων. CORS, από την άλλη πλευρά, επιτρέπει έναν πιο ευέλικτο μηχανισμό διαμοιρασμού πόρων μεταξύ διαφορετικών προελεύσεων, χαλαρώνοντας την πολιτική της ίδιας προέλευσης υπό ορισμένες συνθήκες.
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)
COEP και COOP είναι απαραίτητα για την ενεργοποίηση της διασυνοριακής απομόνωσης, μειώνοντας σημαντικά τον κίνδυνο επιθέσεων τύπου Spectre. Ελέγχουν τη φόρτωση διασυνοριακών πόρων και την αλληλεπίδραση με διασυνοριακά παράθυρα, αντίστοιχα.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
HTTP Strict Transport Security (HSTS)
Τέλος, το HSTS είναι μια λειτουργία ασφαλείας που αναγκάζει τους περιηγητές να επικοινωνούν με τους διακομιστές μόνο μέσω ασφαλών συνδέσεων HTTPS, ενισχύοντας έτσι την ιδιωτικότητα και την ασφάλεια.
Strict-Transport-Security: max-age=3153600
Header Name Casing Bypass
HTTP/1.1 ορίζει τα ονόματα πεδίων κεφαλίδας ως ευαίσθητα σε περίπτωση (RFC 9110 §5.1). Παρ' όλα αυτά, είναι πολύ συνηθισμένο να βρίσκουμε προσαρμοσμένο middleware, φίλτρα ασφαλείας ή επιχειρηματική λογική που συγκρίνουν το κυριολεκτικό όνομα κεφαλίδας που λαμβάνεται χωρίς να κανονικοποιούν πρώτα την περίπτωση (π.χ. header.equals("CamelExecCommandExecutable")
). Αν αυτές οι έλεγχοι εκτελούνται ευαίσθητα σε περίπτωση, ένας επιτιθέμενος μπορεί να τους παρακάμψει απλά στέλνοντας την ίδια κεφαλίδα με διαφορετική κεφαλαιοποίηση.
Τυπικές καταστάσεις όπου εμφανίζεται αυτό το λάθος:
- Προσαρμοσμένες λίστες επιτρεπόμενων/απαγορευμένων που προσπαθούν να μπλοκάρουν "επικίνδυνες" εσωτερικές κεφαλίδες πριν η αίτηση φτάσει σε ένα ευαίσθητο συστατικό.
- Εσωτερικές υλοποιήσεις ψευδοκεφαλίδων reverse-proxy (π.χ. απολύμανση
X-Forwarded-For
). - Πλαίσια που εκθέτουν διαχειριστικά / αποσφαλμάτωσης endpoints και βασίζονται σε ονόματα κεφαλίδων για αυθεντικοποίηση ή επιλογή εντολών.
Abusing the bypass
- Εντοπίστε μια κεφαλίδα που φιλτράρεται ή επικυρώνεται από την πλευρά του διακομιστή (για παράδειγμα, διαβάζοντας τον πηγαίο κώδικα, την τεκμηρίωση ή τα μηνύματα σφάλματος).
- Στείλτε την ίδια κεφαλίδα με διαφορετική περίπτωση (μικτή ή κεφαλαία). Δεδομένου ότι οι στοίβες HTTP συνήθως κανονικοποιούν τις κεφαλίδες μόνο μετά την εκτέλεση του κώδικα χρήστη, ο ευάλωτος έλεγχος μπορεί να παρακαμφθεί.
- Αν το downstream συστατικό αντιμετωπίζει τις κεφαλίδες με τρόπο ευαίσθητο σε περίπτωση (οι περισσότερες το κάνουν), θα αποδεχτεί την τιμή που ελέγχεται από τον επιτιθέμενο.
Example: Apache Camel exec
RCE (CVE-2025-27636)
Σε ευάλωτες εκδόσεις του Apache Camel οι διαδρομές Command Center προσπαθούν να μπλοκάρουν μη αξιόπιστες αιτήσεις αφαιρώντας τις κεφαλίδες CamelExecCommandExecutable
και CamelExecCommandArgs
. Η σύγκριση έγινε με equals()
οπότε μόνο τα ακριβή ονόματα με πεζά γράμματα αφαιρέθηκαν.
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"
Οι κεφαλίδες φτάνουν στο exec
συστατικό χωρίς φιλτράρισμα, με αποτέλεσμα την απομακρυσμένη εκτέλεση εντολών με τα δικαιώματα της διαδικασίας Camel.
Ανίχνευση & Μετριασμός
- Κανονικοποιήστε όλα τα ονόματα κεφαλίδων σε μία μόνο περίπτωση (συνήθως πεζά) πριν από την εκτέλεση συγκρίσεων επιτρεπόμενων/απαγορευμένων.
- Απορρίψτε ύποπτες διπλοτυπίες: αν είναι παρούσες και οι δύο
Header:
καιHeAdEr:
, αντιμετωπίστε το ως ανωμαλία. - Χρησιμοποιήστε μια θετική λίστα επιτρεπόμενων που επιβάλλεται μετά την κανονικοποίηση.
- Προστατέψτε τα σημεία διαχείρισης με αυθεντικοποίηση και δικτυακή τμηματοποίηση.
Αναφορές
- CVE-2025-27636 – RCE in Apache Camel via header casing bypass (OffSec blog)
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
- https://web.dev/security-headers/
- https://web.dev/articles/security-headers
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.