주요정보통신기반 웹 취약 분석 평가 방법 16번째 항목인 세션 예측(Session prEdiction/SE)이다. 왜 SP로 안 줄이고 굳이?? 내가 모르는 단어가 있는 것인가..!! 아니면 SP 코드가 있나보다.
세션 관련해서는 무조건 한 번 쯤은 다뤘어야 했다. 웹 보안을 하면서 세션을 안 하는게 말이 안되지 암암.
물론 이번 섹션은 크게 중점은 두지 않을테지만 다다음 섹션인가부터 두어 개 있다.
세션 예측은 간단히 말해서 세션ID를 부여할 때 일정 패턴을 가진 세션을 부여하지 말고 난수로 생성하여 부여해라! 다.
저번에 내가 굉장히 어이없어 했듯이 이거도 요새는 거의 난수로 알아서 생성하고 있을 것이다.
그래도 TMI를 하나 풀어보자면 그냥 난수로 생성한다고 되는 것은 아니고 암호학적 측면에서 안전한 난수가 있고 안전하지 않은 난수가 있다.
- Q: 아니 난수를 사용하는데 안전하고 안전하지 않은게 어딨어요?? 설마 ㅋㅋ 막 2자리 난수 이런거 얘기하는거 아님?? ㅋㅋ
일단 난수 생성 로직에 대해 어느 정도의 이해가 필요하다. 우리 생각으로 6자리 난수를 만든다고 가정하면 정말 임의의 수를 집어넣겠지만, 시스템이 난수를 만드는 과정은 난수 생성기(PRNG)라 부르는 것에 의해 만들어진다. 특정 seed 값을 넣으면 그 seed 값을 이용하여 난수를 만들게 된다. 안전하지 않은 난수들은 이 seed 값을 쉽게 알 수 있거나 예측이 가능하거나, 난수를 만드는 알고리즘이 너무 1차원적일때, 간혹 특정 패턴을 사용한다거나 같은 경우에 생성된다. 이러한 난수들은 공격자가 쉽게 예측할 수 있고 재현도 가능하다. 난수의 특징 2가지가 예측 불가능 / 재현 불가능 해야 한다는 점에서 난수라고 부를 수가 없겠다.
그럼 안전한 난수는?? seed 값을 전혀 예상할 수 없고 난수를 만드는 알고리즘이 복잡하여 공격자가 전혀 예측하거나 재현이 불가능한 것이 안전한 난수이다.
그리고 추가로! 난수는 저렇게 함수로 넣고 사용되다 보니까 사실은 일정 규칙이 있다. 그래서 만약 0부터 시작한 난수가 9까지 갔으면 0으로 되돌아온다. (그냥 예시일뿐 당연히 난수니까 0, 1, 2 ... , 9 이렇게 순차적으로 나오진 않을꺼다.) 그래서 저 간격이 얼마나 넓은지도 중요하겠다. 말이 좀 이상하네.
그래서 결국에는!! 세션을 안전한 난수로 생성하라 이거시다. 너무 돌아왔나 허허,,
rand() 같은 굉장히 취약한 함수를 사용하지 말고 random_bytes 같이 안전한 함수를 사용하면 된다.
근데 나처럼 php를 사용하는 사람들은(버전 7 이상) session_start(); 를 해주면 알아서 안전하게 세션ID를 생성해준다.
SE의 보안설정방법
- 아무리 길이가 길고 복잡한 항목으로 세션 ID가 만들어져도 공격자가 충분한 시간과 자원이 있다면 뚫는 것은 불가능하지 않으므로 강력한 세션 ID를 생성하여야 함 주된 목적은 수많은 대역폭과 처리 자원을 가지고 있는 공격자가 하나의 유효한 세션 ID를 추측하는데 최대한 오랜 시간이 걸리게 하여 쉽게 추측하지 못하게 하는 것에 있음 단순 조합보다는 상용 웹 서버나 웹 애플리케이션 플랫폼에서 제공하는 세션 ID를 사용하고, 가능하다면 맞춤형 세션 관리 체계를 권고함 세션 ID는 로그인 시마다 추측할 수 없는 새로운 세션 ID로 발급하여야 함
뭔가 약한 문자열 강도를 다루면서 했던 내용이랑 살짝 비슷한 듯한 초장 내용.
'주요정보통신기반 웹 취약점 분석·평가 항목' 카테고리의 다른 글
불충분한 세션 만료(SC) (0) | 2025.05.23 |
---|---|
불충분한 인가(IN) (0) | 2025.05.21 |
크로스사이트 리퀘스트 변조(CF) (0) | 2025.05.20 |
취약한 패스워드 복구(PR) (0) | 2025.05.20 |
불충분한 인증(IA) (0) | 2025.05.20 |