mod_security:跟踪用户检查是否重定向到登录失败页面

mod_security:跟踪用户检查是否重定向到登录失败页面

当用户无法登录 Web 应用程序时,我必须记录日志。不幸的是,此 Web 应用程序无法立即执行此操作,而且我无法更改它。

现在我正在试验 mod_security。我的想法是跟踪 POST 请求,提取用户名,然后检查用户是否被重定向到“登录失败”页面。

我有:

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

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

但是当我第二次需要它时,“TX.1”当然已经取消设置了。

有人能提示我如何解决这个问题吗?

谢谢!

答案1

除非 Web 应用程序在重定向中包含有关用户名的信息(例如,在查询字符串/loginfiled.php?username=foobar或 Cookie 中),否则将无法从请求中提取用户名/loginfailed.php。这些信息根本就不存在,无法提取。HTTP 是无状态的,因此当客户端发送username=fooPOST 请求的正文并导致 302 重定向时,后续请求/loginfailed.php对前一个请求一无所知。

如果此 Web 应用程序使用 307 重定向而不是 302 或 303,则后续请求将/loginfailed.php是包含所有相同数据的 POST 请求。我认为这种情况不太可能发生。

查看 cookies 或会话存储,看看用户名是否在那里。(我不确定是否mod_security可以读取会话存储,但如果你知道它在那里,我相信你可以找到办法。)

您可能更幸运地CustomLog在原始请求而不是后续请求期间记录登录尝试是否成功或失败:

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

或者您可以只将Location:标题和唯一 ID 添加到您的常规日志中%{Location}o %{UNIQUE_ID}emod_security在其所有日志中包含唯一 ID,以便您可以轻松地匹配其他日志。

要创建所有登录失败的用户名的连贯日志,只需从中取出所有行Location:.*/loginfailed.phplogins.log然后将唯一 ID 与现有的基于 mod_security 的日志中的用户名进行匹配。

相关内容