apacheconfまたは.htaccessでRequest_URIに基づいてSetEnvIfで環境変数でフラグを立てて、Requireでホワイトリスト判定しているのに拒否される場合の対策。
通常
SetEnvIf Request_URI {ロケーション} とRequireでロケーションで判定するシンプルな例
# http://host/path/to/location でリクエスト
# ロケーションにマッチして環境変数をフラグする
SetEnvIf Request_URI /path/to/location allowed_location
# Requireでフラグを判定して許可
Require env allowed_location
MVCフレームワーク下におけるリダイレクト影響
Webフレームワーク+apache環境ではだいたいmod_rewriteを使った次のコードスニペットが公開されている。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
# => http://host/index.php?_url=/path/to/location にインターナルリダイレクトする
原因
上記インターナルリダイレクトでconfの再評価が入るとロケーションが一致しなくなる。
# http://host/index.php?_url=/path/to/location でインターナルリダイレクト
# ロケーションにマッチしないので環境変数をフラグしない
SetEnvIf Request_URI /path/to/location allowed_location
# Requireでフラグを判定して拒否
Require env allowed_location
対策
リダイレクト後のロケーションもフラグメントするのではさすがに不毛だわ
SetEnvIf Request_URI /path/to/location allowed_location
# リダイレクト後のロケーションもフラグメント
SetEnvIf Request_URI /index.php?_url=/path/to/location allowed_location
# Requireでフラグを判定して拒否
Require env allowed_location
結論
mod_rewriteによるリダイレクトでは、前回評価で定義した環境変数がREDIRECT_プレフィックス付きでREDIRECT_{環境変数}のように引き継がれるので、
RequireにREDIRECT_{環境変数}を追加して、本来のユーザリクエストに基づく評価結果をもって通過させる。
# リダイレクト再入ではマッチしない
SetEnvIf Request_URI /path/to/location allowed_location
# が、REDIRECT_allowed_locationを評価して許可
Require env allowed_location REDIRECT_allowed_location
0 Comments:
コメントを投稿