AWS WAFでSQLインジェクションをブロックしてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こちらの記事でご紹介したSQLインジェクション脆弱性を持つWebサイトを用意し、AWS WAFで攻撃をブロックしてみました。

CloudFront ディストリビューションの作成

Webディストリビューションを作成します。
試験サイトではHTMLフォームでPOSTを使います。
Allowed HTTP Methodsにて、GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETEを選択します。

-103

CloudFront経由で接続可能なことを確認します。
試験サイトでは、ユーザ名とパスワードを入力することでそのユーザーのメールアドレスを表示します。

-100

-101

パスワードに' OR 'A' = 'Aを指定すると、全てのユーザーのメールアドレスが表示されます。
SQLが意図せず成立し、他のユーザの情報が流出した状況が再現されました。

-102

AWS WAFを設定してみる

Get started

AWFコンソールに初めてアクセスすると、以下の画面が表示されます。
Get startedを選択します。

0

Concepts overview

AWS WAFの説明が表示されます。
さらっと確認して、Nextを選択します。

1

Step 1: Name web ACL

Web ACL nameの名前を入力し、Nextを選択します。
WebACLsは、conditions、rules、actionで構成されます。

2

Step 2: Create conditions

SQL injection match conditions > Create conditionsを選択します。
コンディションはWebリクエストを判定するために利用されます。

3

SQL injection match conditionを作成するウィンドウが表示されます。
NameはSQL injection match - Bodyとしました。
Filter settingsでは、悪意のあるSQLコードを検査する箇所を選択します。
HTMLフォームを利用する場合、Bodyを選択します。
また、Transformationを指定しURLデコードを行った後で検査するようにします。
Add filterを選択すると、フィルタが追加されます。

7

フィルタが追加された事を確認し、Createを選択します。
引き続きフィルタを追加することもできますが、Nextで先に進みます。

8

Step 3: Create rules

Create ruleを選択します。
ルールはconditionとactionのセットです。

ルールSQLi Ruleを作成します。
先ほど作成したコンディションをdoesで指定しルールを作成します。
コンディションのフィルターのままに許可/不許可する場合、doesを指定します。
フィルターの逆の条件で許可/不許可する場合、does notを指定します。

10

ルールSQLi Ruleが作成されました。ActionをBlockにします。
これでSQLインジェクションに一致するリクエストはブロックされます。

デフォルトアクションは、Allowにします。
ルールに一致しない正常なリクエストは許可されます。

11

Step 4: Choose AWS resource

保護するAWSリソースを選択します。
CloudFrontディストリビューションを指定します。

12

Step 5: Review and create

確認画面です。
Confirm and createを選択します。

13

設定直後はブロックされません。 
CloudFrontのstatusを確認すると、In Progressになっているはずです。
Deployedになるまで待ちましょう。

14

SQLインジェクション攻撃を試してみる

CloudFront経由でWebサイトにアクセスします。
パスワードに' OR 'A' = 'Aを指定すると、リクエストはブロックさされました。
通常のリクエストは、通常どおり処理されます。

16

WAFコンソール > Web ACLs > Requests > Sampled Web Requestsからルールに一致したリクエストを確認できます。 Sampled Web Requests は最大 2 時間保存されます。

17

まとめ

SQLインジェクション脆弱性を持つWebサイトを用意し、AWS WAFで攻撃をブロックしてみました。
WebACLは、conditions、rules、actionで構成されます。
SQLインジェクション用のコンディションを作成し、Blockしました。
デフォルトアクションはAllowすることで、通常のリクエストは通過する事を確認しました。

参考