
测试代码:envX='() { (a)=>' sh -c "echo date"; cat echo如果输出结果中含有当前时间,并在当前目录生成了e cho文件(文件内容就是当前时间)则说明需要修复。类似下面的输出:root@ubuntu730:~# env X='() { (a)=>' sh -c "echo date"; catechosh: X: 行 1: 未预期的符号 `='附近有语法错误sh: X: 行 1: `'sh: `X' 函数定义导入错误201498:11:51 CST
分析X='() { (a)=>’这是定义一个X的环境变量。但是,这个函数不完整啊,这是故意的。另外你一定要注意,’不是为了单引号的转义,X这个变量的值就是 () {(a)=>其中的(a)=这个东西目的就是为了让bash的解释器出错(语法错误)。语法出错后,在缓冲区中就会只剩下了“>”这两个字符。于是,这个神奇的bash会把后面的命令echodate换个行放到这个缓冲区中,然后执行。相当于在shell下执行了下面这个命令:$>echodate如果你了解bash,你会知道 是用于命令行上换行的,于是相当于执行了:$ >echodate这不就是一个重定向么?上述的命令相当于:$ date >echo于是,你的当前目录下会出现一个echo的文件,这个文件的内容就是date命令的输出。