[드림핵-웹] CSRF

스근한국밥한그릇·2024년 10월 9일
0

DreamHackWeb

목록 보기
3/3

1. Definition

1-1 What is CSRF

Cross Site Request Forgery : 교차 사이트 요청 위조
사이트간 요청을 위조하여 이용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정웹사이트에 요청하게 만드는 공격

  • 이미 서명된 문서의 내용 조작
  • 이용자 속여 의도치 않은 요청에 동의하게 하는 공격
  • 그럴듯한 페이지 만들어서 입력 유도

1-2 Compare CSRF to XSS

공통점

  • 클라이언트 대상 공격
  • 이용자가 악성 스크립트 포함된 페이지 접속하도록 유도

차이점

  • XSS : 인증 정보 탈취 목적 -> 사이트의 오리진에서 스크립트 실행

  • CSRF
    - 이용자가 임의 페이지에 HTTP 요청 보내는 것을 목적
    - 공격자는 악성 스크립트 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능 실행 가능

2. Explanation

2-2 CSRF-1

2-2-1 Dynamic Analysis

  1. 서버 접속

  2. csrf page

  3. memo page

  4. notice flag page

  5. flag page

  • 써서 반응 확인
  • 작동 X
  1. memo page update
  • reload 될 때마다 페이지 update


2-2-2 Static Analysis

  1. read_url 함수
  • url, cookie를 파라미터 값으로 가진다.
  1. check_csrf 함수
  • read_url을 실행한 값을 return
  1. /vuln
  • xss_filter -> CSRF 기법만 사용가능
  1. /flag
  • param 값 지정 가능
  • post 요청시 check_csrf 함수 실행
  1. /memo
  • flag 표시가능
  1. /admin/notice_flag
  • userid 값이 admin인 경우 FLAG 얻을 수 있음
  1. 정리

    1. flag 값을 얻기 위해서는 /admin/notice_flagd 페이지에 userid 값이 admin인 client가 요청을 보내야함
    2. /flag page 에서는 CSRF 공격을 해야함
    3. /memo page에서 flag 확인
  2. exploit 코드

  • <img src="/admin/notice_flag?userid=admin">
  1. flag 획득

2-2 CSRF-1

2-2-1 Dynamic Analysis

  1. 서버 접속

  2. csrf page

  3. flag page

  4. login page

  5. 반응 확인

  6. 결과

2-2-2 Static Analysis

  1. dictionary
  • ID : PW
  • guest로 접속
  • 쿠키 확인 가능
  1. read_url 함수

  2. check_csrf

  • param, cookie 파라미터 값
  • read_url 실행값 리턴
  1. /vuln
  • xss_filter -> CSRF 공격만 가능
  1. /flag

  2. /login

  3. /change_password

  • 요청에 pw값을 넣을 수 있다
  1. 정리

    1. admin으로 접속하면 Home page에 flag값이 뜬다
    2. /change_password의 pw값을 통해 admin의 비밀번호 변경
    3. 변경한 비밀번호로 로그인
  2. 코드

  • <img src="/change_password?pw=0000">
  1. 로그인

  2. flag 획득


3. Prevent

  1. CSRF tokens 사용
  2. Strict SameSite cookie restrictions 사용

3-1 CSRF tokens

세션 토큰과 비슷한 개념, 엔트로피가 높은경우 예측 불가

  • 생성 : CSPRNG(Cryptographically Secure Pseudo-random Number Generator) 사용
  • 전송 : <input type="hidden" name="csrf-token" value="CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz" />
  • 검증 : 요청시 토큰 없거나, 유효하지 않은 경우 거절

SameSite

  • 크로스 사이트로 전송하는 요청의 경우 쿠키의 전송에 제한
  • 정책 : None < Lax < Strict
  • 기본적으로 Strict 정책 default, 특별한 경우에만 lax로 낮춤
profile
항상 든든하게 코딩 한그릇🧑‍💻🍚

0개의 댓글