にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:18:44.

入力フォームの送信で稀に「403 Forbidden」エラーになる現象はWAFが原因だった

ウェブ上の入力フォームから送信したときに、「500 Internal Server Error」ではなく「403 Forbidden」になる現象に遭遇しました。
必ずなるわけではなく、フォームに入力した内容によって、正常に送信できたり、Forbiddenエラーになったりします。
試行錯誤の結果、ウェブサーバ側に導入されたWAF(ウェブアプリケーション・ファイアーウオール)が原因だということが分かったんですが。^^;

入力フォームから短い文字列を送信しても、403 Forbiddenエラーになる

それほど特殊な文字列を入力しているわけでは全然なく、なんと「A and B in box (white)」のような文字列だけでもエラーになります。
もっと短い文字列でもエラーになります。例えば、

  • x and y in. (z)
  • x and y in.()
  • x and -in. (2)
  • x and +in()

のいずれでもエラーになります。(^_^;;;
たったこれだけの記述がプレーンテキストで含まれているだけで、CGIが実行されずに403 Forbiddenになるのがすごく謎でした。

単純に「and」や「in」などの文字列が含まれているだけで無条件にエラーになるわけではありません。例えば、以下の文字列ではエラーにはならずに正常に送信できました。

  • and -in. (2)  ←「and」の前に空白がない
  • and-in. (2)  ←「and」と「in」の間に空白がない
  • and -in. 2)  ←丸括弧が対になっていない
  • rand -in()  ←英単語「and」ではない(rand)
  • and in()  ←「and」と「in」の間に『1つの空白』しかない
  • and a in[]  ←丸括弧ではなく角括弧

入力フォームから送信して、403 Forbiddenエラーになる条件

いろいろ試行錯誤して調べたところ、以下の3条件に合致する場合に、Forbiddenエラーになることが分かりました。(後から追加の情報を頂いたところ、上記の条件以外でも同エラーが発生するパターンがあるようでしたが。)

  • 条件1. 英単語「and」の前後に空白がある。
  • 条件2. 条件1の後に、「空白」と「任意の文字」を挟んだ上で英単語「in」が出現する。
  • 条件3. 条件1・2の後に、丸括弧 ( ) が出現する。

なんだこれ……。(^_^;;;
CGI側に何らかの問題があるのかな……と思って結構悩みました。^^;;;

何にしても、英単語「and」と「in」と丸カッコなんて、たとえ英語サイトでなかったとしても、使われる頻度は高い文字列です。
これらが含まれているだけで送信エラーになってしまうと、入力フォームとして役に立たなくなってしまいます。

WAF(ウェブアプリケーション・ファイアーウオール)が原因だった

もしCGI側(Perlソースの中身)に問題があるのなら、「403 Forbidden」エラーではなく、「500 Internal Server Error」になるはずですよね。
なので、もしかしてサーバ側のセキュリティ関係に何か問題があるんじゃないかな? と思ったのでした。
試しに、私が個人で利用しているサーバ上に同CGIを置いてみたところ、送信エラーは特に発生しませんでした。

どうも、レンタルサーバによっては、ウェブ上での不正な通信をブロックする「WAF(ウェブアプリケーション・ファイアーウオール)」なるツールがデフォルトで有効になっているみたいですね。
サーバのコントロールパネルから、WAFの設定を「無効」にするよう設定をお願いしたところ、問題の403 Forbiddenエラーは出なくなりました!(^_^;;;

入力フォームからの送信で403 Forbiddenエラーになるならファイアーウオールを疑え!(^_^;)

というわけで、CGIを使って何らかの文字列をサーバに送信する仕組みを用意しているときに、文字列によって送信できたり送信できなかったりする場合で、サーバが「403 Forbidden」エラーを吐く場合は、WAF(ウェブアプリケーション・ファイアーウオール)の影響を確認してみるのが良さそうです。

うーむ、そんなことがあるんですねえ……。
しかしこれ、今回検証した条件でエラーを吐くなら、明らかに過剰検出じゃないか……?
WAFは、CGIとかのプログラムをウェブ上で使わないことが前提みたいな感じなんだろうか……?(^_^;;;

※注:上記の話のレンタルサーバは、私が契約しているサーバではありません。(つまり、さくらインターネットの話ではありません。別の会社です。)

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---