작업 환경

  • 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 구성

  • 해당 점검은 비밀번호 수정 페이지에 한해서 진행됨
SE (상) 16. 세션 예측
취약점 개요
점검 내용 단순한 방법(연속된 숫자 할당 등)으로 생성되는 세션 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가 자동으로 세션을 설정
  • 기본값으로 설정한 경우 아래의 기본 설정이 들어감 → 충분히 강력하여 무작위 대입 공격 불가
    • session.sid_length : 26
    • session.sid_bits_per_character : 5
    • session.hash_function : sha1 또는 php

 

/etc/php.ini 에서 추가로 설정해보기

session.sid_length = 128
session.sid_bits_per_character = 6
session.hash_function = sha512
  • sid_length : 세션 ID의 전체 길이
  • sid_bits_per_character : 세션 ID를 구성할 때 한 문자당 몇 비트를 사용할지 (6 이상 권장)
  • hash_function : 내부적으로 세션 ID를 생성할 때 사용할 해시 알고리즘 (sha512 권장)

 

② 로그인 시마다 세션 ID 재발급

  • 로그인 성공 시 아래의 코드에 발급
/var/www/html/proc/login_proc.php

session_start();
session_regenerate_id(true);
  • session_regenerate_id(true) : 세션 ID를 로그인 시마다 재발급 받음으로 세션 하이재킹 방지
  • 세션 고정(Session Fixation) 공격 방지

 

 

🔐 OWASP TOP 10(2021)과의 연관

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를 이용하여 사용자의 세션을 탈취할 수 있는 경우