WAFv2のマネージドルールでLFI攻撃をブロックする
WAFv2のマネージドルールを使ってローカルファイルインクルージョン(LFI)攻撃をブロックできるか確認しました。ルール「AWS-AWSManagedRulesLinuxRuleSet」でブロックできました。
LinuxRuleSetの適用
AWSが提供するマネージドルールのうち、「AWS-AWSManagedRulesLinuxRuleSet」を利用します。LFI攻撃を含むLinux特有の脆弱性から保護するルールです。マネージドルールの編集画面を見ると、「LFI_URIPATH」「LFI_QUERYARGUMENTS」「LFI_BODY」のルールがあります。
DVWA
検証にはDVWAを使いました。脆弱性の学習やツールのテストに利用できるWebアプリケーションです。DVWAの設定でセキュリティレベルをLowにします。指定したレベルごとにlow.phpやmedium.phpが呼び出されます。
Lowにすることで、pageをユーザーが指定したまま受け取る動きになります。
$ cat source/low.php <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> $
参考までに、Mediumは以下のように置換しています。
$ cat source/medium.php <?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\"" ), "", $file ); ?> $
ここで「http://IP-Address/DVWA-master/vulnerabilities//fi/?page=../../../../../../etc/passwd」にアクセスすると、/etc/passwdがブラウザに表示されます。見えてはいけないローカルファイルが外部から見えたことになります。
LinuxRuleSetによる保護
マネージドルールの設定手順については、こちらのブログをご覧ください。「AWS-AWSManagedRulesLinuxRuleSet」を割り当てて、再度アクセスするとWAFによりブロックされ403になります。
WAFv2コンソールからサンプルリクエストを確認できます。Matches ruleには「AWS#AWSManagedRulesLinuxRuleSet#LFI_QUERYARGUMENTS」とあります。「LinuxRuleSet」中の「LFI_QUERYARGUMENTS」ルールでブロックしたことがわかります。
おわりに
DVWAのLFI脆弱性を使うと、/etc/passwdの中身が見えることを紹介しました。攻撃が成立すると/etc/passwdに限らず、リモートからローカルファイルを閲覧されてしまいます。アプリケーションを修正するのが正しい対策ですが、改修までの時間稼ぎや保険としてAWS WAFv2のルールで攻撃を遮断できることを紹介しました。