Step6. 크로스 사이트 요청 변조(CSRF) 공격
Step6. 크로스 사이트 요청 변조(CSRF) 공격
CSRF 공격 개요
방법
-
사용자가 웹 사이트에 정상적으로 접속하여 로그인한다.
-
사용자가 웹사이트에 로그인되어 있는 동안, 공격자가 이메일을 보내 악성 코드를 포함하고 있는 페이지를 여는 링크를 클릭하도록 피싱한다.
-
만약 사용자가 링크를 클릭하면, 공격자는 지정한 패스워드로 변경하는 요청이 자신이 이전에 로그인되어 있던 웹 사이트로 자동으로 전송된다. 그 결과, 사용자가 모르는 사이에 자신의 패스워드가 변경된다.
-
이제 공격자는 변경된 패스워드를 이용하여 해당 사용자 계정으로 로그인할 수 있게 된다.
※ 위의 공격이 실행되기 위해서는 1번의 조건이 필수적으로 선행되어야 한다.
CSRF 공격 실습
-
먼저 CSRF 실습 페이지를 접속하고, 비밀번호를 바꾼다.
-
위의 요청 메시지를 살펴보면, GET 메소드로 요청이 전송되며, password_new, password_conf 파라미터에 입력한 패스워드가 전달되고 change파라미터에는 change라는 값이 전달되는 것 등을 볼 수 있다.
-
즉, 이 요청에는 PHPSESSID 쿠키만 랜덤한랜덤 한 값을 가지고 있을 뿐, 나머지 파라미터, 헤더 정보 등은 모두 지정된 값을 가진다. 따라서 공격자는 사용자의 랜덤 한 PHPSESSID 쿠키 값만을 알아내거나 전달시킬 수 있으면 위의 파라미터 값들을 포함한 요청 메시지를 생성하여 패스워드를 변경할 수 있게 된다.
-
다음으로는 위와 같이 html 코드를 이용해서 공격을 수행하는 데, 스크립트 부분에서 위에서 봤던 요청과 password 입력 값을 제외하고 똑같이 구성함을 알 수 있다.
-
또한 자바스크립트의 XMLHttpRequest()를 사용한 AJAX 기법을 이용하여 poc()가 호출될 때 새로운 요청이 전송되도록 만드는데, 그 중에서 특히 withCredentials 속성을 true로 설정하여, 요청이 전송될 때 웹 브라우저가 쿠키를 자동으로 같이 전송하도록 만든다.
-
밑의 body는 사용자가 링크를 누르면 poc() 함수가 실행되도록 한 것이다.
-
그리고 사용자가 dvwa에 접속한 상태에서 http://localhost/csrf.html에 접속하게 한다.
-
접속하면 위의 화면이 출력되는데, 여기서 사용자가 Click!을 누르게 되면 비밀번호가 변경된다.
-
위와 같이 PHPSESSID도 같이 전송됨을 볼 수 있다.
CSRF 공격 대응
방법
-
요청 메시지의 레퍼러(Referer) 헤더를 검사하여, 웹 메일이나 타 사이트에서 피싱을 당해 전송되는 요청을 실행하지는 않는다. 레퍼러 헤더는 해당 요청을 링크라고 있던 이전 웹 페이지의 주소를 알려주는 헤더이다.
-
CSRF 토큰을 사용한다. 쿠키 외에 공격자가 추측할 수 없는 값이 요청 메시지의 파라미터 등에 포함되어 있다면 공격자는 CSRF 공격을 성공시키기 어려워진다. 이때 CSRF 공격 대응을 위해 포함시키는 랜덤한 값을 CSRF 토큰이라고 한다.
-
구현
-
먼저 웹 애플리케이션이 CSRF 토큰을 매 응답마다 랜덤하게 생성하여 히든 폼 필드 등을 통해 클라이언트로 보낸다.
-
클라이언트는 이전 응답 메시지에 포함된 토큰 값을 다음 요청 시 포함시켜 전송한다.
-
웹 애플리케이션이 CSRF 토큰 값을 검사하면 정상적인 과정을 통해 전달된 요청인지를 확인할 수 있다.
-
-
임의의 자바스크립트를 실행할 수 있는 크로스 사이트 스크립팅 공격을 이용하여 POC 코드와 같이 요청을 전송시키면 이때의 레퍼러 헤더는 크로스 사이트 스크립팅 취약점이 있는 DVWA가 되기 때문에 레퍼러 헤더 검사를 우회할 수 있게 된다. 또한 CSRF 토큰을 알아내는 것 또한 가능하다.
-
그래서 가장 좋은 방법은 패스워드 변경과 같은 중요한 기능을 수행할 때, 기존의 패스워드를 다시 한 번 입력받도록 하여 사용자 본인이 직접 기능을 실행하는지 확인하는 것이다.(+CAPTCHA)
위 글은 '화이트 해커를 위한 웹 해킹의 기술 최봉환 저'를 공부하며 작성한 글입니다.