[하루한줄] Hacking JSON Web Tokens (JWTs)

URL

Target

  • Web, JWT

Explain

JSON 웹 토큰(JWT)은 상용 애플리케이션에서 널리 사용되는 액세스 토큰 유형입니다. JSON 형식을 기반으로 하며 토큰의 무결성을 보장하기 위한 토큰 서명을 포함합니다. 이 포스트에서는 JSON 웹 토큰(및 일반적으로 서명 기반 토큰) 사용의 보안 영향과 공격자가 액세스 제어를 우회하기 위해 이를 악용하는 방법에 대해 이야기하고 있습니다.

JWT는 헤더, 페이로드, 서명의 세개의 구조로 되어 있으며 각 데이터를 Base64URL로 인코딩해 “.”로 연결하여 완전한 토큰을 얻습니다.

[---------------헤더----------------].[-----------페이로드-----------].[-------------------서명--------------------]
eyBhbGcgOiBIUzI1NiwgdHlwIDogSldUIH0K.eyB1c2VyX25hbWUgOiBhZG1pbiB9Cg.4Hb/6ibbViPOzq9SJflsNGPWSk6B8F6EqVrkNjpXh7M

JWT를 이용한 해킹 공격 유형은 다음과 같습니다.

  • Change up the algorithm type: 헤더의 alg 필드를 변조하는 것입니다.

    1. None algorithm : alg 필드가 "none"으로 설정되어 있으면 서명 섹션이 비어 있는 경우 모든 토큰이 유효한 것으로 간주됩니다
    2. HMAC algorithm : HMAC 알고리즘을 사용하면 동일한 키로 서명/검증됩니다. RSA의 경우 토큰은 먼저 개인 키로 생성된 다음 해당 공개 키로 확인됩니다. RSA 암호로 구현 되어 있더라도, HAMC암호화로 명시하면 공개키로 암호화 해서 넘기더라도 공개키로 확인하기때문에 키 검증이 통과됩니다.
  • Provide a non-valid signature: 토큰의 서명 검증이 없을 경우 공격자는 잘못된 서명을 제공하여 보안 메커니즘을 간단히 우회할 수 있습니다.

  • Bruteforce the secret key: JWT에 서명 알고리즘, 페이로드, 결과 서명을 알수 있으므로 키를 무차별 대입하는 것도 가능합니다.

  • Leak the secret key: 공격자가 키 값이 저장된 파일을 읽을 수 있는 다른 취약점(예: 디렉터리 탐색, XXE, SSRF)이 존재하는 경우 공격자는 키를 훔치고 임의의 토큰에 서명할 수 있습니다.

  • KID manipulation: KID는 “키 ID”를 의미합니다. JWT의 선택적 헤더 필드이며 개발자가 토큰 확인에 사용할 키를 지정할 수 있습니다.

    1. Directory traversal: KID는 파일 시스템에서 키 파일을 검색하는 데 자주 사용되기 때문에 사용 전에 삭제되지 않으면 디렉터리 탐색 공격으로 이어질 수 있습니다. 이 경우 공격자는 파일 시스템의 모든 파일을 토큰을 확인하는 데 사용할 키로 지정할 수 있습니다.

      “kid”: “../../public/css/main.css” // use the publicly available file main.css to verify the token
    2. SQL Injection: KID를 사용하여 데이터베이스에서 키를 검색할 수도 있습니다. 이 경우 SQL Injection을 활용하여 JWT 서명을 우회할 수 있습니다.

      “kid”: "aaaaaaa' UNION SELECT 'key';--"// use the string "key" to verify the token

      예를 들어, 위의 삽입은 애플리케이션이 문자열 “key”를 반환하도록 합니다. 그런 다음 “key” 문자열을 비밀 키로 사용하여 토큰을 검증합니다.

  • Header parameter manipulation: KID외에도 JSON 웹 토큰 표준은 개발자에게 URL을 통해 키를 지정할 수 있는 기능도 제공합니다.

    1. JKU header parameter: JKU는 “JWK Set URL”의 약자로 토큰검증에 사용되는 키 집합을 가리키는 URL을 명시하는데 사용되는 선택적 헤더 필드입니다. 공격자가 자체 키 파일을 호스팅하고 애플리케이션이 이를 사용하여 토큰을 확인하도록 지정할 수 있습니다.
    2. JWK header parameter: JWK(JSON Web Key) 헤더 매개변수를 사용하면 공격자가 토큰을 확인하는 데 사용되는 키를 토큰에 직접 포함할 수 있습니다.
    3. X5U, X5C URL manipulation: JKU 및 JWK 헤더와 유사한 X5U 및 X5C 헤더 매개변수를 사용하면 공격자가 토큰을 검증하는 데 사용되는 공개 키 인증서 또는 인증서 체인을 지정할 수 있습니다.
  • Other JWT security issues: 구현이 잘못 되었을때 발생하는 다른 JWT 문제도 있습니다.

    1. Information leak: JSON 웹 토큰은 액세스 제어에 사용되므로 사용자에 대한 정보가 포함되는 경우가 많습니다. 토큰이 암호화되지 않은 경우 누구나 base64URL로 토큰을 디코딩하고 토큰의 페이로드를 읽을 수 있습니다. 따라서 토큰에 민감한 정보가 포함되어 있으면 정보 유출의 원인이 될 수 있습니다.
    2. Command injection: KID 매개변수가 안전하지 않은 파일 읽기 작업에 직접 전달될 때 공격자가 KID 파일 이름 뒤의 입력에 명령을 간단히 추가하여 시스템 명령을 실행할 수 있습니다.

이에 대한 보다 자세한 내용은 URL에서 확인 할 수 있습니다.