mod_security: rastreia o usuário para verificar se foi redirecionado para a página de falha no login

1

Eu tenho que registrar quando um usuário não efetuar login em um aplicativo da web. Infelizmente, este aplicativo da Web não pode fazer isso imediatamente e não posso alterá-lo.

Agora estou experimentando o mod_security. Minha ideia é rastrear a solicitação POST, extrair o nome de usuário e, em seguida, verificar se o usuário é redirecionado para a página "login failed".

Eu tenho:

<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>

e

<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>

Mas é claro que "TX.1" já não está definido quando eu preciso pela segunda vez.

Alguém pode me dar uma dica de como resolver isso?

Obrigado!

    
por mr51m0n 23.08.2012 / 09:50

1 resposta

1

A menos que o aplicativo da Web inclua informações sobre o nome de usuário no redirecionamento (digamos, na string de consulta /loginfiled.php?username=foobar ou em um cookie), não haverá maneira de extrair o nome de usuário da solicitação /loginfailed.php . A informação simplesmente não está lá para extrair. HTTP é stateless, portanto, quando um cliente envia username=foo no corpo de uma solicitação POST e isso resulta em um redirecionado 302, a solicitação de acompanhamento para /loginfailed.php não sabe nada sobre a solicitação anterior.

Se este aplicativo da web usar um redirecionamento 307 em vez de um 302 ou um 303, a solicitação de acompanhamento para /loginfailed.php será uma solicitação POST com todos os mesmos dados. Eu esperaria que isso fosse bastante improvável.

Dê uma olhada nos cookies ou no armazenamento da sessão e veja se o nome de usuário está lá. (Eu não tenho certeza se mod_security pode ler o armazenamento da sessão, mas se você sabe que está lá, tenho certeza que você pode descobrir algo.)

Você pode ter mais sorte com um CustomLog para registrar se a tentativa de login foi bem-sucedida ou falhou durante a solicitação original em vez da solicitação de acompanhamento:

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

ou você pode adicionar o cabeçalho Location: e a ID exclusiva a seus registros normais com %{Location}o %{UNIQUE_ID}e . mod_security inclui o ID exclusivo em todos os seus registros para que você possa corresponder facilmente ao outro.

A criação de um log coerente de todos os nomes de usuários que falharam nos logins é uma questão de transferir todas as Location:.*/loginfailed.php linhas do logins.log e, em seguida, corresponder os IDs exclusivos até os nomes de usuários no seu log existente baseado no mod_security.

    
por 23.08.2012 / 10:39