
コマンド・インジェクション
とりあえず、コマンド・インジェクションだけを見てみましょう。主にいくつかの異なる例に焦点を当てて、実際にどのように見えるかがわかりやすいようにします。簡単に説明しておきますが、コマンドインジェクションの脆弱性は、ユーザー入力が次の関数のようにオペレーティングシステムのコマンドの一部を使用する場合に発生します。
IP = request.Params.IPAddress; とします。
システム (「ping」+ IP);
ユーザーがIPアドレスを提供した場合、例として「8.8.8.8」を使用します。実行されるコマンドは「ping 8.8.8.8」で、期待どおりに動作します。ただし、ユーザーが `8.8.8.8 && ls /etc/ `を指定した場合、このコマンドは実行されません。 ただ IP 8.8.8.8 に ping を実行しますが、「/etc/」フォルダで「ls」も実行されます。
緩和策
コマンド・インジェクション攻撃の深刻さを考えると、システム・コマンドを扱う際にまず確認しておくべき重要な質問がいくつかあります。
- 本当にそのコマンドを呼び出す必要がありますか?最善の防御策は、システムコマンドを絶対に呼び出さないことです。
- システムコマンドを使わなくても同じ効果が得られるライブラリ/バインディングはありますか?
- コマンド自体ではなく、Standard In を使用してプロセスにデータを渡すことはできますか?
これらが不可能な場合は、パラメータ化が重要です。
例
これが実際にどのように見えるかを示すのに役立つ、さまざまな言語での例をいくつか示します。
パラメータ化を使用しないと、コマンドインジェクションの脆弱性が生じます。
文字列フォルダ =「/tmp/ &&ifconfig」;
文字列 cmd =「\" ls "+ フォルダ +"\ "」;
//安全ではない:`ls` コマンドと `ifconfig` コマンドの両方を実行します
システム. 診断. プロセス. スタート (「bash」,「-c」+ cmd);
C#-セキュア
コマンドをパラメーターのリストとして提供することで、コマンドはパラメーター化され、コマンド・インジェクションから保護されます。
文字列フォルダ =「/tmp/ &&ifconfig」;
<string>リスト引数 = 新しいリスト <string>() {」-c」,「ls」, フォルダ};
//セキュア:ifconfig コマンドを実行しません
システム. 診断. プロセス. 開始 (「bash」、引数);
Java-安全ではありません
パラメータ化を使用しないと、コマンドインジェクションの脆弱性が生じます。
文字列フォルダ =「/tmp/ &&ifconfig」;
//安全ではない:`ls` コマンドと `ifconfig` コマンドの両方を実行します
プロセスビルダー b = 新しいプロセスビルダー (「bash-c ls」+ フォルダー);
プロセス p = pb.start ();
Java-セキュア
コマンドをパラメーターのリストとして提供することで、コマンドはパラメーター化され、コマンド・インジェクションから保護されます。
文字列フォルダ =「/tmp/ &&ifconfig」;
//セキュア:ifconfig コマンドを実行しません
プロセスビルダー b = 新しいプロセスビルダー (「bash」、「-c」、「ls」、フォルダー);
プロセス p = pb.start ();
ジャバスクリプト-安全ではありません
パラメータ化を使用しないと、コマンドインジェクションの脆弱性が生じます。
const {exec} = 必須 (「子プロセス」);
const フォルダー =「/tmp/ &&ifconfig」;
//安全ではない:`ls` コマンドと `ifconfig` コマンドの両方を実行します
const ls = exec (「bash-c ls」+ フォルダ、(エラー、標準出力、標準エラー) => {
console.log (`stdout: $ {stdout} `);
});
ジャバスクリプト-セキュア
const {spawn} = 必要 (「子プロセス」);
const フォルダー =「/tmp/ &&ifconfig」;
//セキュア:ifconfig コマンドを実行しません
const ls = spawn (「bash」, [」-c」,「ls」,「フォルダ]);
ls.stdout.on (「データ」、データ => {
console.log (`stdout: $ {data} `);
});
パイソン-安全でない
パラメータ化を使用しないと、コマンドインジェクションの脆弱性が生じます。
インポートサブプロセス
フォルダ =「/tmp/ & ifconfig」
# 安全ではない:`ls`コマンドと`ifconfig`コマンドの両方を実行する
サブプロセス.run (「bash-c ls」+ フォルダ、シェル=true)
パイソン-セキュア
コマンドをパラメーターのリストとして提供することで、コマンドはパラメーター化され、コマンド・インジェクションから保護されます。
インポートサブプロセス
フォルダ =「/tmp/ & ifconfig」
# セキュア:ifconfig コマンドを実行しません
サブプロセス.run (["bash」、「-c」、「ls」、フォルダ])