Skip to content

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

↑↓NavigierenEnterÖffnenESCSchließen
Web-Sicherheit Glossary

Clickjacking

Clickjacking (also known as UI redressing) is an attack in which a transparent or invisible webpage is superimposed over a legitimate site. The user clicks on what they believe to be something harmless, but is actually clicking on hidden buttons on the real site—and unintentionally triggers actions such as likes, money transfers, or granting permissions.

Clickjacking exploits the ability to manipulate websites 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 &quot;DENY&quot; always;

# Apache:
Header always set X-Frame-Options &quot;SAMEORIGIN&quot;
// Express.js:
app.use((req, res, next) =&gt; {
  res.setHeader(&#x27;X-Frame-Options&#x27;, &#x27;DENY&#x27;);
  next();
});
// oder: helmet.js Middleware
import helmet from &#x27;helmet&#x27;;
app.use(helmet.frameguard({ action: &#x27;deny&#x27; }));

Content Security Policy (CSP) frame-ancestors

Modernerer, flexiblerer Schutz - ersetzt X-Frame-Options:

Content-Security-Policy: frame-ancestors &#x27;none&#x27;
Content-Security-Policy: frame-ancestors &#x27;self&#x27;
Content-Security-Policy: frame-ancestors &#x27;self&#x27; https://partner.de
# nginx:
add_header Content-Security-Policy &quot;frame-ancestors &#x27;none&#x27;&quot; 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 &quot;x-frame\|content-security&quot;
  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+)