쿠키, 세션 유효 기간 설정의 중요성

신원상·2024년 8월 13일

(게시 후 수정시 수정하기 버튼 꼭 누르기.. 자동 저장 X)
Velog 사용법

1. chrome으로 로그아웃 후 재 접근시 로그인이 유지되는 경우를 종종 확인할 수 있음, 이것이 왜 그런건지 원인 파악

  • 세션 쿠키가 삭제되지 않음
  • 자동 로그인 기능
  • 브라우저 캐시가 갱신되지 않음
  • 세션 관리의 결함
  • 세션이 동기화된 경우
    등등,,

문제해결

  • 세션 만료 시간 설정, 로그아웃 시 재발급 및 이전 사용 토큰 삭제

  • 쿠키의 유효기간 설정
    : Remember Me 옵션을 사용

  • HttpOnly, secure, Samesite 옵션 사용
    HttpOnly
    : 쿠키가 클라이언트 측 스크립트에서 접근할 수 없도록 만듦
    : XSS(Cross-Site Scripting) 공격으로부터 쿠키를 보호하는 데 유용, 세션보호에도 유용
    secure
    : 쿠키가 오직 HTTPS 연결을 통해서만 전송되도록 만듦
    : 해당 옵션 허용시 HTTP 연결에서는 전송 X
    Samesite
    : CSRF 공격을 방지하기 위해
    : strict(쿠키는 동일한 도메인 내에서만 전송, 외부 접근 X), Lax(사용자가 링크를 타거나 검색해서 들어오는 경우에만 접근 가능), None(쿠키가 모든 요청에 전송, secure 와 같이 사용함)
    : 쿠키가 다른 도메인 요청시 어떻게 전송될지 제어 => 즉 공격자가 세션을 탈취 할수 없게하는 역할
    : CSRF 공격을 방지하기 위해 사용

  • 응답헤더 내 Cache-Control, Pragma, Expires 같은 캐시 제어 헤더를 설정
    : 캐시로 인해 로그인되는 문제를 방지 가능
    : 세개 중 Cache-Control의 우선 순위가 가장 높음
    : 구형 브라우저, 서버의 호환성을 위해 위 세개를 다 사용하는 경우도 있음
    Cache-Control
    : http/1.1 에 도입됨
    : 캐싱 정책을 설정하는 헤더 (클라이언트나 중간 프록시 서버가 응답을 캐시할지, 얼마나 캐시할지)
    Pragma
    : 1.0 에 도입
    : 매번 최신 데이터를 받아오게 설정
    Expires
    : 1.0 에 도입
    : 만료되는 시간과 날짜를 지정, 지정 시간 이후엔 새로운 콘텐츠를 요청함
    : 현재는 Cache-control: max-age 사용으로 많이 사용안함


2. chrome 브라우저에선 쿠키값이 어디에 저장되는지 확인

  • Windows: C:\Users\<사용자이름>\AppData\Local\Google\Chrome\User Data\Default\Cookies
  • macOS: ~/Library/Application Support/Google/Chrome/Default/Cookies
  • Linux: ~/.config/google-chrome/Default/Cookies

why?

: 웹은 상태 비저장 방식이기 때문에
사용자 세션 유지, 개인화된 사용자 경험 제공, 성능 최적화, 트래킹 및 분석 등을 위해 로컬에 저장됨 => 개인화된 방식으로 사용하기 위함임

잠재적 위험

  • 세션 하이재킹
  • 개인정보 유출
  • CSRF 공격 가능
  • 피싱 공격 가능
    => 쿠키 내에 있는 사용자의 개인정보로 인한 2차 피해가능

3. jwt 토큰을 사용하고 있다면 세션 유효기간 확인하는 법과 우회 방법

  • JWT는 헤더, 페이로드, 서명 세 부분으로 나뉘어져 있음
    여기서 주로 exp 클레임에 저장됨, 이때 디코딩 후 확인 가능..

  • base64로 디코딩해서 토큰을 확인 가능(인코딩은 보안 조치가 아님)

방지 방법

  • 짧은 만료 시간 설정 및 자동 갱신
    : 토큰 만료를 짧게하고 자동 갱신되게 조치
  • Refresh Token 사용
    : 짧은 수명의 Access 토큰을 갱신하기 위해 사용함
    : 제대로된 보안 조치가 없다면 독이 될수 있는 조치 방법임..
  • 서버 측 세션 무효화 관리 (너무 과한 조치..?)
  • 다중 팩터 인증(MFA) (너무 과한 조치..?)

+@ HMAC?

  • 해시기반 메시지 인증 코드, hash-based message authentication code
  • 주로 AWS에서 사용됨

동작 방식

  1. 공급자가 준비한 시크릿키를 사용자가 API에 접근 시 시크릿키를 공유
  2. 사용자는 해당 키를 가지고 데이터와 반환된 해시값을 함께 전송
  3. 공급자는 반환된 해시값과 사용자가 보낸 데이터를 비교해 일치여부 확인
  4. 일치한다면 요청 승인, 미일치시 미승인

4. jwt 시크릿키란? 시크릿키의 중요성

  • JWT 토큰의 서명 부분을 생성하기 위해 사용되는 비밀키, 무결성을 보장
  • 시크릿키는 안전한 장소에 보관되어야 하며, 주기적으로 변경하는 것이 좋다
    (이때 안전한 장소 예시라면 AWS 정도 + 접근 권한 제한)
    => jwt 시크릿키를 훔치거나, 무차별 대입 공격으로 추측이 가능할수 있기 때문
    (그렇기 때문에 리미트를 걸어놓는것도 하나의 조치 방법이 될수있다)

추측하기 쉬운 패턴이 있는 경우 취약점으로 볼수도 있다.


5. jwt 크래킹 툴(툴의 종류와 툴에 대한 사용법)

버프스위트에 기능 설치 방법

참고링크 1
참고링크 2


6. 실습환경 구성

APT 해킹의 모든 것

Chater 0 ~ 3

  • 점검, 테스트는 공격자(위협자)의 관점에 서서 생각하고 따라가야한다.
    정보량 : 블랙 < 그레이 < 화이트 박스 테스트

Chater 4 API 테스트 실험실 구축

구성 1 (KALI)

버프, 크롬 or 파이어 폭스, 포스트맨, wfuzz 등 도구 설치

burp 설정은 생략

크롬도 생략

파이어폭스 프록시 설정

포스트맨 Postman

API 개발, 테스트 도구
API 요청을 생성하고, 응답을 분석가능

참고링크 1
참고링크 2

  • burp 랑 연결
  1. ctrl + , 눌러서 설정 열기
  2. proxy 이동
  3. use custom proxy configuration on
  4. Proxy server 에 127.0.0.1 : 8080 입력 후 저장
  5. 버프 intercept 키고 요청시도시 정상적으로 잡히는 것을 확인
  • import
  1. ctrl + O
  2. API Url 입력
  • 단순 요청
  1. Collection -> NEW -> HTTP 클릭
  2. GET 설정 후 url 삽입

wfuzz

nikto 와 비슷한 스캐닝 도구
닉토랑은 다른 느낌의 스캐닝 도구
Nikto: 취약점 스캐너로, 웹 서버와 애플리케이션의 기본적인 취약점을 자동으로 스캔
Wfuzz: 브루트 포스 도구로, 웹 애플리케이션의 숨겨진 요소나 취약점을 찾는 데 사용
좀더 세밀한 공격 가능

가능한 기능

  • 브루트포싱
  • URL Fuzzing
    : 웹 애플리케이션의 URL 구조를 파악하거나 숨겨진 디렉토리 및 파일을 찾기 위해 URL을 퍼징가능
  • HTTP 파라미터 퍼징, HTTP 응답 코드 분석
    : GET/POST 파라미터에 대한 다양한 값을 시도하여 취약점을 탐색 가능

wfuzz -z range, 1-20 https://reqres.in/api/users/FUZZ
=> 1~20번까지 users 확인 가능
단, 내용은 확인 x, byte 수까진 가능

wfuzz -z range,1-20 -u https://reqres.in/api/users/FUZZ -c
=> 위와 동일 but 상태코드까지 확인 가능

wfuzz -c -z file,/path/to/wordlist.txt --hc 404 https://reqres.in/api/users/FUZZ

wfuzz -c -z file,/path/to/wordlist.txt --hc 404 https://reqres.in/api/FUZZ

wfuzz -c -z file,/path/to/wordlist.txt --hc 404 https://reqres.in/api/users/1?FUZZ=test

wfuzz -c -z file,/path/to/wordlist.txt --hs "User not found" https://reqres.in/api/users/1?param=FUZZ

인덱스 순서대로 출력하면
wfuzz -z range,1-20 -u https://reqres.in/api/users/FUZZ -c | sort -k1,1n

구성 2 (Ubuntu) => 칼리로 변경

도커 설치 (우분투 일때)

  1. 우분투 시스템 패키지 업데이트
    sudo apt-get update

  2. 필요한 패키지 설치
    sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

  1. Docker의 공식 GPG키를 추가
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. Docker의 공식 apt 저장소를 추가
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 시스템 패키지 업데이트
    sudo apt-get update

  2. Docker 설치
    sudo apt-get install docker-ce docker-ce-cli containerd.io

  3. Docker 실행상태 확인
    sudo systemctl status docker

  4. 도커 실행
    sudo docker run hello-world

  5. docker-compose 설치
    sudo apt install docker-compose

crAPI 설치

cd


Chater 5

profile
wonsang

0개의 댓글