【アップデート】AWS WAFでXSSに対応しました

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

ウィスキー、シガー、パイプをこよなく愛する大栗です。 本日AWS WAFがクロスサイト・スクリプティング(XSS)に対応しましたので試してみました。

クロスサイト・スクリプティング(XSS)?

情報処理推進機構(IPA)の「安全なウェブサイトの作り方」改訂第7版によると、以下の様な説明がされています。

ウェブアプリケーションの中には、検索のキーワードの表示画面や個人情報登録時の確認画面、掲示板、ウェブのログ統計画面等、利用者からの入力内容や HTTP ヘッダの情報を処理し、ウェブページとして出力するものがあります。ここで、ウェブページへの出力処理に問題がある場合、そのウェブページにスクリプト等を埋め込まれてしまいます。

設定を実施する

AWS WAFでconditionsで以下のようにCross-site scription match condifionsが増えています。

AWS_WAF

Create conditions

クロスサイト・スクリプティングの設定を行います。 以下の様な画面で設定を行います。

AWS_WAF

設定内容は、以下の通りとなります。

フィルタするリクエストの箇所(Part of the request to filter on)

検査対象のデータを選択します。Bodyは最初の8192Byteまでしか検査しないため、サイズ制限を併用すると良いかもしれません。

  • Header
  • HTTP method
  • Query string
  • URI
  • Body(最初の8192Byteまでを検査)

ヘッダ(Header)

検査対象データがHeaderの場合は、対象のHeaderを入力します。代表的なHaederは以下の様にサジェストされます。

Banners_and_Alerts_と_AWS_WAF_と_AWS_WAF_-_クロスサイトスクリプティングの一致条件を使用した作業

変換(Transformation)

対象データを検査する時に変換するかを選択します。

  • None:変換をしません。
  • Convert to lowercase:小文字に変換します。
  • HTML decode:HTMLデコードをします。
  • Normalize whitespace:特定の制御文字をスペースに変換します。
  • Simplify command line:OSのコマンドラインが含まれている場合に変換します。
  • URL decode:URLデコード。RFC3986のPercent-Encodingを指していると思われます。

今回は、以下の様にQuery stringについて設定しました。

項目|内容|備考 ---|---|--- Name|sample01| Part of the request to filter on|Query string| Header|ー|Query stringを選択したため項目無し Transformation|None, Convert to lowercase, HTML decode, Normalize whitespace, Simplify command line, URL decode|全てを選択

Web ACLs

Web ACLの設定では、[Rules]-[Edit web ACL]で以下のようにActionをBlackに設定して、XSSの条件に一致した場合にエラーページを返すようにします。

AWS_WAF

設定したWeb ACLをCloudFrontのDistributionに設定します。

XSSの条件を試す

XSSのリクエストを試してみます。OWASPのTesting for Cross site scriptingに記載がある、以下のQuery stringを設定してリクエストします。

http://server/cgi-bin/testcgi.exe?<SCRIPT>alert(“Cookie”+document.cookie)</SCRIPT>

Query string無し

以下の様にQuery string無しでリクエストしてみます。

http://example.com//root.html

普通に表示されます。 cm-ssl-test_oguri_classmethod_info_root_html2

通常のQuery string有り

Query stringにname=aaaを設定してみます。

http://example.com/root.html?name=aaa

問題がない内容であるため、普通に表示されます。 cm-ssl-test_oguri_classmethod_info_root_html2_name_aaa

OWASPの例のQuery string有り

では、OWASPの例にあるようにQuery stringに<script>alert(“Cookie”+document.cookie)</script>を設定します。

http://example.com/root.html?<SCRIPT>alert(“Cookie”+document.cookie)</SCRIPT>

AWS WAFのError Pageが表示されます。ちゃんとブロックされていますね。 ERROR__The_request_could_not_be_satisfied2

HTTPステータスは403 Forbiddenとなっています。

$ curl 'http://example.com/root.html?<SCRIPT>alert(“Cookie”+document.cookie)</SCRIPT>' -w '%{http_code}\n' -o /dev/null -s
403

さいごに

このように手軽にXSSの防御ルールを設定できます。AWS WAFにSQLインジェクションやXSSといった一般的な攻撃のルールが追加されたので、Webセキュリティの最初の導入に良いのでは良いかと思います。 しかし、セキュリティ対策はWAFを入れれば済むものではないため、本格的な対応をするには他のレイヤーでの対策も必要となるためAWS WAFを導入したからと言って安心してはいけません。セキュリティ対策には、AWS WAFを活用しつつ他の対策も実施していきましょう。