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>

しかし、もちろん、2 回目に必要になったときには、「TX.1」はすでに設定されていません。

これを解決する方法についてヒントをくれる人はいますか?

ありがとう!

答え1

Web アプリがリダイレクトにユーザー名に関する情報 (クエリ文字列/loginfiled.php?username=foobarまたは Cookie など) を含めない限り/loginfailed.php、リクエストからユーザー名を抽出する方法はありません。抽出する情報が存在しないのです。HTTP はステートレスなので、クライアントがusername=fooPOST リクエストの本文を送信し、その結果 302 リダイレクトが発生した場合、後続のリクエストは/loginfailed.php前のリクエストについて何も知りません。

この Web アプリが 302 または 303 ではなく 307 リダイレクトを使用する場合、後続のリクエストは/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:または、 . を使用して通常のログにヘッダーと一意の IDを追加することもできます%{Location}o %{UNIQUE_ID}e。 ではmod_securityすべてのログに一意の ID が含まれるため、簡単に照合できます。

ログインに失敗したすべてのユーザー名の一貫したログを作成するには、すべてLocation:.*/loginfailed.phpの行をgrep しlogins.log、一意の ID を既存の mod_security ベースのログ内のユーザー名と照合するだけです。

関連情報