この例では、コマンドインジェクションが機能しないのはなぜですか?

この例では、コマンドインジェクションが機能しないのはなぜですか?

コマンド注入が機能しない理由

$ bash -c "ls \$1" bash '.; echo hello'
ls: cannot access '.;': No such file or directory
ls: cannot access 'echo': No such file or directory
ls: cannot access 'hello': No such file or directory

しかし、

$ bash -c "eval ls \$1" bash '.; echo hello'

働く?

最初のコマンドでは、まずbashパラメータ拡張を実行し、$1拡張結果を分割してから$1コマンドを実行しますか?

ありがとうございます。

から"bash -c"で実行されるコマンドに引数を与える方法

関連このコード挿入が機能しないのはなぜですか?

ベストアンサー1

これは と同じプロセスです。「引数をコマンドとして解釈するコマンドに、信頼できないデータを渡すコマンドを実行してください。」

最初のコマンド、

bash -c "ls \$1" bash '.; echo hello'

次のように処理します。

  • bash-cパラメータ、、、ls $1bash実行します.; echo hello。 bashは引数を読み取り、-cコマンドを使用してオプションを記録しls $1、追加の引数bash.; echo hello;

  • bashが拡張されると、引数を使用して拡張されls $1実行されます。ls.;echohello

bashが2つの異なるコマンドを実行するには、変数を拡張する前にセミコロンを処理する必要があります。

2番目のコマンドは

bash -c "eval ls \$1" bash '.; echo hello'

次のように処理します。

  • bash-cパラメータ、、、eval ls $1bash実行します.; echo hello。 bashは引数を読み取り、コマンド-cでオプションを記録しますeval ls $1

  • 拡張後は、、、、。eval引数を使用して実行されます。ls.;echohello

  • evalその後、引数が再解析され、次がls .実行されますecho hello

おすすめ記事