Zum Inhalt springen

Services, Wiki-Artikel, Blog-Beiträge und Glossar-Einträge durchsuchen

↑↓NavigierenEnterÖffnenESCSchließen
Web-Sicherheit Glossar

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

DirektiveWirkung
X-Frame-Options: DENYSeite darf nirgends eingebettet werden
X-Frame-Options: SAMEORIGINNur von eigener Domain einbettbar
X-Frame-Options: ALLOW-FROM https://trusted.deNur 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: DENY für breite Kompatibilität
  • CSP frame-ancestors: none für moderne Browser
  • Beide setzen für maximale Kompatibilität

Clickjacking in Penetrationstests

Prüfung:

  1. Response-Header auf X-Frame-Options und CSP prüfen:
curl -I https://target.com | grep -i "x-frame\|content-security"
  1. Wenn kein Header gesetzt: PoC im Browser testen - <iframe src="https://target.com/sensitive-action"></iframe> - Lädt die Seite? → Clickjacking möglich!

  2. 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):

ZielaktionCVSS-Bereich
ÜberweisungHigh (6.1-7.5)
Passwort ändernHigh (6.1+)
Like-ButtonLow-Medium (3.1-5.0)
Admin-User erstellenCritical (9.0+)

Cookielose Analyse via Matomo (selbst gehostet, kein Tracking-Cookie). Datenschutzerklärung