1] Exec() は、次の場合に非常に役立ちます。
A) php に相当するコマンドがないサーバー上でプログラム/ユーティリティを実行したい。たとえば、ffmpeg は、exec 呼び出しを介して実行される一般的なユーティリティです (あらゆる種類のメディア変換用)。
B) 別のプロセスを実行する - ブロックすることもブロックしないこともできます - これは非常に強力です。ただし、ノンブロッキングの正しい CL 引数とともに pcnt_fork などを指定することもあります。
C) もう 1 つの例は、XSLT 2.0 を処理する必要がある場合です。変換を処理するために実行している小さな Java サービスを exec() する必要があります。とても便利な。PHP は XSLT 2.0 変換をサポートしていません。
2] くそー、それは残念です。まあ、たくさんの方法。「リモート ファイル インクルード脆弱性」と呼ばれる一連の脆弱性があり、基本的に、攻撃者が任意のソースを含めてサーバー上で実行することを可能にします。見てみましょう: http://lwn.net/Articles/203904/
また、上記のように、次のようなことを言ってください(非常に単純化されています):
exec("someUnixUtility -f $_GET['arg1']");
さて、攻撃者が url.come?arg1="blah;rm -rf /" を実行すると想像してみてください。コードは基本的に次のように要約されます。
exec("someUnixUtility -f blah; rm -rf /");
UNIX では、コマンドを ; で区切ります。ええ、それは大きな損害になる可能性があります。
ファイルのアップロードと同じように、拡張子を見つけるために最後の 4 文字 (.ext) を削除するとします。さて、この "exploit.php.gif" のようなものはどうでしょうか。次に拡張子を削除すると、exploit.php が作成され、それを /users/imgs/ フォルダーに移動します。攻撃者は、users/imgs/exploit.php を参照するだけで、必要なコードを実行できます。その時点であなたは所有されています。