From c95168fb0ce0d8ca2253a43cc08b339a82989535 Mon Sep 17 00:00:00 2001
From: Kkigomi <112419763+kkigomi@users.noreply.github.com>
Date: Thu, 19 Oct 2023 11:26:28 +0900
Subject: [PATCH] =?UTF-8?q?IP=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20?=
=?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EA=B4=80=EB=A6=AC=ED=8E=98=EC=9D=B4?=
=?UTF-8?q?=EC=A7=80=20=EC=A0=91=EA=B7=BC=20=EC=8B=9C=20=EC=A0=91=EC=86=8D?=
=?UTF-8?q?=EC=9D=B4=20=EC=A0=9C=ED=95=9C=EB=90=98=EB=8A=94=20=EB=AC=B8?=
=?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(#284)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* `ss_mb_key`를 생성하고 검증할 때 IP를 제거하고 대체 함
프록시 등의 사용으로 IP가 수시로 변경되는 환경이라면 관리페이지 접근에 수시로 제한이 되는 문제를 해결하기 위함
* `ss_mb_key` 세션 값 생성 코드의 중복을 제거하기 위해 정리
* client_key 유효 시간을 세션 동안만 유지되도록 변경
---
adm/admin.lib.php | 7 +++----
bbs/login_check.php | 5 +++--
lib/common.lib.php | 47 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/adm/admin.lib.php b/adm/admin.lib.php
index 58336b576..8bc521e2d 100644
--- a/adm/admin.lib.php
+++ b/adm/admin.lib.php
@@ -617,13 +617,12 @@ if (!$member['mb_id']) {
}
}
-// 관리자의 아이피, 브라우저와 다르다면 세션을 끊고 관리자에게 메일을 보낸다.
-$admin_key = md5($member['mb_datetime'] . get_real_client_ip() . $_SERVER['HTTP_USER_AGENT']);
-if (get_session('ss_mb_key') !== $admin_key) {
-
+// 관리자의 클라이언트를 검증하여 일치하지 않으면 세션을 끊고 관리자에게 메일을 보낸다.
+if (!verify_mb_key($member)) {
session_destroy();
include_once G5_LIB_PATH . '/mailer.lib.php';
+
// 메일 알림
mailer($member['mb_nick'], $member['mb_email'], $member['mb_email'], 'XSS 공격 알림', $_SERVER['REMOTE_ADDR'] . ' 아이피로 XSS 공격이 있었습니다.
관리자 권한을 탈취하려는 접근이므로 주의하시기 바랍니다.
해당 아이피는 차단하시고 의심되는 게시물이 있는지 확인하시기 바랍니다.' . G5_URL, 0);
diff --git a/bbs/login_check.php b/bbs/login_check.php
index ea654f3f7..3882f38c0 100644
--- a/bbs/login_check.php
+++ b/bbs/login_check.php
@@ -71,8 +71,9 @@ if (! (defined('SKIP_SESSION_REGENERATE_ID') && SKIP_SESSION_REGENERATE_ID)) {
// 회원아이디 세션 생성
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']));
+// FLASH XSS 공격에 대응하기 위하여 회원의 고유키를 생성해 놓는다. 관리자에서 검사함
+generate_mb_key($mb);
+
// 회원의 토큰키를 세션에 저장한다. /common.php 에서 해당 회원의 토큰값을 검사한다.
if(function_exists('update_auth_session_token')) update_auth_session_token($mb['mb_datetime']);
diff --git a/lib/common.lib.php b/lib/common.lib.php
index edf06a002..f05c8e30b 100644
--- a/lib/common.lib.php
+++ b/lib/common.lib.php
@@ -2266,6 +2266,53 @@ function check_token()
return true;
}
+/**
+ * 브라우저 검증을 위한 세션 반환 및 재생성
+ * @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다.
+ * @param bool $regenerate true 이면 재생성
+ * @return string
+ */
+function ss_mb_key($member, $regenerate = false)
+{
+ $client_key = ($regenerate) ? null : get_cookie('mb_client_key');
+
+ if (!$client_key) {
+ $client_key = get_random_token_string(16);
+ set_cookie('mb_client_key', $client_key, G5_SERVER_TIME * -1);
+ }
+
+ $mb_key = md5($member['mb_datetime'] . $client_key) . md5($_SERVER['HTTP_USER_AGENT']);
+
+ return $mb_key;
+}
+
+/**
+ * 회원의 클라이언트 검증
+ * @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다.
+ * @return bool
+ */
+function verify_mb_key($member)
+{
+ $mb_key = ss_mb_key($member);
+ $verified = get_session('ss_mb_key') === $mb_key;
+
+ if (!$verified) {
+ ss_mb_key($member, true);
+ }
+
+ return $verified;
+}
+
+/**
+ * 회원의 클라이언트 검증 키 생성
+ * 클라이언트 키를 다시 생성하여 생성된 키는 `ss_mb_key` 세션에 저장됨
+ * @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다.
+ */
+function generate_mb_key($member)
+{
+ $mb_key = ss_mb_key($member, true);
+ set_session('ss_mb_key', $mb_key);
+}
// 문자열에 utf8 문자가 들어 있는지 검사하는 함수
// 코드 : http://in2.php.net/manual/en/function.mb-check-encoding.php#95289