본문 바로가기

보안(Security)

Cross-Site Request Forgery(CSRF)

CSRF 공격이란 클라이언트가 서버를 공격하는 것을 뜻한다. 웹 사이트(서버)가 신뢰하는 클라이언트로부터 승인되지 않은 명령이 전송되는 악의적인 공격이다.

 

시나리오 예시

Mallory는 Bob의 은행의 웹 사이트 스크립트를 참조하는 HTML 이미지를 만들었다.

Bob의 은행이 그의 인증 정보를 쿠키로 갖고 있고, 그 쿠기가 만료되지 않았다면, Bob의 브라우저는 그의 쿠키와 인출 양식을 제출할 것이다. 즉 Bob의 승인 없이 거래를 승인하게 되는 것이다.

 

만약 사용자가 비밀번호 변경 시 서버가 기존 비밀번호 확인을 하지 않는다면? 공격자는 임의로 사용자의 비밀 번호를 바꿀 수 있다.

 

위 시나리오를 보고 잘 이해가 안 될 것이다. CSRF 공격 과정에 대해 차근차근 이해해 보자.

1. 사용자가 보안이 취약한 어떤 웹사이트에 로그인한다.

2. 서버가 회원인증에 session ID를 사용한다면, 클라이언트는 이 session ID를 브라우저의 쿠키에 저장한다.

(세션 : https://hooeverything.tistory.com/12)

3. 공격자는 해당 사용자가 악성 스크립트 페이지를 누르도록 유도한다.

4. 악성스크립트가 실행되면서 서버로 요청을 보내는데 이때 사용자의 session ID를 사용하여 인증하기 때문에 무사히 인증에 성공하게 된다.

5. 서버는 인증된 사용자라고 판단하여 이에 대한 응답을 보내준다.

 

이런 공격을 통해 나의 SNS 계정에 공격자가 글을 올릴 수 있다.

 

 

방어기법

1. Referer 검증

서버에서 사용자의 request header 정보에서 referer 정보를 확인할 수 있다. 일반적인 경우 request heade referer 값을 확인하여 너무 뜬금없는 곳에서 들어오는 경우를 차단한다. request header 중 host와 비교하기도 한다고 한다. 대부분의 CSRF 공격이 이 referer 검증을 통해 막을 수 있다고 한다.

하지만 여러 해킹 툴을 이용하면 이 referer을 조작할 수 있다고 한다. 이런 저런 이유로 이런 방어 기법을 이용하여 대부분 막을 수 있지만, 정말 작정하고 공격하는 공격자들을(XSS 취약점 등을 이용) 막기는 힘들다. 

 

  • referer - 현재 페이지로 연결되는 링크가 있던 이전 웹 페이지의 주소
  • host - 요청하려는 서버 호스트 이름과 표트 번호

 

request header의 Host, Referer

 

2. security token 사용

사용자의 세션에 임의의 난수 값을 생성하여 저장하고, 사용자의 요청에 이 난수 값을 포함시켜 전송한다. 서버는 이를 받아 받은 값과 세션(서버 세션 DB)에 저장된 값이 같은지 검증하는 방법이다. 이 역시 XSS 취약점 등을 이용하여 CSRF 공격을 하는 공격자는 막기 힘들다.


참고

https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/

https://doctorson0309.tistory.com/605

https://itstory.tk/entry/CSRF-%EA%B3%B5%EA%B2%A9%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-CSRF-%EB%B0%A9%EC%96%B4-%EB%B0%A9%EB%B2%95

https://velog.io/@cham/HTTP-Header%EC%97%90%EB%8A%94-%EC%96%B4%EB%96%A4-%EC%A0%95%EB%B3%B4%EB%93%A4%EC%9D%B4-%EB%8B%B4%EA%B2%A8%EC%9E%88%EC%9D%84%EA%B9%8C