작업 환경
- 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 계정으로 로그인한 경우
② 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를 이용하여 사용자의 세션을 탈취할 수 있는 경우
'주요정보통신기반시설가이드 > Web 취약점 점검' 카테고리의 다른 글
[SC (상)] 18. 불충분한 세션 만료 (0) | 2025.05.14 |
---|---|
[IN (상)] 17. 불충분한 인가 (0) | 2025.05.13 |
[CF (상)] 15. 크로스사이트 리퀘스트 변조(CSRF) (0) | 2025.05.13 |
[PR (상)] 14. 취약한 패스워드 복구 (0) | 2025.05.13 |
[IA (상)] 13. 불충분한 인증 (1) | 2025.05.13 |