逃脱美元符号sh -c

时间:2016-10-19 15:26:57

标签: bash sh

我正在使用在bash中运行命令的应用程序。这是"模板"它正在使用:

sh -c '<command> "<argument>"'

请注意我无法编辑引号,只有我可以编辑的是命令和参数。我无法摆脱美元符号。

这个&#34;模板&#34;除非参数中有一个美元符号,否则工作正常:

sh -c 'echo "x=test$test"'

给出以下输出:

x=test

如何获得确切的输出,即:

x=test$test

如果我可以切换引号,我可以这样做:

sh -c "echo '"'x=test$test'"'"
x=test$test

有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

如果您的sh -c命令是由bash 运行的(而不是基线POSIX shell),并且您的参数不包含'文字,那么您可以做一些诡计,如下:

#!/bin/bash
sh -c 'echo ""'$'\'x=test$test\'""'

也就是说,字符"'$'\'应该添加到<argument>前面,并且\'"应该附加。

请注意,这是针对shell注入攻击的绝对不安全。为此,我们需要修改argument的内部内容;至少将\替换为\\,将'替换为\'

更好(特别是从安全角度来看)将修复您正在使用的程序,以便从代码中带外传递参数。要做到这一点,就意味着argv看起来如下(在下面的Python语法中适用于subprocess.Popen(cmd, shell=False)):

['sh', '-c', 'echo "$1"', '_', 'x=test$test']