Apacheのパストラバーサル(ディレクトリトラバーサル)対策
※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!
Tips
Apacheの mod_rewrite でクエリ文字列に .. が含まれるリクエストを拒否する設定
.htaccessに以下を追加
# Block directory traversal attempts
RewriteCond %{QUERY_STRING} (\.\.|/) [NC]
RewriteRule .* - [F,L]
.htaccess で 403 を返したアクセスを検知して、自動的に IP を遮断するfail2banを設定
# /etc/fail2ban/filter.d/apache-traversal.conf
[Definition]
# 403 Forbidden が発生した際に、クエリ文字列に .. や / が含まれるリクエストを検知
failregex = ^<HOST> - - \[.*\] ".* (\.\.|/).* HTTP/.*" 403
ignoreregex =
# /etc/fail2ban/jail.local
[apache-traversal]
enabled = true
port = http,https
filter = apache-traversal
logpath = /var/log/httpd/access_log
# 1回でも不正な攻撃を検知したらBANする場合(または数回試行でBAN)
maxretry = 1
# 1時間(3600秒)BANする場合
bantime = 3600
sudo systemctl reload fail2ban
sudo fail2ban-client status apache-traversal
注意点
- ログパス: サーバ環境によってログファイルの場所が異なる場合があります。環境に合わせて調整してください。
- 誤検知: まれに正規のユーザーが入力ミスなどで該当文字を含めてしまった場合もBANされる可能性があります。
maxretry(失敗許容回数)を調整して、誤検知を避けるチューニングを行ってください。
- ファイアウォール:
fail2ban が正しく動作するには、サーバのファイアウォール(iptables や firewalld)と連携できている必要があります。
- もし通常のアクセスで
/ を含んだパラメータが使われていたとしても、それが「正常に動くアプリ」であれば 403 にはならないため、このルールには引っかかりません。
- 逆に、このルールに引っかかるのは、「サーバ側で本来アクセスを禁止しているファイルやディレクトリに対し、パス指定(
/ や ..)を使って無理やりアクセスしようとした」ケースのみとなり、誤検知の可能性は極めて低いと言えます。