mod_security: rastrea al usuario para verificar si se le redirige a la página de inicio de sesión fallido

mod_security: rastrea al usuario para verificar si se le redirige a la página de inicio de sesión fallido

Tengo que iniciar sesión cuando un usuario no puede iniciar sesión en una aplicación web. Desafortunadamente, esta aplicación web no puede hacer esto de inmediato y no puedo cambiarlo.

Ahora estoy experimentando con mod_security. Mi idea es realizar un seguimiento de la solicitud POST, extraer el nombre de usuario y luego verificar si el usuario es redirigido a la página "Error de inicio de sesión".

Tengo:

<Location /login.php>
       # Sanitize password variable value
       SecAction nolog,phase:2,sanitiseArg:password

       SecRule REQUEST_BODY "username=(.*)&password" "capture,log,logdata:'login submitted: user %{TX.1}'"
</Location>

y

<Location /loginfailed.php>
       # Filter und log redirects to loginfailed
       SecRule RESPONSE_BODY "loginfailed.php" "phase:4,t:none,log,logdata:'login failed: %{TX.1}'"
</Location>

Pero, por supuesto, "TX.1" ya está desarmado cuando lo necesito por segunda vez.

¿Alguien puede darme una pista sobre cómo resolver esto?

¡Gracias!

Respuesta1

A menos que la aplicación web incluya información sobre el nombre de usuario en la redirección (por ejemplo, en la cadena de consulta /loginfiled.php?username=foobaro en una cookie), no habrá forma de extraer el nombre de usuario de la /loginfailed.phpsolicitud. La información simplemente no está ahí para extraerla. HTTP no tiene estado, por lo que cuando un cliente envía username=fooel cuerpo de una solicitud POST y esto da como resultado una redirección 302, la solicitud de seguimiento no /loginfailed.phpsabe nada sobre la solicitud anterior.

Si esta aplicación web utiliza una redirección 307 en lugar de 302 o 303, la solicitud de seguimiento /loginfailed.phpserá una solicitud POST con los mismos datos. Yo esperaría que esto fuera bastante improbable.

Eche un vistazo a las cookies o al almacenamiento de la sesión y vea si el nombre de usuario está allí. (No estoy seguro de mod_securitypoder leer el almacenamiento de la sesión, pero si sabes que está allí, estoy seguro de que podrás descubrir algo).

Es posible que tenga más suerte con un CustomLogregistro para registrar si el intento de inicio de sesión tuvo éxito o falló durante la solicitud original en lugar de la solicitud de seguimiento:

LogFormat "%h %t \"%r\" %>s %{Location}o %{PHPSESSID}C %{UNIQUE_ID}e" loginslog
CustomLog "/var/log/apache2/logins.log" loginslog

o simplemente puede agregar el Location:encabezado y la identificación única a sus registros normales con %{Location}o %{UNIQUE_ID}e. mod_securityincluye la identificación única en todos sus registros para que pueda hacer coincidir el otro fácilmente.

Crear un registro coherente de todos los nombres de usuario que han fallado en los inicios de sesión es entonces una cuestión de eliminar todas las Location:.*/loginfailed.phplíneas logins.logy luego hacer coincidir las ID únicas con los nombres de usuario en su registro existente basado en mod_security.

información relacionada