사용자가 웹 사이트에 정상적으로 접속하여 로그인한다.
사용자가 웹사이트에 로그인되어 있는 동안, 공격자가 이메일을 보내 악성 코드를 포함하고 있는 페이지를 여는 링크를 클릭하도록 피싱한다.
만약 사용자가 링크를 클릭하면, 공격자는 지정한 패스워드로 변경하는 요청이 자신이 이전에 로그인되어 있던 웹 사이트로 자동으로 전송된다. 그 결과, 사용자가 모르는 사이에 자신의 패스워드가 변경된다.
이제 공격자는 변경된 패스워드를 이용하여 해당 사용자 계정으로 로그인할 수 있게 된다.
※ 위의 공격이 실행되기 위해서는 1번의 조건이 필수적으로 선행되어야 한다.
먼저 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도 같이 전송됨을 볼 수 있다.
요청 메시지의 레퍼러(Referer) 헤더를 검사하여, 웹 메일이나 타 사이트에서 피싱을 당해 전송되는 요청을 실행하지는 않는다. 레퍼러 헤더는 해당 요청을 링크라고 있던 이전 웹 페이지의 주소를 알려주는 헤더이다.
CSRF 토큰을 사용한다. 쿠키 외에 공격자가 추측할 수 없는 값이 요청 메시지의 파라미터 등에 포함되어 있다면 공격자는 CSRF 공격을 성공시키기 어려워진다. 이때 CSRF 공격 대응을 위해 포함시키는 랜덤한 값을 CSRF 토큰이라고 한다.
구현
먼저 웹 애플리케이션이 CSRF 토큰을 매 응답마다 랜덤하게 생성하여 히든 폼 필드 등을 통해 클라이언트로 보낸다.
클라이언트는 이전 응답 메시지에 포함된 토큰 값을 다음 요청 시 포함시켜 전송한다.
웹 애플리케이션이 CSRF 토큰 값을 검사하면 정상적인 과정을 통해 전달된 요청인지를 확인할 수 있다.
임의의 자바스크립트를 실행할 수 있는 크로스 사이트 스크립팅 공격을 이용하여 POC 코드와 같이 요청을 전송시키면 이때의 레퍼러 헤더는 크로스 사이트 스크립팅 취약점이 있는 DVWA가 되기 때문에 레퍼러 헤더 검사를 우회할 수 있게 된다. 또한 CSRF 토큰을 알아내는 것 또한 가능하다.
그래서 가장 좋은 방법은 패스워드 변경과 같은 중요한 기능을 수행할 때, 기존의 패스워드를 다시 한 번 입력받도록 하여 사용자 본인이 직접 기능을 실행하는지 확인하는 것이다.(+CAPTCHA)
위 글은 '화이트 해커를 위한 웹 해킹의 기술 최봉환 저'를 공부하며 작성한 글입니다.
Step8. 파일 업로드 공격 (0) | 2021.02.28 |
---|---|
Step7. 파일 인클루전 공격 (0) | 2021.02.27 |
Step5. 크로스 사이트 스크립팅 공격 (0) | 2021.02.25 |
Step4. 커멘드 인젝션 공격 (0) | 2021.02.24 |
Step3. SQL인젝션 공격 (0) | 2021.02.23 |
댓글 영역