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

除非 Web 應用程式在重定向中(例如,在查詢字串/loginfiled.php?username=foobar或 Cookie 中)包含有關使用者名稱的信息,否則無法從請求中提取使用者名稱/loginfailed.php。這些資訊根本無法提取。 HTTP 是無狀態的,因此當客戶端發送username=fooPOST 請求正文並導致 302 重定向時,後續請求將/loginfailed.php不知道有關前一個請求的任何資訊。

如果此 Web 應用程式使用 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:標頭和唯一 ID 新增到普通日誌中%{Location}o %{UNIQUE_ID}emod_security在其所有日誌中包含唯一 ID,以便您可以輕鬆匹配其他日誌。

建立所有登入失敗的使用者名稱的連貫日誌只需 grepLocation:.*/loginfailed.php出所有行logins.log,然後將唯一 ID 與現有基於 mod_security 的日誌中的使用者名稱進行比對。

相關內容