CSRF 알아보기

gyub·2025년 6월 27일
0

모의해킹 스터디

목록 보기
31/31

🔎 CSRF란?


사용자가 의도하지 않은 요청을 하도록 요청을 위조하는 공격
ex) 비밀번호를 1234로 변경하는 request를 보내게 만들기


✅ CSRF vs XSS

⭐ XSS

클라이언트 측에서 즉, 브라우저에서 악성 스크립트(HTML, CSS, 자바스크립트, 타입스크립트 등)를 실행시키는 공격

👉 Stored XSS
공격자가 악성스크립트가 포함된 데이터를 서버에 저장시키고, 클라이언트 즉 피해자가 그 데이터를 요청하여 응답받을 때 악성스크립트가 함께 포함되어 와서 브라우저에서 실행되어 공격이 일어나는 것

👉 Reflected XSS

url의 파라미터에 악성스크립트를 삽입하고 해당 url을 클라이언트가 어떠한 계기로 인해 전송했을 때 파라미터 값이 그대로 응답에 포함되어 돌아오는 경우 파라미터에 담겼던 악성 스크립트가 응답에 함께 포함되면서 피해자의 브라우저에서 실행되어 공격이 일어나는 것

👉 DOM based XSS

정상적으로 작성된 자바스크립트 코드에 취약점이 존재해, url 등의 클라이언트 소스를 가져와 DOM에 삽입할 때 악성 스크립트가 포함된 클라이언트 소스를 DOM에 삽입하게 되면서 발생하는 공격

⭐ CSRF

의도하지 않은 request를 실행시키는 공격


‼️ 정리

XSS는 클라이언트 측에서 악성 스크립트가 실행되는 게 목표인 공격이기 때문에 응답에 악성스크립트가 포함되고 그게 실행되어야 한다는 게 포인트

CSRF는 클라이언트가 의도하지 않게 공격자가 바라는 행위를 하는 요청을 직접 해서 공격이 일어나는 것이 포인트


✅ CSRF와 XSS의 조합

CSRF와 XSS가 만나면 zero click 공격도 가능합니다

아무것도 클릭하지 않았는데 공격이 일어날 수 있는 건데요

예를 들어 <img src="CSRF 요청"/> 과 같이 XSS 취약점이 있는 곳에 CSRF 공격이 결합되면, 사용자가 특정한 링크를 클릭하거나 첨부파일을 여는 등의 행위를 하지 않아도 공격이 일어나게 됩니다


✅ 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 Token

👉 CSRF 공격을 막기 위해 만들어진 랜덤 토큰

💡 Example

마이페이지에 접근할 때마다 랜덤 토큰을 발행해서, 회원정보를 수정할 때 해당 토큰을 함께 보내게 만든다
즉, request에 피해자가 직접 마이페이지에 접근해야만 알 수 있는 토큰이 필요하게 된다


➕ CSRF 토큰 우회

iframe으로 클라이언트가 직접 토큰 발행 페이지에 접속하게 한 뒤, 토큰을 탈취해 request를 위조

0개의 댓글