Назад | Перейти на главную страницу

mod_security: отслеживать пользователя, чтобы проверить, не перенаправлен ли он на страницу с ошибкой входа

Мне нужно войти в систему, когда пользователь не может войти в веб-приложение. К сожалению, это веб-приложение не может сделать это из коробки, и я не могу его изменить.

Сейчас экспериментирую с 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" уже сброшен, когда мне это нужно во второй раз.

Может ли кто-нибудь подсказать, как это решить?

Спасибо!

Если веб-приложение не включает информацию об имени пользователя в перенаправлении (например, в строке запроса /loginfiled.php?username=foobar или в файле cookie) не будет возможности извлечь имя пользователя из /loginfailed.php запрос. Информация просто не для извлечения. HTTP не имеет состояния, поэтому, когда клиент отправляет username=foo в теле запроса POST, и это приводит к перенаправлению 302, последующий запрос на /loginfailed.php ничего не знает о предыдущем запросе.

Если это веб-приложение использует перенаправление 307 вместо 302 или 303, последующий запрос на /loginfailed.php будет запрос POST со всеми теми же данными. Я ожидал, что это маловероятно.

Загляните в файлы cookie или в хранилище сеансов и посмотрите, есть ли там имя пользователя. (Я не уверен, что mod_security может читать хранилище сеансов, но если вы знаете, что оно есть, я уверен, что вы что-то поймете.)

Возможно, вам повезет больше с CustomLog для регистрации того, была ли попытка входа успешной или неудачной во время исходного запроса, а не последующего запроса:

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

или вы можете просто добавить Location: заголовок и уникальный идентификатор ваших обычных журналов с %{Location}o %{UNIQUE_ID}e. mod_security включает уникальный идентификатор во все свои журналы, чтобы вы могли легко сопоставить другой.

Создание последовательного журнала всех имен пользователей, которые не смогли войти в систему, - это вопрос поиска всех Location:.*/loginfailed.php линии из logins.log а затем сопоставление уникальных идентификаторов с именами пользователей в вашем существующем журнале на основе mod_security.