세션의 만료 기간을 정하지 않거나, 만료기한을 너무 길게 설정된 경우 악의적인 사용자가 만료되지 않은 세션을 활용하여 불법적인 접근이 가능할 수 있음
판단 기준
양호: 세션 종료 시간이 설정되어 있는 경우 취약: 세션 종료 시간이 설정되어 있지 않아 세션 재사용이 가능한 경우
참고
OWASP TOP 10 항목 중 A07 : Identification and Authentication Failures 에 해당한다고 판단
점검 방법
Step 1) 인증 후 정상적으로 세션이 발행된 페이지의 리퀘스트를 취득하여 일정 시간 (사이트에 따라 다름)이 지난 후에 재전송 시 정상 처리가 되는지 확인
현재 세션 발급에 대한 설정만 존재, 세션 종료 시간 설정은 참고 확인
보안 설정 방법
세션 타임아웃 구현 시 타임아웃 시간은 10분으로 설정할 것을 권고함
참고
세션 종료 시간 설정
1. 일정 시간 "미사용"시 자동 만료
→ 권고 사항인 10분으로 설정
설정 방법
해당 페이지만 설정 : session.gc_maxlifetime 값을 600초로 설정
전역 설정 : php.ini 에서 session.gc_maxlifetime값을 600초로 설정
/var/www/html/update.php <- 비밀번호 수정 페이지만 설정하고싶은 경우
<?php
ini_set('session.gc_maxlifetime', 600); // 서버 세션 수거 주기도 10분으로
session_start();
// 타임아웃 기준 시간
$timeout = 600;
// 마지막 활동 시간 확인
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout) {
session_unset();
session_destroy();
header("Location: /proc/logout.php?reason=timeout");
exit;
}
// 활동 시점 갱신
$_SESSION['last_activity'] = time();
...중략
/etc/php.ini 에서 전역설정 추가
session.gc_maxlifetime = 600
🔐 OWASP TOP 10(2021)과의 연관
OWASP 공식문서 중 일부 “Sessions should be invalidated on the server after logout, idle timeout, and absolute timeout.”
1. A07: Identification and Authentication Failures
외부 입력이 코드나 명령으로 해석되어 실행
PHP 자체는 이런 구조가 아니지만, PHP로 연동된 네이티브 애플리케이션이 존재할 경우 발생 가능
접근제어가 필요한 중요 페이지의 통제수단이 미흡한 경우, 비인가자가 URL 파라미터 값 변경 등의 방법으로 중요 페이지에 접근하여 민감한 정보 열람 및 변조 가능함
판단 기준
양호: 접근제어가 필요한 중요 페이지의 통제수단이 적절하여 비인가자의 접근이 불가능한 경우 취약: 접근제어가 필요한 중요 페이지의 통제수단이 미흡하여 비인가자의 접근이 가능한 경우
참고
OWASP TOP 10 항목 중 A01 : Broken Access Control 에 해당한다고 판단
점검 방법
Step 1) 비밀 게시글(또는 개인정보 변경, 패스워드 변경 등) 페이지에서 다른 사용자와의 구분을 ID, 일련번호 등의 단순한 값을 사용하는지 조사
URL 상 표시 X세션 ID 값으로 사용자 구별
Step 2) 게시글을 구분하는 파라미터 값을 변경하는 것만으로 다른 사용자의 비밀 게시글 (또는 개인정보 변경, 패스워드 변경 등)에 접근 가능한지 확인
BurpSuite 를 사용하여도 해당 유저의 값만 바꿀 수 있음
다른 사용자의 패스워드에는 접근 불가능
보안 설정 방법
접근제어가 필요한 중요 페이지는 세션을 통한 인증 등 통제수단을 구현하여 인가된 사용자 여부를 검증 후 해당 페이지에 접근할 수 있도록 함
페이지별 권한 매트릭스를 작성하여 접근제어가 필요한 모든 페이지에서 권한 체크가 이뤄지도록 구현하여야 함
참고
🔐 OWASP TOP 10(2021)과의 연관
OSASP TOP 10 공식 문서중 일부 "Access control enforces policy such that users cannot act outside of their intended permissions. Failures typically lead to unauthorized information disclosure, modification or destruction of all data or performing a business function outside of the user's limits."
단순한 방법(연속된 숫자 할당 등)으로 생성되는 세션 ID를 예측하여 세션 탈취 여부 점검
점검 목적
사용자의 세션ID를 추측 불가능하도록 난수로 생성하여 공격자의 불법적인 접근을 차단하기 위함
보안 위협
사용자에게 전달하는 세션 ID가 일정한 패턴을 가지고 있는 경우 공격자가 세션 ID를 추측하여 불법적인 접근을 시도할 수 있음
판단 기준
양호: 추측 불가능한 세션 ID가 발급되는 경우 취약: 세션 ID가 일정한 패턴으로 발급되는 경우
참고
OWASP TOP 10 항목 중 A07 : Identification and Authentication Failures 에 해당한다고 판단
PHP의 경우에는 session start(); 를 사용하면 임의의 세션 ID를 발급해준다.
추가적인 설정과 세션에 대해서는 참고 확인
점검 방법
Step 1) 각기 다른 IP 주소와 다른 사용자명, 시간적 차이로 세션 ID를 발급받음
Step 2)발급받은 세션 ID에 일정한 패턴이 있는지 조사
Step 3) 일정한 패턴이 확인되고, 패턴에 의해 사용 가능한 세션 ID의 예측이 가능한지 확인
① jijibaeee 계정으로 로그인한 경우
jijibaeeee 로 로그인한 경우
② test123 계정으로 로그인한 경우
test123으로 로그인한 경우
③ (②) 에서 로그아웃을 하고 다시 test123 계정으로 로그인한 경우
다시 test123 으로 로그인한 경우
보안 설정 방법
아무리 길이가 길고 복잡한 항목으로 세션 ID가 만들어져도 공격자가 충분한 시간과 자원이 있다면 뚫는 것은 불가능하지 않으므로 강력한 세션 ID를 생성하여야 함 주된 목적은 수많은 대역폭과 처리 자원을 가지고 있는 공격자가 하나의 유효한 세션 ID를 추측하는데 최대한 오랜 시간이 걸리게 하여 쉽게 추측하지 못하게 하는 것에 있음
단순 조합보다는 상용 웹 서버나 웹 애플리케이션 플랫폼에서 제공하는 세션 ID를 사용하고, 가능하다면 맞춤형 세션 관리 체계를 권고함
세션 ID는 로그인 시마다 추측할 수 없는 새로운 세션 ID로 발급하여야 함
참고
📌세션 ID란 ?
웹 애플리케이션에서 사용자의 상태를 유지하기 위해 생성되는 고유한 식별자
세션 값에 접근하기 위한 키(Key) 역할을 하는 고유 식별자
즉, 브라우저에 저장되는 임의의 고유 식별자
난수를 사용하고 위 점검 예시의 Value 에 해당
Name 은 세션 이름(Key)
📌세션값이란 ?
세션에 저장된 실제 데이터
사용자 이름, 권한과 같은 데이터
브라우저에 안 보임 → 서버에 저장됨
$_SESSION['user_id'] 및 $_SESSION['nickname'] 과 같은 사용자의 정보임
사용자의 정보이므로 난수가 아님
비유
요소
역할
세션 이름 (PHPSESSID)
“출입증 이름” – 고정된 이름표
세션 ID (bgceffgcap...)
“출입증 번호” – 고유 번호 (매번 새로 발급 가능)
세션값 ($_SESSION)
“출입증 내부 데이터” – 사용자 이름, 권한 등 서버가 관리하는 상태
PHP에서 세션 설정
session_start() 호출 시 PHP가 자동으로 세션을 설정
기본값으로 설정한 경우 아래의 기본 설정이 들어감 → 충분히 강력하여 무작위 대입 공격 불가
OWASP TOP 10 공식문서중 일부 "CWE-384: Session Fixation – The application does not assign a new session ID upon successful login. This allows an attacker to set or predict a user’s session identifier and hijack their session once they log in."
1. A07 : Identification and Authentication Failures
세션 ID가 단순하거나 순차적으로 생성되어 공격자가 쉽게 추측할 수 있는 경우
사용자가 로그인하기 전에 세션 ID가 고정되어 있어, 공격자가 해당 세션 ID를 이용하여 사용자의 세션을 탈취할 수 있는 경우
OWASP TOP 10 공식문서중 일부 "Cross-Site Request Forgery (CSRF) vulnerabilities allow attackers to induce users to perform actions they do not intend to. CSRF attacks exploit the trust that a site has in a user's browser."