오늘은 CSRF (Cross Site Request Forgery) 에 대하여 알아보겠습니다.
1 . CSRF(사이트 간 요청 위조) 란?
→ 피해자가 서버로 공격자가 원하는 요청을 하게 만드는 것.
공격자가 피해자의 권한을 도용하여 마이페이지 에서 정보를 수정하거나 , 비밀번호 변경 ,게시물 작성 등 여러 기능을 공격자가 원하는대로 동작할 수 있게 만드는것을 의미합니다.
공격방식은 예를들어서 단계별로 설명해드리자면.
1단계 : 공격자는 원하는 기능의 요청을 확인한다.
2단계 : 확인한 요청을 공격자가 원하는 동작을하는 URL(주로 GET방식) 링크를 피해자가 동작시키도록 유도한다.
(예를들어 비밀번호를 1234로 바꾼다)
3단계 : 피해자가 링크를 클릭하면 자신의 비밀번호는 1234로 바뀐다.
4단계 : 공격자는 그 비밀번호로 피해자의 아이디에 로그인을 할 수 있다.
이런 요청은 피해자의 권한이 있어야 하는데,요청을 위조시킴으로써 타인의 권한을 이용할 수 있는 공격입니다.
그러면 주요 기능 요청을 GET 방식이 아닌 POST 방식으로 하면 되는거 아닌가요?
Link->GET방식공격 , <form> -> POST 방식공격 이라고 분류해볼수 있습니다.
POST방식으로 요청을 하더라도 XSS 취약점과 연계하여 원하는 form 요청을 보내주면 됩니다.
*CSRF 공격포인트
-놀랍게도 저희가 서버로 하는 모든 요청에서 일어날 수 있습니다.
그리하여 컨설턴트의 주관적인 판단하에 취약점인지 아닌지가 결정됩니다.
- 요청에 인증 방식이 없는 경우는 CSRF 취약점이 될 수 있습니다.
2. CSRF 와 XSS 의 관계
"뭔가 언뜻보면 CSRF 와 XSS 가 결국 같은거 아닌가? 왜냐하면 공격자가 원하는 동작을 클라이언트가 하게 만드는 것이니깐 같은 공격처럼 느껴지는데?" 라고 생각이 드실수 있습니다.
하지만 CSRF 와 XSS 는 엄연히 다른 개념입니다.
- XSS : 스크립트를 삽입하여 피해자의 브라우저에서 스크립트가 동작하게 하는 공격.
- CSRF: 피해자가 서버로 위조된 요청을 하게하는 공격.
XSS 와의 연계를 통해 위조된 요청을 서버로 보내는 CSRF 공격을 하다보니 둘다 XSS 처럼 느껴지실수 있는데, 혼동이 없으셨으면 좋겠습니다.
<XSS 와 CSRF 를 연계하는법>
-GET 요청일경우
<Img src="__CSRF 유도 URL__">
=> 이미지 태그를 이용하면 CSRF 링크에 클릭없이 GET 요청을 유도할 수 있습니다.
-POST 요청일경우
<form method="POST" action="__CSRF 유도 URL__" id="myform">
<input type="hidden" name="password" value="123123"></input>
<script>
document.getElementById('myform').submit(); // submit 함수를 통해 피해자의 클릭없이 공격가능.
</script>
=> submit() 함수를 이용해서 작성된 form 태그의 POST 요청을 클릭없이 유도하게 할수 있습니다.
3. CSRF 대응책
1. Referrer 검증
요청이 들어올 때 요청 header 에 담겨있는 referrer 의 도메인을 확인하여 같은 도메인 인지 확인 후 응답하는 방법입니다. 하지만 동일 사이트 내에서 XSS 취약점이 발견된다면 XSS 를 통해 같은도메인에서 동작되게 공격을 할 수 있으므로 이 점을 유의하여 대응해야 합니다.
2. CSRF Token
사용자가 굳이 인증방식에 필요한 파라미터를 넣지않아도 정보를 수정하거나 중요 기능들을 할때 인증방식을 추가하여 CSRF 를 막고자 하기 위해 CSRF Token 이란것을 도입하게 되었습니다.
사용자의 세션에 임의의 값을 저장하여 사용자가 특정기능을 하는 요청마다 그 값을 포함하여 전송하여 토큰값이 일치하는지 여부에따라 응답을 달리하는 인증절차 역할을 하는 Token 입니다.
링크로 예시를 들자면
<CSRF에 취약한 링크>
https:~~~~~~~/?password_new1234&password_conf=1234&Change=Change
<CSRF에 강한 링크>
https:~~~~~~~/?password_new1234&password_conf=1234&Change=Change&CSRFToken=_______
첫번째 링크는 인증절차가 없어 링크를 클릭할시 비밀번호가 1234로 변하겠지만
두번째 링크는 인증절차가 있어 링크를 클릭하더라도 토큰값이 뭔지 유추할 수가 없어 password수정이 불가합니다.
긴 글 읽어주셔서 감사합니다!
'웹해킹' 카테고리의 다른 글
Authentication&Athorization (인증/인가 취약점)이란? (0) | 2024.08.03 |
---|---|
File upload vulnerability - 파일 업로드 취약점 (1) (2) | 2024.07.19 |
XSS 공격 대응방안 (0) | 2024.06.30 |
XSS(Cross-site scripting)기법 (0) | 2024.06.24 |
SQL Injection(SQLi) (0) | 2024.05.27 |