【アップデート】AWS WAFでXSSに対応しました
ウィスキー、シガー、パイプをこよなく愛する大栗です。 本日AWS WAFがクロスサイト・スクリプティング(XSS)に対応しましたので試してみました。
クロスサイト・スクリプティング(XSS)?
情報処理推進機構(IPA)の「安全なウェブサイトの作り方」改訂第7版によると、以下の様な説明がされています。
ウェブアプリケーションの中には、検索のキーワードの表示画面や個人情報登録時の確認画面、掲示板、ウェブのログ統計画面等、利用者からの入力内容や HTTP ヘッダの情報を処理し、ウェブページとして出力するものがあります。ここで、ウェブページへの出力処理に問題がある場合、そのウェブページにスクリプト等を埋め込まれてしまいます。
設定を実施する
AWS WAFでconditionsで以下のようにCross-site scription match condifions
が増えています。
Create conditions
クロスサイト・スクリプティングの設定を行います。 以下の様な画面で設定を行います。
設定内容は、以下の通りとなります。
フィルタするリクエストの箇所(Part of the request to filter on)
検査対象のデータを選択します。Bodyは最初の8192Byteまでしか検査しないため、サイズ制限を併用すると良いかもしれません。
- Header
- HTTP method
- Query string
- URI
- Body(最初の8192Byteまでを検査)
ヘッダ(Header)
検査対象データがHeaderの場合は、対象のHeaderを入力します。代表的なHaederは以下の様にサジェストされます。
変換(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の条件に一致した場合にエラーページを返すようにします。
設定した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
普通に表示されます。
通常のQuery string有り
Query stringにname=aaa
を設定してみます。
http://example.com/root.html?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が表示されます。ちゃんとブロックされていますね。
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を活用しつつ他の対策も実施していきましょう。