我正在使用在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
有什么方法可以实现这个目标吗?
答案 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']