Ειδικές 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

Λίστες λέξεων & Εργαλεία

Επικεφαλίδες για αλλαγή τοποθεσίας

Αντικατάσταση πηγής 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

hop-by-hop headers

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 από προεπιλογή.

javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
});
}
javascript
// 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

  1. Εντοπίστε μια κεφαλίδα που φιλτράρεται ή επικυρώνεται server-side (για παράδειγμα, διαβάζοντας πηγαίο κώδικα, τεκμηρίωση ή μηνύματα σφάλματος).
  2. Στείλτε την ίδια κεφαλίδα με διαφορετική κεφαλαιοποίηση (μικτο-κεφαλαία ή όλα κεφαλαία). Επειδή οι HTTP στοίβες συνήθως κανονικοποιούν τις κεφαλίδες μόνο μετά το πέρας του user code, ο ευάλωτος έλεγχος μπορεί να παρακαμφθεί.
  3. Εάν το 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.

bash
# 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.

Αναφορές

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