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

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» уже не установлен, когда он мне нужен во второй раз.

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

Спасибо!

решение1

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

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

Посмотрите в куки-файлах или хранилище сеансов и посмотрите, есть ли там имя пользователя. (Я не уверен, 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.

Связанный контент