web-dev-qa-db-ja.com

この.htaccessセキュリティ設定は本当に機能しますか?

この.htaccessは何をしているのですか?

自動ブルートフォース攻撃を防ぐことだけがすべてだと考えるのは正しいでしょうか。

そのため、wp-login.phpにアクセスするには、ドメインのURLを手動で入力して、wp-login.phpを探すすべてのボットを無効にする必要があります。

私は正しいですか?

これが.htaccessルールです。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_REFERER} !^https://(.*)?my-domain.com [NC]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteRule ^(.*)$ - [F]
</IfModule>
7
henry

My-domain.comのページから行われていないwp-login.phpへのPOST要求を防ぐことができます。

ブラウザがPOSTリクエストを送信するとき、例えばフォームを送信した後に、リクエストがどこから来たのかをサーバに伝えるHTTP Referrerヘッダを含みます。

これは理論的には、ブルートフォース攻撃の一環としてPOSTをwp-login.phpに直接送信するボットを防ぎますが、HTTPリファラーは偽造するのが簡単なので実際にはそれほど役に立ちません。

9
Jacob Peattie

これで妨げられないこと:ブルートフォース

自動ブルートフォース攻撃を防ぐだけなのですか?

いいえ。これは総当たり攻撃を防ぐことはできません。

総当たり攻撃では、攻撃者はHTTP要求のすべてのパラメータを制御します。これには、参照元も含まれます。攻撃者が任意のリファラーを送信することができるので、これは総当たり攻撃を防ぎません。 (ほとんど)すべてのブルートフォースツールはリファラーの設定を許可します、そしてサイト自体をリファラーとして設定することはかなり標準的です。

強引な攻撃から保護するメカニズムは、IPまたはユーザー名ベースでの禁止や調整、およびキャプチャです。

これが妨げることを意図しているかもしれないもの:CSRF

このコードは、管理領域へのすべてのPOSTリクエストにリファラーチェックを追加するためのものです。参照元が無効な場合、要求は拒否されます。

CSRF攻撃では、攻撃者は被害者に状態変更POST要求の実行を強制します。これは、たとえば、攻撃者のWebサイトにHTMLとJavascriptのコードを投稿することで発生する可能性があります。これにより、認証された被害者がサイトにアクセスすると自動的にリクエストがvictim.comに送信されます。

参照者チェックは、CSRFから保護するための1つのメカニズムです。 victim.comだけが有効なリファラーとして承認されているため、攻撃者は被害者に自分のドメインからの要求の送信を強制することはできません。

もちろん、WordPressには独自のCSRF保護があります(反CSRFナンスを介して)。しかし、それはすべてのケースをキャッチするわけではなく、プラグインのセキュリティはプラグイン開発者に大きく依存します。

追加のリファラーチェックは、WPコア、特にプラグインにおけるCSRFの脆弱性が悪用されるのを防ぐのに役立ちます。

もちろん、これが意図的なものであれば、コードにバグがあります。 RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$$は、ほとんどのリクエストのチェックを妨げます。

チェックは簡単に迂回することもできます。以下の参照元が受け入れられます。

Referer: http://example.com.org
Referer: http://not-example.com
Referer: http://notexample.com
Referer: http://attacker.com/example.com
[...]

サイトのセキュリティを強化するには、これら2つの問題を最初に解決する必要があります。コードはPOST要求に制限されないことによってさらに改善されるかもしれません(不完全に書かれたアプリケーションでは、GET要求は同様にサーバー状態を変えるかもしれません、またはPOST要求はGET要求に変換可能です)。このチェックは管理者にのみ適用されるため、これによってユーザビリティが制限されることはありません。

6
tim

あなたは部分的に正しいです

上記のコード はあなたのドメインから直接来るログイン要求のみを許可することによってあなたのWordPressサイトを保護します - 助けます。

ほとんどのブルートフォース攻撃はPOSTリクエストをあなたのwp-login.phpスクリプトに直接送信します。そのため、参照元としてPOST要求にドメインを含めることを要求すると、これらのボットを阻止するのに役立ちます。

次のコードを使用して、静的IPがある場合はさらに一歩進むことができます。

RewriteEngine on 
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR}!^111\.111\.111\.111$
RewriteRule ^(.*)$ - [R=403,L]

*静的IPアドレスに置き換えてください。

*あなたのサイトがCloudFlareなどのDNSサービスの背後にある場合は動作しないかもしれません。

4