为什么命令注入在此示例中不起作用?

为什么命令注入在此示例中不起作用?

为什么命令注入不起作用

$ 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 $1, bash,运行.; echo hello。 bash 读取其参数,-c用命令记录选项ls $1,以及额外的参数bash.; echo hello;

  • 当 bash 扩展时ls $1,它会扩展为ls带有参数.;, echohello并运行它。

必须在变量扩展之前处理分号才能使 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;运行

  • evalthen 导致参数被重新解析,从而导致执行ls .后跟 echo hello

相关内容