이번 포스팅에서는 CSRF의 개념에 대해 알아볼 것이다.
CSRF 공격은 XSS 취약점을 활용하면 효과가 더 극대화되기 때문에 자주 연계되지만, 개념 측면에서는 둘은 서로 무관한 공격이다.
① CSRF란?
CSRF는 이용자의 세션 정보를 가지고 이용자가 원치 않는 요청을 하게 만드는 공격이다.
사용자의 요청을 중간에 위조하는 것이 아니라, 사용자인 척을 하고 요청을 보내는 것이다.
흔한 오해(?) 중 하나로 XSS는 클라이언트 측 공격, CSRF는 서버 측 공격이라는 개념이 있는데 페이로드가 실행되는 곳에 차이가 있을 뿐, 둘 다 이용자를 공격하는 취약점이다.
② CSRF 발생원인
CSRF 취약점의 근본적인 원인은, 서버가 요청자를 구분하지 못하기 때문이다. 달리 말하면 요청을 하는 사용자에 인증 과정을 거치지 않기 때문이다. 비밀번호를 바꿀 때 현재 비밀번호를 입력하는 것이 바로 이 인증 작업이다.
③ CSRF의 공격 / 방어 시나리오
공격자가 비밀번호를 변경하는 공격을 수행한다고 가정하자.
1) 요청이 GET 방식일 때
어떤 요청이 GET 방식이라면, XSS와 연계해서 비밀번호를 변경하는 링크를 만들어서 (Reflected XSS) 사용자가 클릭하게 만들거나, img 태그의 경로 src에 비밀번호를 변경하는 링크를 넣어서 (Stored XSS) 공격할 수 있다.
여기서 태그를 삽입할 수 있는 것이 XSS 취약점, 요청을 했을 때 이 요청을 허용하는 것이 CSRF 취약점이다.
2) 그렇다면 요청을 POST로 바꾸자!
만일 요청이 POST 방식이라면 직접 form 태그를 작성하여 공격이 가능하다.
<form action = "비밀번호를 변경하는 페이지의 URL" method = "POST">
<input type = "hidden" name = "password" value = "1234"/>
<input type = "submit" value = "click" />
</form>
위와 같이, 비밀번호 변경에 필요한 값들을 원하는 값(1234)으로 적어 input type을 hidden으로 설정해둔 뒤, 사용자가 Click 버튼을 누르면 POST 방식으로 파라미터를 넘기도록 만들어준 form 태그를 게시판 같은 곳에 올린다.(게시판에 올리는 부분 역시 XSS 취약점이라고 할 수 있다.) 사용자가 버튼을 클릭하면, 자신도 모르는 사이에 비밀번호가 변경될 것이다.
+) 버튼을 적당히 다른 기능인 것처럼 숨기면 되지만, 혹시 너무 수상할 것 같다면 <script> 태그를 추가해서 공격을 자동화시킬 수 있다.
<script>
document.forms[0].submit();
</script>
+) POST 방식이 실행되면, 페이지가 이동되어 수상해 보일 수 있다. 따라서 <iframe>을 이용하여 화면 안에 화면을 안 보이게 만들어준 후, form에서 target으로 이 화면을 지정해 Redirect 시켜주는 방법을 활용할 수 있다.
<iframe width = "0" height = "0" border = "0" name = "hiddenframe" style : "display : none"></iframe>
<form action = "" method = "POST" target = "hiddenframe">
<input />
</form>
<script>
document.forms[0].submit();
</script>
3) 인증 수단을 추가하자!
GET 방식과 POST 방식 모두 취약점이 존재했다. 따라서 결국 사용자의 인증 과정을 거쳐야 한다.
만일 XSS 취약점이 존재하지 않는다면, 인증 수단으로 토큰을 추가하는 방식으로 CSRF 공격을 막을 수 있다.
XSS 취약점이 존재하더라도, CORS 정책(Cross Origin Resouce Sharing : 출처가 다른 곳의 리소스를 사용할 수 있는 정책)이 금지되어 있거나 iframe 접속을 막는다면 CSRF 공격을 막을 수 있다.
'WEB HACKING > 웹 해킹[이론]' 카테고리의 다른 글
File Upload 공격(2) (0) | 2021.12.12 |
---|---|
File Upload 공격 (0) | 2021.12.11 |
XSS : Cross-Site Scripting 대응 방안 (0) | 2021.11.25 |
XSS : Cross-Site Scripting (0) | 2021.11.15 |
SQL Injection 대응 방법 (0) | 2021.11.12 |
댓글