🔎 CSRF란?
사용자가 의도하지 않은 요청을 하도록 요청을 위조하는 공격
ex) 비밀번호를 1234로 변경하는 request를 보내게 만들기
클라이언트 측에서 즉, 브라우저에서 악성 스크립트(HTML, CSS, 자바스크립트, 타입스크립트 등)를 실행시키는 공격
👉 Stored XSS
공격자가 악성스크립트가 포함된 데이터를 서버에 저장시키고, 클라이언트 즉 피해자가 그 데이터를 요청하여 응답받을 때 악성스크립트가 함께 포함되어 와서 브라우저에서 실행되어 공격이 일어나는 것
👉 Reflected XSS
url의 파라미터에 악성스크립트를 삽입하고 해당 url을 클라이언트가 어떠한 계기로 인해 전송했을 때 파라미터 값이 그대로 응답에 포함되어 돌아오는 경우 파라미터에 담겼던 악성 스크립트가 응답에 함께 포함되면서 피해자의 브라우저에서 실행되어 공격이 일어나는 것
👉 DOM based XSS
정상적으로 작성된 자바스크립트 코드에 취약점이 존재해, url 등의 클라이언트 소스를 가져와 DOM에 삽입할 때 악성 스크립트가 포함된 클라이언트 소스를 DOM에 삽입하게 되면서 발생하는 공격
의도하지 않은 request를 실행시키는 공격
XSS는 클라이언트 측에서 악성 스크립트가 실행되는 게 목표인 공격이기 때문에 응답에 악성스크립트가 포함되고 그게 실행되어야 한다는 게 포인트
CSRF는 클라이언트가 의도하지 않게 공격자가 바라는 행위를 하는 요청을 직접 해서 공격이 일어나는 것이 포인트
CSRF와 XSS가 만나면 zero click 공격도 가능합니다
아무것도 클릭하지 않았는데 공격이 일어날 수 있는 건데요
예를 들어 <img src="CSRF 요청"/>
과 같이 XSS 취약점이 있는 곳에 CSRF 공격이 결합되면, 사용자가 특정한 링크를 클릭하거나 첨부파일을 여는 등의 행위를 하지 않아도 공격이 일어나게 됩니다
CSRF 취약점은 모든 request에 있습니다
여기서 만약 특정 request가 클라이언트의 진짜 의도인지 확인하는 인증정보 없이 위험한 (ex. 비밀번호 변경) 요청을 한다면 그 request는 CSRF 취약점에 해당합니다
🔎 POST 방식으로 request 한다면 CSRF 공격에 대응할 수 있나요?
답은 ❌ NO ❌
공격자의 의도에 해당하는 request를 보내야 하니 피해자에게 조작된 request url을 보내 해당 url로 접속하게 만드는 GET 방식일 때만 CSRF 취약점 문제가 있을 것이라고 생각할 수 있지만, 그렇지 않습니다
CSRF는 인증정보 없이 request를 보내는 것이 포인트이기 때문에, POST 방식이어도 인증정보 없이 request를 한다면 CSRF 취약점일 수 있습니다
단, POST 방식일 때는 파라미터를 url로 보내는 것이 아니기 때문에, 피해자가 해당 POST request를 날리려면 POST 방식의 폼 제출이 필요하고, 이 때문에 XSS 취약점이 추가로 필요합니다
💡 Example
<iframe name="targetFrame" id="myFrame" style="display:none;"></iframe>
<form method="POST" action="mypage_update.php" id="myForm" target="targetFrame">
<input type="hidden" name="id" value="admin"/>
<input type="hidden" name="pw" value="admin"/>
</form>
<script>
document.getElementById('myForm').submit();
</script>
👉 CSRF 공격을 막기 위해 만들어진 랜덤 토큰
💡 Example
마이페이지에 접근할 때마다 랜덤 토큰을 발행해서, 회원정보를 수정할 때 해당 토큰을 함께 보내게 만든다
즉, request에 피해자가 직접 마이페이지에 접근해야만 알 수 있는 토큰이 필요하게 된다
➕ CSRF 토큰 우회
iframe으로 클라이언트가 직접 토큰 발행 페이지에 접속하게 한 뒤, 토큰을 탈취해 request를 위조