BLOG

2018/08/08

AWS WAF で SQL Injection をブロックしてみる

【概要】

今回はタイトルの通りSQLインジェクションの代表的な攻撃パターンを含むリクエストをブロックするルールを作成して実際にブロックされるか確認してみましょう。

【Conditionの作成】

AWS WAFのコンソール画面にて [ SQL injection ] をクリックします。

[ Create condition ] をクリックします。

「Name」には任意の名前を入力します。 今回は ”test_sqli”とします。
「Filter settings」内の「Part of the request to filter on」でリクエスト内のフィルターをかける部分を「Single query parameter (value only)」にします。次に「Query parameter name*」を「userID」にし、「Transformation」は「URL decode」にします。

入力が完了しましたら最後に [ Add filter ] をクリックしてConditionを追加します。
「Filters in this SQL injection match condition」へのフィルター追加が確認できましたら [ Create ] をクリックして作成します。

これでConditionの作成ができました。

【Ruleの作成】

[ Rules ]をクリックします。

Rules設定画面が表示されたら [ Create rule ] をクリックし、Rule(“test_rule_sqli”)の作成を行います。

先程、作成したCondition(“test_sqli”)を追加していきます。

「What a requests」
リクエストがConditionと一致している場合に適用する「does」、
一致していない場合に適用する「does not」を選択します。

次にフィルタリングの種類を「match at least one of filters in the SQL injection match condition」にします。Conditionの一覧から該当するCondition(“test_sqli”)を選択して追加を確認したら [ Create ] をクリックします。

Ruleの作成が完了しました。

【ACL( Access Control List )への追加】

[ Web ACLs ] をクリックします。
先程作成した Rule を追加したいACLをクリックします。 私は“RULE_TEST”というWeb ACLにします。

[ Rules ] のタブをクリックして、[ Edit web ACL ] をクリックします。

[ Rules ] のプルダウンで今回作成したRuleを選択し、[ Add rule to web ACL ] をクリックすると「If a request matches all the conditions in a rule, take the corresponding action」に追加されます。今回はブロックをしたいため「Action」は「Block」をチェックします。

続いて「Default action」を「Allow」にチェックをいれ [ Update ] をクリックします。Default actionは検知対象外のリクエストを「許可」または「拒否」どちらにするかを設定する項目になりますのでここを「Block」にするとRuleで許可されたリクエスト以外は全てブロックされてしまいます。ご注意ください。

Web ACLにRuleが追加されました。

では実際にテストを行ってみます。
このRuleを適用した状態でブラウザで「http://example.com」へアクセスすると以下の画面が表示されます。example.com は環境に応じて適宜変更してください。

問題なくアクセスできました。

では次に「http://example.com/?userID=20%27%20or%20%271%27%3d%271」にアクセスしてみると “403” のエラーが返ってきました。

このようにルールを設定すると即時で適用され、ブロックすることができます。
とても簡単なルールですが、AWS WAFでURIに特定のクエリ文字が含まれるリクエストをブロックする方法をご紹介しました。WAFってなんかわかりにくい!と思っている方は、是非一度試してみてください。