yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

CSRF (크로스 사이트 요청 변조) 본문

웹/웹 해킹

CSRF (크로스 사이트 요청 변조)

yehey 2020. 9. 18. 19:27

CSRF (크로스 사이트 요청 변조) 취약점

 

웹 애플리케이션에서 정상적인 경로를 통한 요청비정상적인 경로를 통한 요청을 서버가 구분하지 못할 경우 공격자가 스크립트 구문을 이용하여 정상적인 사용자로 하여금 조작된 요청을 전송하도록 하여 게시판 설정 변경 회원정보 변경 등의 문제가 발생할 수 있는 취약점이다.

 

즉, 특정 웹 사이트가 사용자의 웹 브라우저를 신용하는 상태가 취약점이 된다.

공격자가 공격을 당한 사용자의 권한을 그대로 사용하므로 공격 당한 사용자의 권한 수준에 따라 피해 범위가 달라진다

 

CSRF 공격

CSRF 취약점이 존재하는 서버를 이용하는 사용자에게 공격자가 피싱을 이용하여 사용자에게 악성링크를 누르게 하고, 링크를 클릭하면 사용자 모르게 사용자가 로그인 되어있는 웹사이트의 어떤 기능을 실행하는 공격

 

피싱 (phising)
: 전자우편 또는 메신저를 사용해서 신뢰할 수 있는 사람 또는 기업이 보낸 메시지인 것처럼 가장함으로써 기밀을 요하는 정보를 부정하게 얻으려는 social engineering의 한 종류

 

CSRF 공격 과정

가운데가 공격자

1. 사용자가 웹사이트에 정상적으로 접속, 로그인

2. 사용자가 웹사이트에 로그인되어 있는 동안, 공격자가 다양한 방법(이메일, 팝업창)을 사용, 악성코드를 포함하고 있는 페이지를 열도록 한다. => 피싱

3. 사용자가 링크를 클릭하면, 공격자가 지정한 패스워드로 변경하는 요청이 자신이 이전에 로그인되어 있던 웹사이트로 자동 전송됨  => 사용자가 모르는 사이에 패스워드가 변경됨 (변경된 패스워드는 공격자만 알고있음)

4. 공격자가 변경된 패스워드를 이용해 해당 사용자의 계정으로 로그인할 수 있게 된다.

=> 웹사이트에 접근 권한을 얻음과 동시에 사용자의 정보를 얻음

 

CSRF 공격의 핵심

-사용자가 웹사이트에 정상적으로 로그인해야한다.

-사용자가 웹사이트에 로그인되어 있는 동안, 악성코드가 포함된 페이지를 열도록 해야한다.

 

이 두가지 조건이 필수적으로 선행되어야 CSRF 공격이 진행된다!

 

특히 사용자가 로그인을 유지해야만 로그인된 세션 정보가 웹 사이트로 전달되고, 공격자가 요청한 기능이 수행된다.  

(로그인 유지가 되어있지 않으면 세션 정보가 전달되지 않는다.)

 

CSRF 공격 대응 방법

1. 요청 메시지의 레퍼러(referer) 헤더를 검사한다.

(메일이나 타 사이트에서 피싱을 당해 전송되는 요청을 실행하지 않는다.)

 

referer 헤더
:해당 요청을 링크하고 있던 이전 웹 페이지의 주소를 알려주는 헤더

레퍼러 헤더를 확인하여 요청을 전송시킨 출처 페이지를 확인, 정상적인 요청인지 판별할 수 있다.
만약 정상적인 경로로 패스워드 변경 요청이 되었다면 레퍼러 헤더에는 해당 사이트 내부의 URL이 표시된다.

 

2. CSRF 토큰을 사용한다.

쿠키 외에 공격자가 추측할 수 없는 값이 요청 메시지의 파라미터 등에 포함되어 있으면 공격자가 CSRF 공격을 성공시키기 어려워진다.

=> CSRF 공격 대응을 위해 포함시키는 랜덤한 값을 CSRF 토큰이라고 한다.

 

더보기

CSRF 토큰을 이용한 요청/응답 예시

csrf 토큰 사용 예시

 

1. 웹 사이트에서 토큰을 매 응답마다 랜덤하게 생성, 히든 폼 필드 등을 통해 클라이언트로 전송

2. 웹 브라우저는 이전 응답 메시지에 포함된 토큰 값을 다음 요청 시 포함시켜 전송

3. 웹 사이트가 토큰 값을 검사 (토큰 값이 다르면 응답하지 않는다.)

 

' > 웹 해킹' 카테고리의 다른 글

SQL injection 실습1 (WHERE 구문 우회)  (0) 2020.09.29
Brute Force Attack + DVWA실습  (0) 2020.09.27
XSS (크로스 사이트 스크립팅)  (0) 2020.09.16
커맨드 인젝션 공격 / Command injection  (0) 2020.09.12
SQL injection  (0) 2020.09.11
Comments