Ειδικές HTTP κεφαλίδες
Reading time: 12 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
Η κεφαλίδα Expect
Είναι δυνατόν ο 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 δείτε:
HTTP Request Smuggling / HTTP Desync Attack
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
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
: Η γενική HTTP κεφαλίδαWarning
περιέχει πληροφορίες σχετικά με πιθανά προβλήματα στην κατάσταση του μηνύματος. Μπορεί να εμφανιστούν περισσότερες από μία κεφαλίδεςWarning
στην απάντηση.Warning: 110 anderson/1.3.37 "Response is stale"
Conditionals
- Τα αιτήματα που χρησιμοποιούν αυτές τις κεφαλίδες:
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
: Υποδεικνύει αν ο server υποστηρίζει range requests, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το range.Accept-Ranges: <range-unit>
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
: Υποδεικνύει τον τύπο μέσου (media type) του πόρουContent-Encoding
: Χρησιμοποιείται για να καθορίσει τον αλγόριθμο συμπίεσης.Content-Language
: Περιγράφει τη γλώσσα/γλώσσες για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί ανάλογα με την προτιμώμενη γλώσσα του.Content-Location
: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστραφέντα δεδομένα.
Από την σκοπιά ενός pentest αυτή η πληροφορία συνήθως είναι "άχρηστη", αλλά αν ο πόρος είναι protected από ένα 401 ή 403 και μπορέσετε να βρείτε κάποιον τρόπο να get αυτές τις info, αυτό μπορεί να είναι interesting.
Για παράδειγμα, ένας συνδυασμός Range
και Etag
σε ένα HEAD request μπορεί να leak το περιεχόμενο της σελίδας μέσω HEAD requests:
- Ένα αίτημα με την κεφαλίδα
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
: Χρησιμοποιείται από τον client για να μεταφέρει προσδοκίες που ο server πρέπει να ικανοποιήσει ώστε το αίτημα να επεξεργαστεί επιτυχώς. Μια κοινή χρήση είναι η κεφαλίδαExpect: 100-continue
, η οποία σηματοδοτεί ότι ο client σκοπεύει να στείλει μεγάλο payload δεδομένων. Ο client περιμένει μια απάντηση100 (Continue)
πριν προχωρήσει στην αποστολή. Αυτό βοηθά στην βελτιστοποίηση της χρήσης του δικτύου περιμένοντας επιβεβαίωση από τον server.
Λήψεις
- Η κεφαλίδα
Content-Disposition
στις HTTP απαντήσεις καθορίζει εάν ένα αρχείο πρέπει να προβάλλεται inline (εντός της ιστοσελίδας) ή να αντιμετωπίζεται ως attachment (να γίνει λήψη). Για παράδειγμα:
Content-Disposition: attachment; filename="filename.jpg"
Αυτό σημαίνει ότι το αρχείο με όνομα "filename.jpg" προορίζεται να ληφθεί και να αποθηκευτεί.
Κεφαλίδες ασφάλειας
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
Αυτό το header αποτρέπει την ανίχνευση τύπου MIME, μια πρακτική που μπορεί να οδηγήσει σε ευπάθειες XSS. Εξασφαλίζει ότι οι περιηγητές σέβονται τους τύπους MIME που καθορίζονται από τον server.
X-Content-Type-Options: nosniff
X-Frame-Options
Για την αντιμετώπιση του clickjacking, αυτή η κεφαλίδα περιορίζει τον τρόπο με τον οποίο τα έγγραφα μπορούν να ενσωματωθούν σε <frame>
, <iframe>
, <embed>
ή <object>
ετικέτες, προτείνοντας σε όλα τα έγγραφα να καθορίζουν ρητά τα δικαιώματα ενσωμάτωσής τους.
X-Frame-Options: DENY
Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)
Το CORP είναι κρίσιμο για τον καθορισμό των πόρων που μπορούν να φορτωθούν από ιστοσελίδες, μειώνοντας τα cross-site leaks. Αντίθετα, το CORS επιτρέπει έναν πιο ευέλικτο μηχανισμό cross-origin resource sharing, χαλαρώνοντας τη same-origin policy υπό ορισμένες προϋποθέσεις.
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
Cross-Origin Embedder Policy (COEP) και Cross-Origin Opener Policy (COOP)
COEP και COOP είναι απαραίτητα για την ενεργοποίηση του cross-origin isolation, μειώνοντας σημαντικά τον κίνδυνο επιθέσεων τύπου Spectre. Ελέγχουν, αντίστοιχα, τη φόρτωση πόρων cross-origin και την αλληλεπίδραση με παράθυρα cross-origin.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
HTTP Strict Transport Security (HSTS)
Τέλος, το HSTS είναι μια λειτουργία ασφαλείας που αναγκάζει τους browsers να επικοινωνούν με τους servers μόνο μέσω ασφαλών συνδέσεων HTTPS, ενισχύοντας έτσι το απόρρητο και την ασφάλεια.
Strict-Transport-Security: max-age=3153600
Header Name Casing Bypass
HTTP/1.1 ορίζει τα ονόματα πεδίων κεφαλίδας ως χωρίς διάκριση πεζών/κεφαλαίων (RFC 9110 §5.1). Παρ' όλα αυτά, είναι πολύ συνηθισμένο να βρίσκονται προσαρμοσμένα middleware, φίλτρα ασφαλείας ή επιχειρησιακή λογική που συγκρίνουν το κυριολεκτικό όνομα της κεφαλίδας όπως λήφθηκε χωρίς πρώτα να κανονικοποιήσουν την περίπτωση των χαρακτήρων (π.χ. header.equals("CamelExecCommandExecutable")
). Εάν αυτοί οι έλεγχοι γίνονται με διάκριση πεζών/κεφαλαίων, ένας επιτιθέμενος μπορεί να τους παρακάμψει απλά στέλνοντας την ίδια κεφαλίδα με διαφορετική κεφαλαιοποίηση.
Typical situations where this mistake appears:
- Custom allow/deny lists that try to block “dangerous” internal headers before the request reaches a sensitive component.
- In-house implementations of reverse-proxy pseudo-headers (e.g.
X-Forwarded-For
sanitisation). - Frameworks that expose management / debug endpoints and rely on header names for authentication or command selection.
Abusing the bypass
- Εντοπίστε μια κεφαλίδα που φιλτράρεται ή επικυρώνεται server-side (για παράδειγμα, διαβάζοντας πηγαίο κώδικα, τεκμηρίωση ή μηνύματα σφάλματος).
- Στείλτε την ίδια κεφαλίδα με διαφορετική κεφαλαιοποίηση (μικτο-κεφαλαία ή όλα κεφαλαία). Επειδή οι HTTP στοίβες συνήθως κανονικοποιούν τις κεφαλίδες μόνο μετά το πέρας του user code, ο ευάλωτος έλεγχος μπορεί να παρακαμφθεί.
- Εάν το downstream component χειρίζεται τις κεφαλίδες χωρίς διάκριση πεζών/κεφαλαίων (το μεγαλύτερο μέρος το κάνει), θα αποδεχτεί την τιμή που ελέγχεται από τον επιτιθέμενο.
Example: Apache Camel exec
RCE (CVE-2025-27636)
In vulnerable versions of Apache Camel the Command Center routes try to block untrusted requests by stripping the headers CamelExecCommandExecutable
and CamelExecCommandArgs
. The comparison was done with equals()
so only the exact lowercase names were removed.
# 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: /"
Τα headers φτάνουν στο exec
component χωρίς φιλτράρισμα, με αποτέλεσμα remote command execution με τα δικαιώματα της διαδικασίας Camel.
Εντοπισμός & Αντιμετώπιση
- Κανονικοποιήστε όλα τα header names σε ένα case (συνήθως lowercase) πριν την εκτέλεση allow/deny comparisons.
- Απορρίψτε ύποπτα duplicates: αν υπάρχουν και τα δύο
Header:
καιHeAdEr:
, θεωρήστε το ανωμαλία. - Χρησιμοποιήστε μια θετική allow-list που εφαρμόζεται μετά την κανονικοποίηση.
- Προστατέψτε management endpoints με authentication και network segmentation.
Αναφορές
- 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.