공격자는 변조된 HTTP 요청을 통하여 이미지 태그, XSS이나 기타 방법들을 통하여 피해자가 변조된 HTTP 요청을 하도록 속인다. 만약 피해자가 이미 해당 웹 사이트에 대해 인증이 된 상태라면, 재인증 절차 없이 피해자의 권한으로 공격자의 의도되로 공격이 성공된다. 다시 말하면 공격자는 인가된 피해자의 권한으로 악성 스크립트를 서버에 요청하고, 서버는 요청에 대한 처리를 하게 되는 것이다.
발생 원인
공격자가 자신이 요청한 특정 동작에 대해 전체 과증이 예측 가능할때 발생한다. 주로 프록시 툴을 사용하여 전체 과정을 예측하고 모자르는 부분은 직접 뽑아낼 수도 있고, 뽑아낸 내용 안에는 각종 인증 관련 사항들이 포함될 수 있기 때문에 공격자는 정상적인 요청과 구별될 수 없는 변조된 요청을 만들 수 있다.
XSS와의 차이점
XSS는 공격자가 세션 하이재킹, 웹 사이트 변조, 악성 스크립트 삽입 등을 통하여 희생자의 브라우저에 스크립트를 실행하는 것으로 대부분
희생자가 목표가 되는 것에 비하여, CSRF는 우선 피해자의 권한이 허락하는 범위에서만 데이터를 변조하거나 특정 액션을 발생시키는 공격으로 대부분 웹 서버가 목적인 공격이다.
CSRF 실습
WebGoat의 CSRF 문제의 초기화면은 다음과 같다.
문제의 주된 내용은 "뉴스그룹에 악성 URL이 포함된 이메일을 이미지를 (사이즈 1*1) 이용하여 보내라" 라는 것이다.
문제에서 요청한 "transferFunds=4000"을 연결 연산자로 이용하여 위와 같이 URL을 요청한다. 위 사진처럼 보내면 공격이 성공할 것처럼
보이지만 실제로 Submit 버튼을 누를경우 영소문자와 숫자를 제외한 대부분의 문자들은 URL Character-Set에 의하여 다음과 같이 변환된다.
Body 부분(=아래 칸)의 내용이 본인이 요청한 URL 인데, 완전히 다른 형태로 보내지는 것을 볼 수 있는데 저렇게 보내지면 '<' '>' 태그가
유효하지 않아 실제적인 공격은 불가능하게 된다. 따라서 해당 부분은 다시 변조해야 하는데 URL을 잘 보게 될 경우 "message=" 뒤부터 "&SUBMIT" 전까지 부분이 본인이 생성한 실제 URL 임을 알 수 있다. 따라서 이를 다시 공격 URL로 다음의 사진과 같이 변조해야 한다.
URL 재 변조후 SUbmit을 누르게 되면 다음과 같이 공격이 성공적으로 이루어 졌다고 나타난다.
대응 방안
CSRF 공격은 대부분 XSS 공격을 기반으로 하기 때문에 XSS 취약점을 예방하면 같이 예방되는 효과가 나타난다.