CSRF 공격 (2)
1. CSRF 공격 High 단계 실습
[그림 1-1] 패스워드 변경
CSRF 공격 탭에서 패스워드를 변경한다.
[그림 1-2] 토큰 값 비교
위에 그림은 사용자의 비밀번호 1234고 아래 그림은 공격자의 비밀번호인 hacker다. 두 그림을 비교하면 큰 차이가 없지만 user_token 값이 다르다는 걸 볼 수 있다. user_token값이 일치하지 않게 되면 웹 사이트도 정상적인 사용자로 인식하지 않게 되서 CSRF 공격이 불가능하다.
[그림 1-3] 토큰 변조
공격자가 원하는 패스워드로 요청을 보낸 뒤 토큰 값을 임의로 변조한 후 응답을 보낸다.
[그림 1-4] CSRF 공격 실패
토큰 값을 임의로 변조 후 응답을 보내면 CSRF 공격이 실패했음을 볼 수 있다. 공격자는 정확한 토큰 값을 입력해서 보내야 CSRF 공격에 성공하는데 서버에 요청을 보낼때마다 토큰 값이 랜덤하게 바뀌기 때문에 예측하기 어려워져 공격이 불가능하게 된다.
[그림 1-5] 우회 소스 코드
High 단계의 CSRF 공격을 우회하기 위한 소스코드를 분석한다. 크게 두가지 요청으로 나눌 수 있는데 첫번째 요청은 패스워드를 변경할 때 user_token 값을 가져온다. 두번째 요청에선 첫번째 요청에서 가져온 user_token 값을 분석한 후 CSRFtoken 변수에서 user_token 값을 추출한다. 그 후 추출한 user_token 값과 함께 응답을 보낸다.
[그림 1-6] 게시판 삽입
CSRF 공격을 우회하기 위해 게시판을 활용한다. 우회 파일이 저장되어 있는 웹서버 IP주소와 경로를 입력한 후 게시판에 글을 등록한다.
[그림 1-7] 스크립트 실행
스크립트가 실행되면 [그림 1-7]과 같이 토큰 값이 출력된다. 토큰 값이 출력되면 공격에 성공했을 가능성이 높다.
[그림 1-8] 계정 변경
공격에 성공하고 로그아웃 후 다시 로그인을 시도하면 기존 계정으론 로그인이 되지 않는다. 반면 hacker라는 패스워드를 입력한 후 로그인을 시도하면 로그인이 된다는 것을 볼 수 있다.
2. CSRF 공격 대응 방안
[그림 2-1] CSRF 공격 대응
CSRF 공격 대응 방안으로 기존 패스워드 입력을 요구하는 방법이 있다. 만약 기존 패스워드를 모른다면 패스워드 변경은 불가능하고 CSRF 공격도 전혀 통하지 않게 된다. 이 외에도 클라이언트가 서버에 토큰 값을 요청할 때 랜덤하게 토큰값을 바꿔서 요청하게 만들어 공격자가 토큰 값을 예측할 수 없도록 하는 방법과 Referer 헤더를 확인해 해당 사이트의 URL인지 아닌지 검사해서 CSRF 공격을 막는 방법도 존재한다.
[그림 2-2] 소스 코드
소스코드를 보면 user_token을 검사하는 코드가 존재한다. user_token을 검사한 후 토큰 값이 일치하지 않으면 CSRF 공격이 불가능하다. 또한 로그인 폼도 기존 패스워드, 변경할 패스워드, 변경할 패스워도 재확인 3가지로 구성되어 있어 반드시 기존 패스워드를 알아야 패스워드 변경이 가능하기 때문에 CSRF 공격이 불가능하다.
** 추가 대응 방안 **
XSS 공격과 CSRF 공격의 근본적인 차이점은 XSS공격은 공격자가 의도한 악성 스크립트가 클라이언트에서 실행되는 반면 CSRF 공격은 악성 스크립트 자체를 웹 서버에 요청해서 공격을 진행한다는 차이가 있다.
- 요청을 할 때 GET 방식보다는 POST 방식을 사용한다.(보안상의 안전 차이)
- 요청메시지의 Referer 헤더를 검사해서 CSRF 공격을 판별한다. Referer는 이전에 접속했던 주소를 알려주는 역할을 하는데 이 헤더를 검사하면 정상적인 요청인지 피싱성 요청인지 구별할 수 있게 된다.
- 입력을 처리하는 폼은 토큰을 사용해서 공격자의 직접적인 URL이 동작하지 않게끔 처리하고 세션 검증 및 2차 인증을 유도해 공격을 방지한다.
- 특정한 사용자를 구분할 수 있는 인수를 적용해서 철저한 검증을 통해 CSRF 공격을 방지한다.