상세 컨텐츠

본문 제목

[보안이슈] OAuth Misconfiguration(3) : 취약점 사례(CSRF)

기술보안/Web

by about_SC 2020. 3. 10. 13:30

본문

[보안이슈] OAuth Misconfiguration(3)

 

01___Intro

OAuth Misconfiguration으로 발생할 수 있는 취약점 사례에 대해 살펴보기로 하자.

 

02___취약점 사례

01) CSRF

하나의 서비스에 여러개의 SNS 계정을 연동할 수 있습니다.
계정을 연동하기 위해서는 OAuth 인증 과정을 통하게 되는데, 이 때 CSRF 공격으로 피해자 계정에 공격자 계증을 연동할 수 있습니다.

SNS 계정 연동 FLOW

1. 기존 계정과 SNS 계정 연동 요청
2. 요청 SNS 로그인 페이지 출력 (Client ID 값이 포함된 로그인 페이지)
3. ID/PW 를 통해 SNS 계정에 로그인
4. 로그인 성공 시 인증 서버로부터 Authorization code를 발급 받음 (Authentication Server -> 사용자)
5. 발급 받은 code 값과 state 값을 Client 서버로 전송 (사용자 -> Client Server)
6. code 값과 state 값 검증 후 Client 서버에 로그인 되어있는 계정과 SNS 계정이 연동됨

여기서 state 값은 CSRF token 역할을 하는데, 만약 state 값에 대해 검증이 누락되어 있거나 미흡할 경우 사용자 계정을 탈취할 수 있습니다. 5번 과정에서 Client 서버로 전송하는 내용을 추출하여 만든 CSRF 공격 페이지에 사용자(피해자)가 접근하면, 사용자(피해자) 계정과 공격자 계정이 연동되며, 공격자의 SNS 계정을 통해 사용자(피해자) 계정으로 로그인을 할 수 있습니다.

 

02) CSRF 실제사례

https://medium.com/@Jacksonkv22/oauth-misconfiguration-lead-to-complete-account-takeover-c8e4e89a96a

 

Oauth misconfiguration lead to complete account takeover

Hello..security geeks

medium.com

 

redacated.com 이라는 사이트가 존재한다고 가정해보자.
임시메일을 사용하여 계정을 만들고 로그인 후,
redacated.com 계정을 이용해 Facebook과 Google을 동기화하여
OAuth 기능을 이용해 계정에 쉽게 로그인이 가능하다는 것을 확인할 수 있었다.

 

Facebook 아이콘을 클릭하여 OAuth인증을 시도하는 최초 패킷을 Burp로 잡아보면 아래와 같은 내용을 확인할 수 있었다. 해당 패킷에서 파라미터를 확인 시 state에 대한 파라미터가 존재하지 않았고, 이는 CSRF 공격에 취약할 수 있음을 의미한다. Facebook에 성공적으로 인증한 후 발급된 Authorization 키를 이용해 redacated.com 서비스에 인증을 시도하는 Facebook에서의 콜백을 가로챌 수 있다.

 

아래는 Facebook에서의 콜백에 대한 패킷이다.

 

CSRF 공격을 시도하기 위한 피싱 페이지를 제작해보자. 코드는 아래와 같다.
코드 내 들어가는 Authorization 키는 공격자가 자신의 페이스북 계정을 정상 연동 시도 시 발생하는 키 값을 넣어준다.

 

이제 피해자 계정에서 해당 취약점을 테스트 할 수 있습니다. redacted.com 에서 테스트 계정 생성 후 해당 계정에 로그인 후 설정 페이지로 이동하면 Facebook과 연동하는 옵션을 확인할 수 있습니다. 이제 새 탭에서 이전에 작성된 악성 페이지를 열고 제출 버튼을 클릭 시 공격자의 페이스북 계정과 피해자의 redacted.com계정이 연동되어 공격자의 Facebook 계정으로 희생자 계정 로그인이 가능해짐을 확인할 수 있습니다.

 

03___CSRF 보안방안

- state 파라미터를 사용해야 합니다.

state 파라미터를 활용해야 합니다. OAuth 2.0 인증은 애플리케이션 이전 상태를 복원할 수 있는 state 파라미터를 제공합니다. 해당 파라미터는 인증 요청에서 클라이언트가 설정한 상태 보존하고 응답에서 클라이언트가 사용할 수 있게 합니다.

조금 더 자세히 말하자면, 인증을 시작할 시 인증 요청과 관련하여 고유하고, 추측할 수 없는 값이 동시에 발급되어 각 절차마다 해당 값이 일치한지 확인함으로써 비정상적인 공격을 막을 수 있게 해줍니다.

관련글 더보기