쿠키 주입(Cookie Injection) 및 세션 고정

Cookie Injection

설명

쿠키 주입은 사용자 입력을 쿠키의 이름이나 값으로 직접 사용하거나 Set-Cookie 헤더를 사용자 입력으로 구성할 때 발생합니다. 공격자는 예측 가능한 값이나 자신의 값으로 쿠키(특히 세션 쿠키)를 설정하게 만들어 세션 고정(Session Fixation)을 유발할 수 있습니다. 또한 직접 Set-Cookie를 조립하면 HttpOnly, Secure, SameSite 같은 보안 속성이 누락되어 쿠키 탈취 위험이 커집니다. 실제 공격 시, 공격자는 피해자에게 특정 링크를 유도해 고정된 session 값을 심어 계정 접속을 가로채거나, 클라이언트 코드가 쿠키 값을 신뢰하는 경우 XSS 등 2차 공격으로 확장할 수 있습니다.

잠재적 영향

  • 세션 고정(Session Fixation): 공격자가 자신이 아는 session 값을 피해자 브라우저에 심어 로그인 후 동일한 세션을 재사용해 계정 탈취를 시도할 수 있음.

  • 계정 탈취 및 권한 남용: 세션 장악으로 타인의 계정에 접근하거나 권한 있는 기능을 남용할 수 있음.

  • 쿠키 탈취/노출 위험 증가: HttpOnly, Secure, SameSite 미설정 시 XSS나 평문 전송을 통해 쿠키가 유출될 가능성 증가.

  • 2차 취약점 유발: 클라이언트 측 코드가 쿠키 데이터를 신뢰할 경우 XSS, CSRF 효과 강화 등으로 이어질 수 있음.

해결 방법

  • 사용자 입력을 쿠키 이름/값으로 직접 사용하지 말 것.

  • 세션 식별자는 서버가 생성한 예측 불가능한 token(secrets.token_urlsafe/token_hex 등) 사용.

  • 사용자 선택값을 쿠키에 저장해야 한다면 whitelist 매핑(사전 정의된 값만 허용) 적용.

  • 보안 속성 필수 설정: HttpOnly=True, Secure=True(HTTPS 전용), SameSite=Lax/Strict, Path/Domain 범위 최소화, Max-Age/Expires 적절히 지정.

  • 로그인/권한 상승 시 세션 재발급(Session ID Regeneration)으로 세션 고정 차단.

  • 민감정보는 쿠키에 저장하지 않기(특히 비밀번호, 토큰 원문 등). 필요시 서버 저장 + 쿠키에는 참조용 난수 식별자만.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드:

    • 사용자 입력을 그대로 쿠키 이름/값으로 사용하여 공격자가 임의의 session 값으로 쿠키를 설정할 수 있습니다(세션 고정).

    • Set-Cookie 헤더를 직접 구성하면 HttpOnly, Secure, SameSite 등의 속성이 누락되거나 변경되어 쿠키 탈취 위험이 커집니다.

    • 결과적으로 계정 탈취, 권한 남용, XSS 등 2차 공격으로 이어질 수 있습니다.

  • 안전한 코드:

    • 세션 쿠키는 서버가 생성한 예측 불가능한 token을 사용하므로 공격자가 고정된 값을 심을 수 없습니다.

    • whitelist 매핑으로 미리 정의된 소수의 안전한 값만 쿠키에 저장하므로 입력 조작을 제한합니다.

    • 프레임워크의 set_cookie API를 사용하고 HttpOnly, Secure, SameSite 등 보안 속성을 명시적으로 설정해 쿠키 탈취 및 오용 가능성을 낮춥니다.

참조

Last updated