ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ฐ์
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
'WEB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ์ทจ์ฝ์ (3) | 2021.04.16 |
---|---|
SSRF(Server Side Request Forgery) ์ทจ์ฝ์ (1) | 2021.02.25 |
Gophish(Phishing Framework) ์ฌ์ฉ๋ฒ (1) | 2021.01.19 |
Gophish(Phishing Framework) ์ค์น (0) | 2021.01.18 |
CVE-2020-1938 ์ทจ์ฝ์ ๋ถ์ (0) | 2020.12.13 |