【アップデート】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を活用しつつ他の対策も実施していきましょう。