ちょっと話題の記事

【機能追加】F5のAWS WAFマネージドルールがリリースされたのでXSS/SQLiを検知してみた

2018.03.01

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

こんにちは、臼田です。

今回はAWS WAF Managed Ruleに新たに追加されたF5のルールを利用して、XSS(クロスサイトスクリプティング) / SQLi(SQLインジェクション)を検知してみたいと思います。

WAFマネージドルールって何?

本記事では説明しないので、下記をご確認下さい。

【新機能】AWS WAFマネージドルールを使ってWordPressに対する攻撃を防いでみた #reinvent

F5のマネージドルールが3つ追加されました!

New Products for Managed Rules on AWS WAF

上記リリースの通り、F5から3つのマネージドルールが追加され、現状では全14ルールあります。

簡単に追加されたルールについて説明します。なお、既存のルールについても先述のブログをご参照下さい。

追加されたルール + 概要

  • F5 Web Application CVE Signatures For AWS WAF
    • F5 WebアプリケーションのCVEシグネチャAWS用WAFは、Webアプリケーションとインフラストラクチャのための高プロファイルのCVE(Common Vulnerabilities and Exposures)のコレクションをフィルタリングすることを可能にします:Struts、Java、Apache、windows、Linux、PHP、 MySQL、Shellshock、Elastic Search、CMS
  • AWS WAF - Web Exploits Rules by F5
    • ウェブの悪用から守ります。 F5 Web Exploits AWS WAFのルールは、SQLi、XSS、コマンドインジェクション、No-SQLiインジェクション、パストラバーサル、予測可能リソースなど、OWASP Top 10の一部であるWeb攻撃から保護します。 Webアプリケーションセキュリティの信頼できるリーダーであるF5を使用して、アプリケーションとサービスを保護します。
  • F5 Bot Detection Signatures For AWS WAF
    • F5のボット検出シグネチャを使用すると、脆弱性スキャナー、スクレイパー、電子メール訂正機能、ネットワークスキャナー、SPAMボット、スパイウェア、Webスパイダー、Webサーバーストレスツールを含む不要なボットアクティビティーをフィルターできます。

料金

料金は各マーケットプレイスのページをご確認下さい。

AWS Marketplace: F5 Rules for AWS WAF - Web exploits OWASP Rules

現状では、全てのルールが下記のようになっていました。

1ヶ月あたり1リージョン毎 $20 (1時間毎で分割して計算)
100万リクエストあたり1リージョン毎 $1.2

月$20+αでF5のWAFが使えると考えると、激安ですね!

検知してみた

マネージドルールの適用についても、先述のブログと同じなので割愛します。今回はAWS WAF - Web Exploits Rules by F5をCount(検知)モードで試してみます。

今回利用するのはDVWAのXSSとSQLiです。調べてもらえれば分かる人には分かるので、詳細は省きます。

まずは/dvwa/vulnerabilities/xss_r/でXSSを試します。

発生しました。

次に/dvwa/vulnerabilities/sqli/でSQLiを試します。

発生しました。

検知できたか確認してみます。

AWS WAFのWeb ACLページでルールに引っかかったサンプルリクエストが確認できます。

検知できていることが確認できました。

CloudWatchの画面でも確認してみます。

CountedRequestsで数えられていることが確認できました。

また、マネジメントコンソールからではやや検知から反映に時間がかかりますが、AWS CLIを利用すると、体感では30秒程度で検知したものを取得することができます。

下記にpythonでのサンプルスクリプトを載せておきます。

from datetime import datetime, timedelta
import boto3

acl_id = 'xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxx'

waf = boto3.client('waf-regional')
# get rule id
r = waf.get_web_acl(WebACLId=acl_id)
rule_id = r['WebACL']['Rules'][0]['RuleId']

# EndTimeはローカルとの時刻ズレに合わせて調整
r = waf.get_sampled_requests(
	MaxItems=500,
	WebAclId=acl_id,
	RuleId=rule_id,
	TimeWindow={
		'EndTime': datetime.utcnow() - timedelta(seconds=5),
		'StartTime': datetime.utcnow() - timedelta(minutes=60)
	}
)
print(r['SampledRequests'])

まとめ

F5のマネージドルールが追加され、より選択肢が広がりました。

もちろん、各メーカーが出しているオリジナルのWAF製品と比べると、やや物足りないところはありますが、

何と言っても安さと手軽さがいいですよね!

皆さんも環境に合うWAFマネージドルールを検証して、利用してみてはいかがでしょうか?