본문 바로가기

공격기법/Web

CSRF(Cross Site Request Forgery)

CSRF

웹 브라우저는 기본적으로 Same-Origin-Policy에 위반되지 않은 모든 요청에 쿠키를 함께 전송

사용자의 의도와 무관하게 다른 사이트에 HTTP 요청을 보내는 것을 CSRF 공격

 

CSRF 공격을 통해 공격자가 얻을 수 있는 이득

해당 세션 쿠키를 가진 사람만 사용할 수 있는 기능을 요청할 수 있다는 것

즉, , 피해자의 권한으로 의도하지 않은 요청 수행

 

GET파라미터를 이용한 CSRF

<img src="http://test.com/sendMoney?to=test&money=10000"/>

이미지를 로드하는 순간 test에게 10000원을 전송

 

form태그를 이용한 CSRF

<iframe style="display:none" name="csrf-frame"></iframe>
    <form action="http://requestbin.net/r/1220esk1" method="get" id="csrf-form">
		<input type="text" name="username" value="test">
		<input type="checkbox" name="status" checked="checked">
		<button type="submit">Submit</button>
		</form>
    <script>document.getElementById("csrf-form").submit()</script>

iframe style="display:none"으로 form을 안보이게 한 뒤

form의 id값을 줘서

script에 id값을 동일한 id값을 가진 폼을 submit()으로 바로 제출

이 스크립트가 심겨진 페이지에 들어가기만 해도 input정보를 전송

위에서는 get방식으로 전송하였지만 post방식도 가능

 

 

CSRF 공격 요구조건

1. 해당 웹 사이트가 쿠키를 이용한 인증 방식을 사용

모든 HTTP 전송엔 쿠키가 함께 전송되기 때문에 쿠키에 저장된 세션 아이디도 전송

2. 공격자가 사전에 알 수 없는 파라미터가 존재해서는 안됨

자동입력 방지 문자를 넣어야 하는 요청은 공격자가 미리 알 수 없음

패스워드 변경 기능에서 기존 패스워드를 입력 받는 다면 이 또한 공격자가 미리 알 수 없음

방어기법

1. 세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증

사용자 인증만을 위한 헤더를 추가합니다. (e.g. Authorization)

 

2. 공격자가 예측할 수 없는 파라미터 추가 및 검증

Same Origin에서만 접근 가능한 데이터를 삽입(ex - CSRF Token)

CAPTCHA 사용

정상적인 사용자만 아는 기존의 값을 검증 (예: 현재 비밀번호)


3. SameSite cookie

쿠키에는 key=value를 포함해 추가적인 설정 값도 함께 저장

기존 Domain, Expires, Path 등만 있었지만 새롭게 SameSite 옵션이 추가

Strict, Lax, None 옵션 존재

None: 기존과 같이 모든요청에 쿠키 삽입

None을 사용할 시 SamSite=None; secure로 

반드시 secure을 명시해주어야함

secure옵션으로 https에서만 cookie 전송

Lax: Link, Prerender, Form GET을 제외한 요청에는 삽입

Strict: 모든 크로스 사이트에서 출발한 요청에 해당 쿠키를 삽입하지 않음(Same Orgin일 때만 가능)

################################################

크롬 브라우저는 80버전부터 개발자가 강제로 SameSite=None; Secure; 을 넣지 않는 이상

모든 쿠키에 SameSite=Lax를 강제

################################################

'공격기법 > Web' 카테고리의 다른 글

XSS와 CSRF의 차이  (0) 2020.03.08
브루트 포스 공격  (0) 2020.01.28
XSS(Cross Site Scripting)과 Cheat Sheet  (0) 2019.10.25
SQL Injection  (0) 2019.09.09
URL 점핑(Jumping)  (0) 2019.05.24