작업 환경

  • VMware Workstation Pro (17.6.2 ver)
  • Server 
    • Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)
    • DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)
  • Client
    • Kali Linux : Web 취약점 점검용 (VMnet 1)
  • GNS 구성

  • 해당 점검은 비밀번호 수정 페이지에 한해서 진행됨
SC (상) 18. 불충분한 세션 만료
취약점 개요
점검 내용 세션의 만료 기간 설정 여부 점검
점검 목적 세션 타임아웃 기능을 구현하여 공격자가 만료되지 않은 세션 활용을 방지하기 위함
 보안 위협 세션의 만료 기간을 정하지 않거나, 만료기한을 너무 길게 설정된 경우 악의적인 사용자가
만료되지 않은 세션을 활용하여 불법적인 접근이 가능할 수 있음
판단 기준

양호 : 세션 종료 시간이 설정되어 있는 경우
취약 : 세션 종료 시간이 설정되어 있지 않아 세션 재사용이 가능한 경우
참고 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로 연동된 네이티브 애플리케이션이 존재할 경우 발생 가능