AWS WAFv2のマネージドルールでコマンドインジェクションから保護する

AWS WAF v2のマネージドルールを使ってコマンドインジェクションを防げるか確認しました。結果、一部の通信についてはブロックが可能でした。
2019.12.09

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

AWS WAF v2のマネージドルールを使ってコマンドインジェクションを防げるか確認しました。結果、一部の通信についてはブロックが可能でした。

DVWAのコマンドインジェクション脆弱性

検証にはDVWAを使いました。脆弱性の学習やツールのテストに利用できるWebアプリケーションです。メニューからCommand Injectionを選び、IPアドレスを入力するとそのIPにpingを実行し結果を表示します。

「127.0.0.1; cat /etc/passwd」を入力すると、パスワードが表示されます。コマンドインジェクションが成立し、外部からcat /etc/passwdが実行されたことになります。

なぜコマンドインジェクションが成立したのか?

なぜコマンドインジェクションが成立したのか見てみましょう。DVWAの設定でセキュリティレベルをLowにします。指定したレベルごとにlow.phpやmedium.phpが呼び出されます。

ソースコードはこちらをご覧ください。low.phpの場合、ユーザーが入力した値をそのままアプリケーションで受けとり、そのままshell_execでpingコマンドを実行します。;でpingコマンドを終わらせ、任意のコマンドを実行できてしまいます。先ほどの例だと「cat /etc/passwd」コマンドでしたね。

// Get input
$target = $_REQUEST[ 'ip' ];

target変数に変更を加えないまま、shell_execに渡しています。

// *nix
$cmd = shell_exec( 'ping  -c 4 ' . $target );

medium.phpの場合は「&&」「;」を置換しています。そのため、「127.0.0.1; cat /etc/passwd」を入力しても、コマンドインジェクションは成立しません。

	$substitutions = array(
		'&&' => '',
		';'  => '',
	);

AWS WAFv2でコマンドインジェクションを防ぐ

率直にいうとlowレベルの脆弱性があると、マネージドルールでは攻撃を完全に防ぐのは難しいというのが実情です。アプリケーションの脆弱性が大きすぎるため、攻撃をブロックするルールを網羅的に作る難しさが容易に想像できます。

いくつかのマネージドルールを試したところ、Cyber Security Cloud Managed Rules for AWS WAF -HighSecurity OWASP Set-が反応してくれました。

「127.0.0.1; cat /etc/passwd」を入力すると、WAFのブロック画面が表示されました。詳細は記載しませんが、いくつかのパターンではコマンドインジェクションが成立してしまいました。

AWS WAFv2のログ

サンプルログを確認すると、「oscommandi-body-001」でブロックしたことがわかります。

さいごに

DVWAを使ってコマンドインジェクションが発生する様子と仕組みを紹介しました。lowレベルでは、ユーザーが入力したをそのまま受け取るため、";"や”&&”などでpingコマンドを終端したあとで任意のコマンドを実行できました。Cyber Security Cloud Managed Rules for AWS WAF -HighSecurity OWASP Set-を導入することで、「127.0.0.1; cat /etc/passwd」のように一部の通信についてはブロックできましたが、いくつかのパターンではコマンドインジェクションが成立しました。セキュアコーディングや脆弱性診断を活用し脆弱性の少ないアプリケーションを作りつつ、WAFで防御すると取りこぼしの少ない安全なシステムになるかと思います。