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

2016.09.26

この記事は公開されてから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することで、通常のリクエストは通過する事を確認しました。

参考