본문 바로가기

보안지식/CSRF

CSRF 정리

안녕하세요 이번에는 CSRF 즉 Cross Site Request Forgery 공격을 공부하겠습니다.

 

이번 공격을 요약을 하면 클라이언트가 모르게 비밀번호를 바꾸게 하는 공격입니다.

어떻게 하는지는 실습하면서 보여드리는 데 이번 포스팅은 일단 이론만 설명드리고

 

다음 포스팅에 실습하면서 보여드리겠습니다.

 

 

- CSRF ?-

 

어떡해 보면 XSS와 비슷해보이지만 다른 공격입니다.

 

공격자가 CRSF 스크립트가 포함된 메시지 또는 게시물을 넣었을 때 

사용자가 그 스크립트을 확인하는 순간 사용자가 사용하는 세션을 가져오고

그걸 통해 비밀번호를 바꾸거나 다른 정보를 빼오는 겁니다.

 

방금 세션을 가져온다고 했잖아요? 바로 이 세션을 이용해서 악의적인 공격을 하는 것이 주 공격입니다

 

그래서 제약이 있습니다. 사용자가 로그인을 한 상태여야만 가능한 공격입니다.

 

그래서 게시판, 메일함 등 로그인이 가능한 장소가 공격하는 장소입니다!

 

 

간단하게 예시를 들자면

 

마이 페이지에 newpass의 파라미터에 값을 담고 요청 보내면 비밀번호가 변경된가고 생각해 봅시다.

 

그럼 mypage.php?newpass=1234 이 링크만 있으면 비밀번호가 변경되겠죠?

그러니 세션만 있으면 이 링크처럼 공격을 하는 겁니다.

 

 

** 어디서 발생하느냐?

모든 요청에서 발생합니다!

정확힌 민감한 요청에서 발생하는 거죠.

방금 설명드린 것처럼 비밀번호 변경, 이메일 주소 변경, 관리자 계정 등록 등등

 

 

 

 

 

CSRF의 공격 방법-------------------

 

 

[1] GET 방식으로 공격하는 방법

 

GET 방식으로 공격하는 방법은 XSS와 크게 차이가 없습니다.

악의 적인 스크립트가 담긴 링크를 생성하고 사용자가 로그인한 상태에서 클릭만 하면 그 악의적인 공격이 통하는 겁니다.

 

 

[2] POST 방식으로 공격하는 방법

-> XSS 취약점을 활용

 

CSRF을 다시 정리하자면

피해자가 자신의 의도와는 다르게, 자신도 모르게 서버로 임의의 요청을 하게 만드는 공격입니다.

그래서 form 태그랑 iframe을 이용하여 해커 서버에 보내게 하는 겁니다.

 

이 POST 방식은 우선 XSS 공격을 이용하여 CSRF으로 공격할 수가 있습니다.

 

간단히 말씀드리자면 XSS는 링크로 담아서 공격이 가능하잖아요?

그러니 링크로 해커의 피싱 사이트로 연결을 하는 겁니다.

 

그리고 해커의 피싱 사이트에 로그인이나 비밀번호나 게시물을 보게 해서 자신이 원하는 정보를 따옵니다.

그리고 저희는 그 정보로 CSRF 공격을 하는 겁니다.

 

<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;"></iframe>

<form method="POST" action="https://0a78009604f862f3808a2900a200af.web-security-academy.net/my-account/change-email" target="stealthframe">
<input type="hidden" name="email" value="hatecomputer@test.com">
</form>
<script>
document.forms[0].submit();
</script>

 

예시로 이 코드를 보시면 ifame으로 새창을 열리는데 display:none 덕분에 눈에 보이지 않습니다.

그리고 form 태그에 POST방식으로 change-email에 값을 보내게 하는 겁니다.

 

그러니  바로 이메일의 값이 변경이 되겠죠.

 

 

 

[3] Referer 활용

 

Referer은 이 요청이 어디에서 한 건지 알려주는 헤더 구문 중 하나입니다.

서버는 이 것을 이용하여 공격을 대응하려고 합니다. referer 헤더가 있으면 검사 시작을 합니다.

 

그런데 문제점이 개발자가 referer 헤더가 없는 경우엔 그냥 패스하는 경우가 있습니다.

 

이때 이 Referer 헤더가 없으면 그냥 값이 전송되는 것을 이용하여 저희는 이 헤더를 없애고 보낼 수 있습니다.

메타 태그를 이용하면 됩니다.

 

<meta name="referrer" content="no-referrer"> 이러면 메타 값이 없이 보내게 됩니다.

 

 

[4] CSRF Token

이 토큰은 오로지 CSRF을 막기 위해 만든 대응 방법입니다.

 

Token은 랜덤 한 값을 할당합니다. 그러니깐 만약 비밀번호 변경하는 페이지인 Mypage에 들어가면

자동으로 랜덤으로 Token을 할당을 하는 겁니다. 그리고 비밀번호 변경할 때 이 토큰이 일치해야만

수정이 가능하는 대응 방안입니다.

 

우회하는 방법이 있습니다. XSS 공격이랑 같이 활용하면 됩니다.

다른 페이지에 있는 XSS 취약점을 이용해 피해자가 Mypage 들어가게 해 Token을 할당하는 동시에

그 Token을 가져옵니다. 그리고 저희는 가져와서 변경하게 하는 겁니다!

 

.

.

.

.

.

글만 읽으시다 보니 이해가 잘 안 되실 거예요.

근데 실습하면서 하기엔 내용이 너무 많아서 아예 실습하는 것은 한 포스팅에 하기로 했습니다!

 

그럼 다음 포스팅에 뵙겠습니다!

 

 

 

 

'보안지식 > CSRF' 카테고리의 다른 글

CSRF 2번 공격 시나리오  (0) 2023.05.28
CSRF 1번 공격 시나리오  (2) 2023.05.27
CSRF 공격 - 실습 (3번 풀이)  (2) 2023.05.22
CSRF 공격 - 실습 (2번 풀이)  (0) 2023.05.21
CSRF 공격 - 실습 (1번 풀이)  (0) 2023.05.21