bash -c少なくとも、次の例では、コマンドは同じではありません。

bash -c少なくとも、次の例では、コマンドは同じではありません。

$somevariablebash を必要とし、セキュリティ上のリスクを引き起こすスペースやその他の特殊文字を含めることができます。次のコマンドは同じですか?そうでなければランク付けできますか?

bash -c 'somecommand "$1"' bash "$somevariable"
bash -c "somecommand '$somevariable'"
bash -c "somecommand \"$somevariable\""

次のコマンドは同じですか?そうでなければランク付けできますか?

find -exec sh -c 'something "$@"' sh {} \;
find -exec sh -c "something '{}'" \;
find -exec sh -c "something \"{}\"" \;
find -exec sh -c 'something "{}"' \;

各グループのコマンド間に違いが見つかりません。

から"bash -c"で実行されるコマンドに引数を与える方法。ここでは、findutilsのマニュアルでメッセージが表示される理由を知りたいと思います。

find -exec sh -c 'something "$@"' sh {} \;

変える

find -exec sh -c "something {}" \;

だから

  • 見積もりまたは

  • {}実行するコマンドから移動sh -c

上記の2番目のグループで作成した他のコマンドも機能しますか?

ありがとうございます。


find -exec sh -c "something '{}'" \;グループの2番目のコマンドを攻撃するには、次の手順を実行しますfind

$ touch "'; echo world '"
$ find . -exec sh -c "ls '{}'" \;
''\''; echo world '\'''
''\''; echo world '\'''
world 

答え1

bash -c少なくとも、次の例では、コマンドは同じではありません。

$ var='a
$(uname)'

$ bash -c 'echo "$1"' bash "$var"
a
$(uname)

$ bash -c "echo '$var'"
a
$(uname)

$ bash -c "echo \"$var\""
a
Darwin

コマンドfindも異なります。

$ touch 'a
> $(uname)'

$ find . -exec sh -c 'echo "$@"' sh {} \;
.
./a
$(uname)

$ find . -exec sh -c "echo '{}'" \;
.
./a
$(uname)

$ find . -exec sh -c "echo \"{}\"" \;
.
./a
Darwin

$ find . -exec sh -c 'echo "{}"' \;
.
./a
Darwin

したがって、以下はランダムなコード実行を許可するようです。

  • bash -c "echo \"$var\""
  • find . -exec sh -c "echo \"{}\"" \;
  • find . -exec sh -c 'echo "{}"' \;

関連情報