私の投稿の一つ(忘れた)に対する誰かの返事で私は覚えていました。
bash -c "somecommand \$1" bash $somevariable
変える
bash -c "somecommand $somevariable"
私findutilsのマニュアルでこの例をもう一度参照してください。
find -exec sh -c 'something "$@"' sh {} \;
変える
find -exec sh -c "something {}" \;
どちらの例も、他のソリューションよりも最初のソリューションを使用するのと同じ理由がありますか?それでは何ですか?
促すこの例では、コマンドインジェクションが機能しないのはなぜですか? そしてこれはbashでのコマンド注入の唯一の形式ですか?
答え1
はい。どちらの例も引数をbash -c
orsh -c
に渡す必要があります。議論(引用可能)コードに文字列として挿入する代わりに。
インラインシェルスクリプトに文字列としてコードを挿入すると、挿入された文字列が制御構造を超えてランダムなコマンドを実行したり、シェルがテキストとして扱われる必要がある拡張を実行できます。
例:
bash -c "echo $arg"
$arg
文字列に設定します; ls -la
。
例では、find
ファイル名またはパス名が挿入されたシェルスクリプトの構文を破ったり、制御フローを変更して潜在的に望ましくない結果をもたらす場合に問題が発生します。
追加参考資料: