CSRF는 사이트 간 요청 위조의 줄임말로, 공격자가 타 이용자의 권한을 도용하여 특정 웹 사이트의 기능을 실행하게 할 수 있다.
🌱CSRF 성공하기 위한 조건?
- 사용자는 보안이 취약한 서버로부터 이미 로그인되어 있는 상태
- 쿠키 기반의 서버 세션 정보를 획득할 수 있어야 함
두가지 조건이 모두 충족해서 CSRF 공격이 성공할 수 있다.
사용자는 보안이 취약한 A 웹사이트에 로그인하여 인증 쿠키를 브라우저에 저장한다.
공격자는 자신의 웹사이트 (예: attacker.com)를 만들고, 이 웹사이트에 CSRF 공격을 위한 악성 스크립트나 HTML 폼을 삽입한다.
사용자가 악성 요청을 자동으로 전송하는 스크립트가 포함되어 있는 공격자의 웹사이트를 방문한다.
악성 요청 전송
사용자가 악성 스크립트가 작성된 페이지 접근시 웹 브라우저에 의해 쿠키에 저장된 session ID와 함께 서버로 요청된다.
서버는 요청을 수신하고, 요청에 포함된 쿠키를 사용하여 사용자가 인증된 요청으로 처리한다.
⚠️이때 서버는 쿠키에 담긴 session ID를 통해 해당 요청이 인증된 사용자로부터 온 것으로 판단하고 처리한다. 그리고 사용자는 공격자의 웹사이트에서 의도하지 않은 작업이 실행되는 것을 알지 못한다.
❓ 의도하지 않은 작업?
위와 같은 작업들이 나도 모르게 실행된다면 정말 위험하다.
o 공격자가 업로드 한 악의적 행위 구문으로 인해 타 이용자의 권한 도용이 가능한지에 대해 점검한다.
🌱 양호
사용자의 입력 값에 대한 검증 및 필터링이 이루어지는 경우
💊 취약
사용자의 입력 값에 대한 검증 및 필터링이 이루어지지 않아 스크립트 실행이 가능한 경우
출처 : 보안 뉴스
<!DOCTYPE html>
<html>
<body>
<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target-website.com/change-password", true);
xhr.withCredentials = true; // 쿠키를 함께 전송하기 위해 설정
// 폼 데이터 구성
var params = "password_new=hacker1234&password_conf=hacker1234&change=change";
// 요청 헤더 설정
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// 요청 전송
xhr.send(params);
</script>
</body>
</html>
XSS와 CSRF 모두 공격자가 사용자의 권한을 빼앗아 악의적인 작업을 수행하다는 점과 사용자의 웹 브라우저를 이용하여 공격이 수행된다는 공통점이 있다.
그래서 결론적으로 말하면 XSS가 실행되면 스크립트 구문이 동작하기 때문에 CSRF도 당연히 실행된다.
CSRF는 XSS가 선행되어야 한다!
어찌보면 비슷한 취약점인데 다르게 취급하는 이유와 정확한 차이점이 무엇일까? 이 차이점을 구분하지 못한다면 스크립트 구문을 실행시킨다고 해도 현업에서 엉뚱한 취약점으로 분류하는 대참사가 발생할 수 있다. 제대로 이해하고 가자.
공격 과정에서 피싱을 이용하는 특성만 같고, 피싱 이후 진행되는 과정이 완전히 다르다.
공격대상 : XSS – Client, CSRF – Server
악성 스크립트를 클라이언트에서 실행시키고, CSRF는 웹 서버로 유도해 서버에서 동작하게 한다.
XSS는 사용자가 방문한 웹 페이지에 몰래 설치된 스파이가 사용자의 정보를 훔치거나 잘못된 행동을 유도하는 것, CSRF는 사용자가 신뢰하는 웹사이트로부터 허락 없이 명령(예: 비밀번호 변경)을 받아 대신 실행하게 만드는 것이다.