見出し画像

Azure Application Gateway(WAF)を利用したWEBサイトでフォーム送信リクエストがブロックされた話


こんにちは。エンジニア歴2年目のコンノです。

App Serviceで公開されている採用サイトで、企業の募集内容を保存できるページでフォーム送信を行うとWAFではじかれて403ページが表示されてしまう問題が発生しました。今回は、こちらについてお話ししたいと思います。


発生した問題

以下のような入力内容でフォーム送信すると403ページが表示されました。

(1)〇〇を使用したWebアプリケーションの設計・開発
データベース設計、APIの開発、基幹システム連携など

(2)〇〇の開発
〇〇の実績

原因特定までの流れ


① ログの確認

→入力内容がSQLインジェクション攻撃と判断されて、リクエストがブロックされていることがわかりました。

・Message
SQL Injection Attack

・details_file_s
rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf


② REQUEST-942-APPLICATION-ATTACK-SQLI.confの調査

→OWASP ModSecurity Core Rule Set (CRS)のルールの1つ。
SQLインジェクション攻撃を検出するために使用されることがわかりました。

このルールでは、クエリパラメータにSQL構文を含む可能性があるリクエストを検出します。
具体的には、リクエストに含まれるパラメータに、SQLキーワード(SELECT、INSERT、UPDATEなど)や特殊文字(';'など)が含まれている場合にアラートを発生させます。


③ 入力内容にSQL構文があるか確認

→「PI」というSQLの円周率の値を求める関数名があることに気づきました。
しかし「PI」だけでは検知されなかったので、さらに調査を進めていると「PI」の後ろに「(」があると検知されるということがわかりました。「関数名」+「(」があることが原因でした。
さらに「関数名」と「(」の間に一定文字数があっても検知されるらしい……


回避策

今回は以下2つの方法のどちらかで回避しようと考えています。

① フォーム送信できるページのみ上記ルールを外す方法

 デメリット:セキュリティ面が弱くなってしまうこと

② カッコを半角から全角に変換してからフォーム送信する方法

 デメリット:半角カッコが使えなくなってしまうこと


最後に

本来は、セキュリティを向上させるためのルールですが、今回のように意図しないところで検知されてしまうこともあるんだなと思いました。
同じような問題になった方々に少しでも参考になればなと思います。