WAFv2のマネージドルールでLFI攻撃をブロックする

2019.12.07

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

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のルールで攻撃を遮断できることを紹介しました。

参考