피해자 세션을 사용해 피해자 의도와 상관없이 서버로 위조된 요청을 보내는 공격
게시판, 메일함과 같이 로그인 해야만 사용 가능한 서비스에서 발생하는 취약점이다.
모든 요청에서 발생한다. 하지만 비밀번호 변경, 이메일 주소 변경, 관리자 계정 등록, 계정 삭제, 글 작성, 수정 등과 같은 민감한 요청에서 더욱 취약하다.
둘다 클라이언트 측을 공격하는 점을 동일하다.
<form method="POST">
</form>
referer
우회한다.<meta name=”referrer” content=”no-referrer”>
1. id 속성을 포함한 iframe 태그로 특정 링크에 요청한다.
2. getElementById()로 element를 가져온다.
3. DOM 객체의 첫번째 form 태그에서 csrf_token 파라미터의 value 값을 가져온다.
4. "csrf_form" id 속성을 포함한 form 태그를 생성하고 수정 요청을 전송할 url을 입력한다.
5. 수정할 비밀번호를 입력한다.
6. 자바스크립트로 csrf_token 값을 가져왔다면 form 태그에 token 값을 전달한다.
7. form submit
iframe
, fetch()
, Ajax
등을 사용해 사용자가 알아채지 못하게 공격을 진행한다.[CSRF Stealframe with 자동전송]
<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>
<form method="POST" action="https://0a78009604f862f3808a21b900a200af.web-security-academy.net/my-account/change-email" target="stealthframe">
<input type="hidden" name="email" value="normal@test.com">
</form>
<script>
document.forms[0].submit();
</script>
개인정보 수정과 같은 페이지에서 CSRF 취약점이 발생한다면 해당 요청에 인증 정보를 추가한다.
ex) 기존 패스워드 입력, 핸드폰 인증 번호 입력, 인증 링크 발송 등
게시판 글쓰기, 수정과 같이 패스워드 입력, 인증 번호 입력 등 인증을 하지 않는 페이지에서 CSRF 취약점이 발생한다면 Referer Check, CSRF Token, SameSite Cookie
등을 사용해 대응한다.
Captcha
bot
의 자동화 요청을 막기 위해서 captcha
사용
Server Side Request Forgery
서버가 외부 자원(API, resource)을 이용하는 URL
을 파라미터로 받는 경우
ssh, ftp, file
요청 등을 통해 내부망에 접근할 때파라미터로 url
요청하지 않는다.