Clickjacking
Clickjacking (auch UI Redressing) ist ein Angriff bei dem eine transparente oder unsichtbare Webseite über eine legitime Seite gelegt wird. Der Nutzer klickt glaubend auf etwas Harmloses, tatsächlich aber auf versteckte Buttons der echten Seite - und löst unbeabsichtigt Aktionen aus: Likes, Überweisungen, Berechtigungserteilung.
Clickjacking nutzt die Möglichkeit aus, Webseiten via <iframe> in andere Webseiten einzubetten. Der Angreifer platziert den legitimen Button (z.B. “Zahlung bestätigen”) über einem harmlos aussehenden Element. Der Nutzer glaubt auf einen harmlosen “Play”-Button zu klicken, tatsächlich aber auf den Bestätigen-Button der Bank.
Clickjacking - Funktionsweise
Angriffsszenario: Die Angreifer-Seite (evil.com) zeigt einen harmlosen “Hier klicken zum Spielen!”-Button. Darunter liegt unsichtbar (opacity: 0.01) ein iframe mit bank.de - der echte “Überweisung bestätigen”-Button ist pixelgenau über dem sichtbaren Button positioniert.
- Nutzer sieht: “Hier klicken zum Spielen!”
- Nutzer klickt: Trifft unsichtbaren “Überweisung bestätigen”-Button!
Angreifer-Code:
<style>
#trick-button {
position: absolute;
top: 50px;
left: 100px;
z-index: 10;
cursor: pointer;
}
#target-iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.01;
z-index: 20;
}
</style>
<div id="trick-button">Klick mich für tolles Spiel!</div>
<iframe id="target-iframe" src="https://bank.de/transfer"></iframe>
Schutzmaßnahmen
X-Frame-Options Header
| Direktive | Wirkung |
|---|---|
X-Frame-Options: DENY | Seite darf nirgends eingebettet werden |
X-Frame-Options: SAMEORIGIN | Nur von eigener Domain einbettbar |
X-Frame-Options: ALLOW-FROM https://trusted.de | Nur von bestimmter Domain (veraltet, nicht überall unterstützt) |
# nginx:
add_header X-Frame-Options "DENY" always;
# Apache:
Header always set X-Frame-Options "SAMEORIGIN"
// Express.js:
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
next();
});
// oder: helmet.js Middleware
import helmet from 'helmet';
app.use(helmet.frameguard({ action: 'deny' }));
Content Security Policy (CSP) frame-ancestors
Modernerer, flexiblerer Schutz - ersetzt X-Frame-Options:
Content-Security-Policy: frame-ancestors 'none'
Content-Security-Policy: frame-ancestors 'self'
Content-Security-Policy: frame-ancestors 'self' https://partner.de
# nginx:
add_header Content-Security-Policy "frame-ancestors 'none'" always;
JavaScript Frame-Busting (legacy, schwächer)
if (window !== window.top) {
window.top.location = window.location;
}
Problem: Kann durch das sandbox-Attribut ausgehebelt werden - <iframe sandbox> schränkt JavaScript im iframe ein, Frame-Busting funktioniert dann nicht. CSP frame-ancestors ist deutlich besser.
Empfehlung:
X-Frame-Options: DENYfür breite KompatibilitätCSP frame-ancestors: nonefür moderne Browser- Beide setzen für maximale Kompatibilität
Clickjacking in Penetrationstests
Prüfung:
- Response-Header auf X-Frame-Options und CSP prüfen:
curl -I https://target.com | grep -i "x-frame\|content-security"
-
Wenn kein Header gesetzt: PoC im Browser testen -
<iframe src="https://target.com/sensitive-action"></iframe>- Lädt die Seite? → Clickjacking möglich! -
Wichtige Seiten prüfen:
- Login-Formulare (Credential-Capture)
- Zahlungsbestätigung
- OAuth-Consent-Bildschirme
- Admin-Funktionen
- Like/Share-Buttons (Social Media Clickjacking)
CVSS-Einschätzung (abhängig von möglicher Aktion):
| Zielaktion | CVSS-Bereich |
|---|---|
| Überweisung | High (6.1-7.5) |
| Passwort ändern | High (6.1+) |
| Like-Button | Low-Medium (3.1-5.0) |
| Admin-User erstellen | Critical (9.0+) |