$somevariable
可能包含空格和其他需要 bash 的特殊字符,并引入安全风险。以下命令等效吗?如果没有,你能给他们排名吗?
bash -c 'somecommand "$1"' bash "$somevariable"
bash -c "somecommand '$somevariable'"
bash -c "somecommand \"$somevariable\""
以下命令等效吗?如果没有,你能给他们排名吗?
find -exec sh -c 'something "$@"' sh {} \;
find -exec sh -c "something '{}'" \;
find -exec sh -c "something \"{}\"" \;
find -exec sh -c 'something "{}"' \;
我找不到每个组中的命令之间的不等效性。
来源于为“bash -c”执行的命令提供参数的方法。这里我想弄清楚findutils手册是否提示的原因
find -exec sh -c 'something "$@"' sh {} \;
代替
find -exec sh -c "something {}" \;
是因为
引用或
移动
{}
到要执行的命令之外sh -c
我在上面第二组中编写的其他命令也同样有效吗?
谢谢。
要攻击组find -exec sh -c "something '{}'" \;
中的第二个命令find
:
$ touch "'; echo world '"
$ find . -exec sh -c "ls '{}'" \;
''\''; echo world '\'''
''\''; echo world '\'''
world
答案1
bash -c
至少在以下示例中命令不相同:
$ var='a
$(uname)'
$ bash -c 'echo "$1"' bash "$var"
a
$(uname)
$ bash -c "echo '$var'"
a
$(uname)
$ bash -c "echo \"$var\""
a
Darwin
命令find
也有所不同:
$ touch 'a
> $(uname)'
$ find . -exec sh -c 'echo "$@"' sh {} \;
.
./a
$(uname)
$ find . -exec sh -c "echo '{}'" \;
.
./a
$(uname)
$ find . -exec sh -c "echo \"{}\"" \;
.
./a
Darwin
$ find . -exec sh -c 'echo "{}"' \;
.
./a
Darwin
所以看来以下内容允许任意代码执行:
bash -c "echo \"$var\""
find . -exec sh -c "echo \"{}\"" \;
find . -exec sh -c 'echo "{}"' \;