为什么命令注入不起作用
$ 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 运行两个不同的命令。
你的第二个命令,
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
then 导致参数被重新解析,从而导致执行ls .
后跟echo hello
。