ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๊ฐœ์š”

Session Fixation(์„ธ์…˜ ๊ณ ์ •) ์ด๋ž€ ๋กœ๊ทธ์ธ ์‹œ ๋ฐœ๊ธ‰๋ฐ›์€ ์„ธ์…˜ ID๊ฐ€ ๋กœ๊ทธ์ธ ์ „/ํ›„ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์–ด ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ํ”ผํ•ด์ž์˜ ์„ธ์…˜์„ ํ•˜์ด์ œํ‚น ํ•˜์—ฌ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž๋กœ ์œ„์žฅํ•˜์—ฌ ์ ‘๊ทผํ•˜๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค.

 

"์„ธ์…˜์— ๋Œ€ํ•œ ๋งŒ๋ฃŒ" ๋˜๋Š” "์„œ๋กœ ๋‹ค๋ฅธ IP์˜ ๋™์ผํ•œ ์„ธ์…˜"์— ๋Œ€ํ•ด ์ทจ์•ฝํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์˜ ์ค‘์ผ ๊ฒฝ์šฐ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๋“ค์ด ํ•ด๋‹น ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐœ์ƒ ๊ฐ€๋Šฅ ์‹œ๋‚˜๋ฆฌ์˜ค

์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๋“ค์€ ์ทจ์•ฝ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง์ ‘ ๋กœ๊ทธ์ธํ•˜์—ฌ ์„ธ์…˜ ID๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ  "XSS" ๊ฐ™์€ ๊ต์ฐจ ์Šคํฌ๋ฆฝํŠธ ๊ณต๊ฒฉ์„ ๋ณ‘ํ–‰ํ•˜์—ฌ ์ด๋ฉ”์ผ์„ ์„ ์—ด๋žŒ ์‹œ ๊ณต๊ฒฉ์ž์˜ ์„ธ์…˜ ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋“ค์€ ๊ณต๊ฒฉ์ž์™€ ๋™์ผํ•œ ์„ธ์…˜ ID๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋‚˜ ๊ธฐํƒ€ ๊ฐœ์ธ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” ์ž์‹ ์˜ ํŽ˜์ด์ง€๋ฅผ Refresh(F5)ํ•˜์—ฌ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์˜ ํ–‰์„ธ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ทจ์•ฝํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ ํ›„ ํŒจํ‚ท ๋ถ„์„์„ ํ†ตํ•ด ๋ถ€์—ฌ๋ฐ›์€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด์•ผ ๋ฉ๋‹ˆ๋‹ค.

 

๋Œ€๋ถ€๋ถ„์˜ ํŽ˜์ด์ง€์—์„œ๋Š” SSL ํ†ต์‹ ์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ํƒ€์ธ์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ํŒจํ‚ท ๋ถ„์„์„ ํ†ตํ•ด ํ™•์ธํ•˜๋ฉด ๋ชจ๋‘ ์•”ํ˜ธํ™”๋˜์–ด ์‹๋ณ„ํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ, "http" ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ„๋„์˜ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ์ •๋ณด๋“ค์€ ๋ชจ๋‘ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์„ธ์…˜์— ๋ณ„๋„๋กœ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์ง€์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ "๊ฐœ๋ฐœ์ž ๋„๊ตฌ(F12)" -> Application -> Cookies ํƒญ์œผ๋กœ ๋“ค์–ด๊ฐ€ ํ™•์ธํ•ด๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Session Fixation POC

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ํ•ด์ปค์›์˜ "ph.hitachi" ๋‹˜์˜ POC์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ์ˆ˜์ •ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

javascript:void(function(){ 
    function setCookie(t) { 
    var list = t.split("; "); 
    console.log(list); 
        for (var i = list.length - 1; i >= 0; i--) { 
            var cname = list[i].split("=")[0]; var cvalue = list[i].split("=")[1]; 
            var d = new Date(); d.setTime(d.getTime() + (7*24*60*60*1000)); 
            var expires = ";domain=.www.example.com;expires="+ d.toUTCString(); 
            document.cookie = cname + "=" + cvalue + "; " + expires; 
        } 
    } 
    function hex2a(hex) { 
        var str = ''; 
        for (var i = 0; i < hex.length; i += 2) {
            var v = parseInt(hex.substr(i, 2), 16); 
            if (v) str += String.fromCharCode(v); 
        } 
    return str; 
    } 
    var cookie = prompt("Session Fixation PoC", ""); 
    setCookie(cookie); 
    location.href = 'http://www.example.com/admin/management'; 
})();

ํ•ด๋‹น POC๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด

var expires = ";domain=.ํ•ด๋‹น์ฃผ์†Œ;expires=" ๋ถ€๋ถ„๊ณผ location.href = '์ธ์ฆ ํ›„ ์ ‘์†ํ•  ์ฃผ์†Œ' ์ฝ”๋“œ๋ฅผ ์ž์‹ ์—๊ฒŒ ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜์—ฌ ์žฌ์ ‘๊ทผํ•˜๊ฒŒ ๋˜์ง€๋งŒ, ๋งŒ์•ฝ User-agent๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ์„œ๋กœ ๋‹ค๋ฅธ IP์—์„œ ๋™์ผ ์„ธ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์ œํ•œ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋„ค์ด๋ฒ„ ํŽ˜์ด์ง€๋ฅผ ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ˆ˜์ •๋œ javascript์ฝ”๋“œ๋ฅผ ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด "URL" ์ฃผ์†Œ์— ๋ถ™์—ฌ ๋„ฃ์–ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

*๋„ค์ด๋ฒ„ ํ™ˆํŽ˜์ด์ง€๋Š” ํ•ด๋‹น ์ทจ์•ฝ์ ๊ณผ ์—ฐ๊ด€์ด ์—†์œผ๋ฉฐ, ๋‹จ์ˆœ ์‹œ์—ฐ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

"Input Value"์— ์ƒ๋‹จ์—์„œ ํ™•์ธํ–ˆ๋˜ Cookie๊ฐ’(PCID๋ถ€ํ„ฐ)์„ ์‚ฝ์ž…ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์•„์›ƒ ํ›„ ์ด์ „๊ณผ ๋™์ผํ•œ ์„ธ์…˜ ID๋กœ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ์„ ํ•˜๋ฉด ๋˜์ง€๋งŒ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•˜๋‹จ์˜ 2๊ฐ€์ง€ ์š”๊ฑด์„ ํŒŒ์•…ํ•ด๋ณด์‹ค ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1. User-Agent ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๋ณต ์ธ์ฆ์„ ๋ง‰๊ณ  ์žˆ๋Š”์ง€

2. ์„œ๋กœ ๋‹ค๋ฅธ IP๊ฐ€ ๋™์ผ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ

 

์‚ฌ์‹ค 1๋ฒˆ์˜ ๊ฒฝ์šฐ User-Agent๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒ๋ฐ˜ ์‹œ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ง€๋งŒ, ์ด๋Š” ์ž˜๋ชป๋œ ์กฐ์น˜๋ฐฉ๋ฒ•์œผ๋กœ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž == ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฐ„์— ๋™์ผํ•œ ๋ธŒ๋ผ์šฐ์ €(chrome, firefox, IE)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ด๋Š” ์‰ฝ๊ฒŒ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

์‹ค์ œ ์•…์˜์ ์ธ ํ–‰์œ„์—์„œ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ์šด์˜์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŽ˜์ด์ง€ ์ž์ฒด์— ์ „๊ตฌ๊ฐ„ SSL ํ†ต์‹  ์ฆ‰ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™” ํ†ต์‹ ์ด ๋˜๋„๋ก ํ•˜๋Š” ๊ฒŒ ์ฒซ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค. ๋กœ์ง์„ ํ†ตํ•ด ๊ฐ•์ œ https๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์ธก์—์„œ HSTS(HTTP Strict Transport Security)๋ฅผ ์ ์šฉํ•˜์—ฌ ์ „๊ตฌ๊ฐ„ ๊ฐ•์ œ ์•”ํ˜ธํ™”๋ฅผ ํ•ด์ฃผ์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

*HSTS ์ ์šฉ ๊ด€๋ จ(Nginx, Apache/Tomcat)์€ guleum-zone.tistory.com/82 ์ฐธ๊ณ 

 

๊ทธ๋‹ค์Œ์œผ๋กœ๋Š” 2๋ฒˆ์ฒ˜๋Ÿผ ๋ฉ€ํ‹ฐ์„ธ์…˜์„ ์‚ฌ์ „์— ๋ง‰์•„์คŒ์œผ๋กœ์จ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ID๊ฐ€ ํƒˆ์ทจ๋‹นํ•ด๋„ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž!= ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฐ„์— IP๋Š” ํ‹€๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋„์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

๋Œ€์‘ ๋ฐฉ์•ˆ

/* ๋กœ๊ทธ์ธ ์ „/ํ›„๋กœ ์„ธ์…˜์„ ์žฌ๋ฐœ๊ธ‰ */
<?php
	session_start();
	$old_sessionid = session_id();
	session_regenerate_id();
	$new_sessionid = session_id();
	echo "Old Session : $old_sessionid<br />";
	echo "New Session : $new_sessionid<br />";
	print_r($_SESSION);
?>

/* ์ผ์ •์‹œ๊ฐ„ ํ›„ ์„ธ์…˜๋งŒ๋ฃŒ */
<?php
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // 30๋ถ„๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ์„ธ์…˜ ์ข…๋ฃŒ
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
?>

/* ์„œ๋ฒ„์ธก php.ini ๋‚ด๋ถ€์˜ ์˜ต์…˜์„ ํ†ตํ•ด ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์ง€์ • */
session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 600 ==> 10๋ถ„
# ์„œ๋ฒ„ ์žฌ์‹œ์ž‘

PHP ์–ธ์–ด ์ด์™ธ์—๋„ ์ค‘๋ณต ๋กœ๊ทธ์ธ ๋ฐฉ์ง€ ๊ด€๋ จ ์‹œํ์–ด ์ฝ”๋”ฉ์€ ํ•˜๋‹จ์˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/* JAVA์˜ HttpSessionListener ๋ฅผ ํ†ตํ•ด ์ค‘๋ณต ๋กœ๊ทธ์ธ ๋ฐฉ์ง€ */
https://myhappyman.tistory.com/116

/* JSP ์ค‘๋ณต ๋กœ๊ทธ์ธ ๋ฐฉ์ง€ */
https://landboys.tistory.com/entry/JSP-%EC%9D%B4%EC%A4%91%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EB%B0%A9%EC%A7%80-Session-%EC%B2%98%EB%A6%AC

/* ASP ์ค‘๋ณต ๋กœ๊ทธ์ธ ๋ฐฉ์ง€ */
https://blog.daum.net/lexerj/18126296

/* ์ „์ž์ •๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์ค‘๋ณต ๋กœ๊ทธ์ธ ๋ฐฉ์ง€ */
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:com:v3:cmm:multilogin

 

๊ณต์œ ํ•˜๊ธฐ ๋งํฌ
Comment