Author: veithen
Date: Sat Jun  4 16:03:09 2016
New Revision: 1746842

URL: http://svn.apache.org/viewvc?rev=1746842&view=rev
Log:
AXIS2-4739: Protect the admin console against session fixation attacks.

Modified:
    
axis/axis2/java/core/trunk/modules/webapp/src/main/java/org/apache/axis2/webapp/AdminActions.java
    
axis/axis2/java/core/trunk/systests/webapp-tests/src/test/java/org/apache/axis2/webapp/AxisAdminServletITCase.java

Modified: 
axis/axis2/java/core/trunk/modules/webapp/src/main/java/org/apache/axis2/webapp/AdminActions.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/webapp/src/main/java/org/apache/axis2/webapp/AdminActions.java?rev=1746842&r1=1746841&r2=1746842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/webapp/src/main/java/org/apache/axis2/webapp/AdminActions.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/webapp/src/main/java/org/apache/axis2/webapp/AdminActions.java
 Sat Jun  4 16:03:09 2016
@@ -60,6 +60,7 @@ final class AdminActions {
     private static final Log log = LogFactory.getLog(AbstractAgent.class);
     
     private static final String WELCOME = "welcome";
+    private static final String LOGOUT = "logout";
     private static final String INDEX = "index";
     private static final String UPLOAD = "upload";
     private static final String LIST_SERVICES = "listServices";
@@ -116,11 +117,16 @@ final class AdminActions {
     // supported web operations
 
     @Action(name=WELCOME, authorizationRequired=false)
-    public View welcome(HttpServletRequest req) {
-        if ("true".equals(req.getParameter("failed"))) {
-            req.setAttribute("errorMessage", "Invalid auth credentials!");
+    public ActionResult welcome(HttpServletRequest req) {
+        // Session fixation prevention: if there is an existing session, first 
invalidate it.
+        if (req.getSession(false) != null) {
+            return new Redirect(LOGOUT);
+        } else {
+            if ("true".equals(req.getParameter("failed"))) {
+                req.setAttribute("errorMessage", "Invalid auth credentials!");
+            }
+            return new View(LOGIN_JSP_NAME);
         }
-        return new View(LOGIN_JSP_NAME);
     }
 
     @Action(name=UPLOAD)
@@ -186,6 +192,13 @@ final class AdminActions {
 
     @Action(name="login", authorizationRequired=false, post=true, 
sessionCreationAllowed=true)
     public Redirect login(HttpServletRequest req) {
+        // Session fixation prevention: don't allow to login in an existing 
session.
+        // Note that simply invalidating the session and creating a new one is 
not sufficient
+        // because on some servlet containers, the new session will keep the 
existing session ID.
+        if (req.getSession(false) != null) {
+            return new Redirect(WELCOME);
+        }
+
         String username = req.getParameter("userName");
         String password = req.getParameter("password");
 
@@ -395,7 +408,7 @@ final class AdminActions {
                 moduleName + " module engaged to the service group 
successfully");
     }
 
-    @Action(name="logout")
+    @Action(name=LOGOUT)
     public Redirect logout(HttpServletRequest req) {
         req.getSession().invalidate();
         return new Redirect(WELCOME);

Modified: 
axis/axis2/java/core/trunk/systests/webapp-tests/src/test/java/org/apache/axis2/webapp/AxisAdminServletITCase.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/systests/webapp-tests/src/test/java/org/apache/axis2/webapp/AxisAdminServletITCase.java?rev=1746842&r1=1746841&r2=1746842&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/systests/webapp-tests/src/test/java/org/apache/axis2/webapp/AxisAdminServletITCase.java
 (original)
+++ 
axis/axis2/java/core/trunk/systests/webapp-tests/src/test/java/org/apache/axis2/webapp/AxisAdminServletITCase.java
 Sat Jun  4 16:03:09 2016
@@ -18,6 +18,9 @@
  */
 package org.apache.axis2.webapp;
 
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -25,13 +28,33 @@ public class AxisAdminServletITCase {
     @Rule
     public Axis2WebTester tester = new Axis2WebTester();
 
-    @Test
-    public void test() {
+    @Before
+    public void setUp() {
         tester.beginAt("/axis2-admin/");
         tester.setTextField("userName", "admin");
         tester.setTextField("password", "axis2");
         tester.submit();
+    }
+
+    @Test
+    public void testAvailableServices() {
         tester.clickLinkWithText("Available Services");
         tester.assertMatch("Service EPR : 
http://localhost:[0-9]+/axis2/services/Version";);
     }
+
+    /**
+     * Tests that the admin console is not vulnerable to session fixation 
attacks. This tests
+     * attempts to log in with an existing session. This should result in a 
new session with a
+     * different session ID.
+     */
+    @Test
+    public void loginInvalidatesExistingSession() {
+        String sessionId = tester.getSessionId();
+        assertThat(sessionId).isNotNull();
+        tester.gotoPage("/axis2-admin/welcome");
+        tester.setTextField("userName", "admin");
+        tester.setTextField("password", "axis2");
+        tester.submit();
+        assertThat(tester.getSessionId()).isNotEqualTo(sessionId);
+    }
 }


Reply via email to