Skip to content

Commit

Permalink
세션고정취약점(버그게시판 글번호12095) 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
thisgun committed May 24, 2022
1 parent 0a9f580 commit da2b6da
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 4 deletions.
2 changes: 2 additions & 0 deletions bbs/login_check.php
Expand Up @@ -64,6 +64,8 @@
set_session('ss_mb_id', $mb['mb_id']);
// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함 - 110106
set_session('ss_mb_key', md5($mb['mb_datetime'] . get_real_client_ip() . $_SERVER['HTTP_USER_AGENT']));
// 회원의 토큰키를 세션에 저장한다. /common.php 에서 해당 회원의 토큰값을 검사한다.
if(function_exists('update_auth_session_token')) update_auth_session_token($mb['mb_datetime']);

// 포인트 체크
if($config['cf_use_point']) {
Expand Down
4 changes: 3 additions & 1 deletion bbs/register_form_update.php
Expand Up @@ -303,8 +303,10 @@
}

// 메일인증 사용하지 않는 경우에만 로그인
if (!$config['cf_use_email_certify'])
if (!$config['cf_use_email_certify']) {
set_session('ss_mb_id', $mb_id);
if(function_exists('update_auth_session_token')) update_auth_session_token(G5_TIME_YMDHIS);
}

set_session('ss_mb_reg', $mb_id);

Expand Down
7 changes: 4 additions & 3 deletions common.php
Expand Up @@ -505,8 +505,8 @@ function session_start_samesite($options = array())
if (isset($_SESSION['ss_mb_id']) && $_SESSION['ss_mb_id']) { // 로그인중이라면
$member = get_member($_SESSION['ss_mb_id']);

// 차단된 회원이면 ss_mb_id 초기화
if($member['mb_intercept_date'] && $member['mb_intercept_date'] <= date("Ymd", G5_SERVER_TIME)) {
// 차단된 회원이면 ss_mb_id 초기화, 또는 세션에 저장된 회원 토큰값을 비교하여 틀리면 초기화
if( ($member['mb_intercept_date'] && $member['mb_intercept_date'] <= date("Ymd", G5_SERVER_TIME)) || (function_exists('check_auth_session_token') && !check_auth_session_token($member['mb_datetime'])) ) {
set_session('ss_mb_id', '');
$member = array();
} else {
Expand All @@ -529,7 +529,7 @@ function session_start_samesite($options = array())
$tmp_mb_id = substr(preg_replace("/[^a-zA-Z0-9_]*/", "", $tmp_mb_id), 0, 20);
// 최고관리자는 자동로그인 금지
if (strtolower($tmp_mb_id) !== strtolower($config['cf_admin'])) {
$sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify from {$g5['member_table']} where mb_id = '{$tmp_mb_id}' ";
$sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify, mb_datetime from {$g5['member_table']} where mb_id = '{$tmp_mb_id}' ";
$row = sql_fetch($sql);
if($row['mb_password']){
$key = md5($_SERVER['SERVER_ADDR'] . $_SERVER['SERVER_SOFTWARE'] . $_SERVER['HTTP_USER_AGENT'] . $row['mb_password']);
Expand All @@ -542,6 +542,7 @@ function session_start_samesite($options = array())
(!$config['cf_use_email_certify'] || preg_match('/[1-9]/', $row['mb_email_certify'])) ) {
// 세션에 회원아이디를 저장하여 로그인으로 간주
set_session('ss_mb_id', $tmp_mb_id);
if(function_exists('update_auth_session_token')) update_auth_session_token($row['mb_datetime']);

// 페이지를 재실행
echo "<script type='text/javascript'> window.location.reload(); </script>";
Expand Down
1 change: 1 addition & 0 deletions install/install_db.php
Expand Up @@ -569,6 +569,7 @@
fwrite($f, "define('G5_MYSQL_DB', '".addcslashes($mysql_db, "\\'")."');\n");
fwrite($f, "define('G5_MYSQL_SET_MODE', {$mysql_set_mode});\n\n");
fwrite($f, "define('G5_TABLE_PREFIX', '{$table_prefix}');\n\n");
fwrite($f, "define('G5_TOKEN_ENCRYPTION_KEY', '".bin2hex(random_bytes(16))."'); // 토큰 암호화에 사용할 키\n\n");
fwrite($f, "\$g5['write_prefix'] = G5_TABLE_PREFIX.'write_'; // 게시판 테이블명 접두사\n\n");
fwrite($f, "\$g5['auth_table'] = G5_TABLE_PREFIX.'auth'; // 관리권한 설정 테이블\n");
fwrite($f, "\$g5['config_table'] = G5_TABLE_PREFIX.'config'; // 기본환경 설정 테이블\n");
Expand Down
17 changes: 17 additions & 0 deletions lib/common.lib.php
Expand Up @@ -3924,6 +3924,23 @@ function is_include_path_check($path='', $is_input='')
return true;
}

function check_auth_session_token($str=''){
if (get_session('ss_mb_token_key') === get_token_encryption_key($str)) {
return true;
}
return false;
}

function update_auth_session_token($str=''){
set_session('ss_mb_token_key', get_token_encryption_key($str));
}

function get_token_encryption_key($str=''){
$token = G5_GNUBOARD_VER.(defined('G5_YOUNGCART_VER') ? G5_YOUNGCART_VER : '').G5_TABLE_PREFIX.(defined('G5_SHOP_TABLE_PREFIX') ? G5_SHOP_TABLE_PREFIX : '').(defined('G5_TOKEN_ENCRYPTION_KEY') ? G5_TOKEN_ENCRYPTION_KEY : '').$str;

This comment has been minimized.

Copy link
@jihan001

jihan001 May 24, 2022

그누보드를 업데이트 할때마다 모든 세션이 무효화될 것같네요.

return md5($token);
}

function filter_input_include_path($path){
return str_replace('//', '/', $path);
}
Expand Down
1 change: 1 addition & 0 deletions plugin/social/register_member_update.php
Expand Up @@ -226,6 +226,7 @@

//바로 로그인 처리
set_session('ss_mb_id', $mb['mb_id']);
if(function_exists('update_auth_session_token')) update_auth_session_token(G5_TIME_YMDHIS);

} else { // 메일인증을 사용한다면
$subject = '['.$config['cf_title'].'] 인증확인 메일입니다.';
Expand Down

0 comments on commit da2b6da

Please sign in to comment.