Intro

OAuth 2.0은 기존에 아이디 / 비밀번호로 로그인하던 인증(자격 증명)을 타 서비스에서도 인증할 수 있도록 하는 권한 부여 프레임워크 입니다.

예를 들어, Sign in with Google 처럼 자신이 로그인하고자 하는 서비스는 구글이 아니지만, 구글이 대신 자격 증명을 해주는 느낌입니다.

요즘은 대부분의 서비스에서 OAuth 기능을 제공하고 있어 그만큼 취약점에 대한 보안 조치들이 잘 되어있어 발견 가능성은 낮은 것 같습니다.😂

Detect & Exploit

Detect

우선 OAuth 기능이 있는 곳이면 시도해볼만 합니다.

Exploit

PortSwigger에 해당 OAuth관련 좋은 문제들이 있어서 해당 문제 풀이로 Exploit을 적겠습니다. - PortSwigger OAuth 2.0 Lab

Redirect URI

Lab: OAuth account hijacking via redirect_uri
OAuth 프로세스에서 Social 계정으로 로그인 시 Social 계정에 대한 자격 증명을 code형태로 전달해줘야 하는 서버 URI 정보가 redirect_url 파라미터에 담기는데, 해당 과정에서 취약점이 발생한다.

  1. Social 계정 로그인 시도 시 Social 서비스에 전달 할 code를 받을 서버 URI 전달 패킷을 복사한다.
  2. 해당 URL에서 redirect_uri를 공격자 서버로 변조 후 피해자에게 전달한다.

  3. 공격자 서버의 Log 확인 시 피해자의 Social 계정 자격 증명이 담긴 code 파라미터 값을 확인할 수 있다.
  4. 확인한 code값으로 callback 주소를 생성 후 접근 시 정상적으로 피해자 계정으로 로그인할 수 있다.
    Payload : https://0ad2005004bece4582e3883400a400d8.web-security-academy.net/oauth-callback?code=rHsLjXJW5TJThb0IhxNAlXML1jLg6-xo3gSJQiJef1k

CSRF

Lab: Forced OAuth profile linking
Blog 관리자 계정과 Social 계정(OAuth)을 연동해야하는 문제로 OAuth 프로세스 중 Social 계정 로그인 후 Social 계정 인가 Code 를 Blog 서버에 전달해주는 과정(유저에게 302 Redirect로 전달)이 존재하는 데 해당 과정에서 취약점이 발생한다.

  1. Social 계정과 연동 시작
  2. Social 계정 로그인 후 Blog 계정과 연동 시에 필연적으로 전달해야 하는 code파라미터를 담은 Redirect URI 복사 및 해당 패킷 Drop
    *해당 부분이 가장 중요한 부분으로 Drop의 이유는 code가 일회성이기 때문입니다.
  3. 복사한 URI를 피해자에게 전달한다.
  4. 피해자가 해당 URI에 접근할 시 피해자의 Blog 계정과 공격자의 Social 계정이 서로 연동 됨.

Etc

그 외 다양한 방법이 PortSwigger Lab에 있는데, 제 생각에는 정말 특이 케이스라고 판단되어 자세히 적지는 않겠습니다.

🔥가장 중요한 건 OAuth 프로세스의 허점(code, redirect uri 등)과 계정 연동 시 잘못된 개발이기에 해당 부분을 중점으로 알아두시면 될 것 같습니다.😄

Security Measures

Redirect URI

redirect url 주소를 화이트 리스트로 검증하면 된다.

☑️이미 구글, 카카오, 애플 등과 같은 대부분의 서비스에서 사용 중인 OAuth 프레임 워크의 경우 화이트 리스트에 등록되지 않은 URL로는 인증해주지 않는다.

CSRF

code 파라미터를 전달할 때, state 파라미터(CSRF Token과 동일 역할)를 같이 보내 검증하면 된다. 이 때, 연동하는 경우 이미 서비스 계정으로 로그인 되어 있으니, 세션과 연동하여서 검증하면 된다.

References

OAuth 2.0 - Security and Vulnerabilities