コマンド注入が機能しない理由
$ 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
コマンドを実行しますか?
ありがとうございます。
答え1
これは と同じプロセスです。「引数をコマンドとして解釈するコマンドに、信頼できないデータを渡すコマンドを実行してください。」。
最初のコマンド、
bash -c "ls \$1" bash '.; echo hello'
次のように処理します。
bash
-c
パラメータ、、、ls $1
でbash
実行します.; echo hello
。 bashは引数を読み取り、-c
コマンドを使用してオプションを記録しls $1
、追加の引数bash
と.; echo hello
;bashが拡張されると、引数を使用して拡張され
ls $1
実行されます。ls
.;
echo
hello
bashが2つの異なるコマンドを実行するには、変数を拡張する前にセミコロンを処理する必要があります。
2番目のコマンドは
bash -c "eval ls \$1" bash '.; echo hello'
次のように処理します。
bash
-c
パラメータ、、、eval ls $1
でbash
実行します.; echo hello
。 bashは引数を読み取り、コマンド-c
でオプションを記録しますeval ls $1
。拡張後は、、、、。
eval
引数を使用して実行されます。ls
.;
echo
hello
eval
その後、引数が再解析され、次がls .
実行されますecho hello
。