web-dev-qa-db-ja.com

ここでPHPでシェルコマンドを挿入できますか?

クライアントのソースコードの調査中に、このコードを見つけました。 GETから無害化されたパラメーターを取得し、無害化してShell_exec()を実行します

_$arg = $_GET['arg'];

// sanitization, I suppose...
if(preg_match("/[#\&\\+\-%@=\\\:;,\.\'\"\^`~\_|\!\/\?\*$#<>()\[\]\{\}]/i", $arg, $match)) exit;

$code = Shell_exec("/some/app $arg");

echo $code;
_

escapeshellarg()にパイプする前にShell_exec()を実行する必要があることを知っています。私はその答えのためにここにいません。

私の質問は、攻撃者がこのコードを悪用して任意のコマンドを実行する方法を教えてください。攻撃者はどのようにして特定の_preg_match_をバイパスできますか?

7
John Doe

少なくとも、改行はエスケープされないため、/index.php?arg=%0Alsを介してバイパスできます(current directoryからすべてのファイルをリストする必要があります)。

また、argを配列(/index.php?arg[]=1)として渡してフルパス開示を取得する可能性もあります。

5
Victor