AWS WAFでSQLインジェクションをブロックしてみた
はじめに
こちらの記事でご紹介したSQLインジェクション脆弱性を持つWebサイトを用意し、AWS WAFで攻撃をブロックしてみました。
CloudFront ディストリビューションの作成
Webディストリビューションを作成します。
試験サイトではHTMLフォームでPOSTを使います。
Allowed HTTP Methods
にて、GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE
を選択します。
CloudFront経由で接続可能なことを確認します。 試験サイトでは、ユーザ名とパスワードを入力することでそのユーザーのメールアドレスを表示します。
パスワードに' OR 'A' = 'A
を指定すると、全てのユーザーのメールアドレスが表示されます。
SQLが意図せず成立し、他のユーザの情報が流出した状況が再現されました。
AWS WAFを設定してみる
Get started
AWFコンソールに初めてアクセスすると、以下の画面が表示されます。 Get startedを選択します。
Concepts overview
AWS WAFの説明が表示されます。 さらっと確認して、Nextを選択します。
Step 1: Name web ACL
Web ACL nameの名前を入力し、Nextを選択します。 WebACLsは、conditions、rules、actionで構成されます。
Step 2: Create conditions
SQL injection match conditions > Create conditionsを選択します。 コンディションはWebリクエストを判定するために利用されます。
SQL injection match conditionを作成するウィンドウが表示されます。
NameはSQL injection match - Body
としました。
Filter settingsでは、悪意のあるSQLコードを検査する箇所を選択します。
HTMLフォームを利用する場合、Bodyを選択します。
また、Transformationを指定しURLデコードを行った後で検査するようにします。
Add filterを選択すると、フィルタが追加されます。
フィルタが追加された事を確認し、Createを選択します。 引き続きフィルタを追加することもできますが、Nextで先に進みます。
Step 3: Create rules
Create ruleを選択します。 ルールはconditionとactionのセットです。
ルールSQLi Rule
を作成します。
先ほど作成したコンディションをdoes
で指定しルールを作成します。
コンディションのフィルターのままに許可/不許可する場合、does
を指定します。
フィルターの逆の条件で許可/不許可する場合、does not
を指定します。
ルールSQLi Rule
が作成されました。ActionをBlock
にします。
これでSQLインジェクションに一致するリクエストはブロックされます。
デフォルトアクションは、Allow
にします。
ルールに一致しない正常なリクエストは許可されます。
Step 4: Choose AWS resource
保護するAWSリソースを選択します。 CloudFrontディストリビューションを指定します。
Step 5: Review and create
確認画面です。 Confirm and createを選択します。
設定直後はブロックされません。
CloudFrontのstatusを確認すると、In Progress
になっているはずです。
Deployed
になるまで待ちましょう。
SQLインジェクション攻撃を試してみる
CloudFront経由でWebサイトにアクセスします。
パスワードに' OR 'A' = 'A
を指定すると、リクエストはブロックさされました。
通常のリクエストは、通常どおり処理されます。
WAFコンソール > Web ACLs > Requests > Sampled Web Requestsからルールに一致したリクエストを確認できます。 Sampled Web Requests は最大 2 時間保存されます。
まとめ
SQLインジェクション脆弱性を持つWebサイトを用意し、AWS WAFで攻撃をブロックしてみました。 WebACLは、conditions、rules、actionで構成されます。 SQLインジェクション用のコンディションを作成し、Blockしました。 デフォルトアクションはAllowすることで、通常のリクエストは通過する事を確認しました。