PHP system() 函数 - 它是不是使用 shell 来执行命令?

Posted

技术标签:

【中文标题】PHP system() 函数 - 它是不是使用 shell 来执行命令?【英文标题】:PHP system() function - does it use shell to execute command?PHP system() 函数 - 它是否使用 shell 来执行命令? 【发布时间】:2015-12-04 08:01:50 【问题描述】:

我阅读了相关的post,我得到的印象是php 中的system() 函数不使用shell。但是后来看到owasp上发布了以下示例-页面上的示例6:

以下 PHP 代码 sn-p 易受命令注入攻击:

<?php
print("Please specify the name of the file to delete");
print("<p>");
$file=$_GET['filename'];
system("rm $file");
?>

以下请求和响应是成功攻击的示例: 请求

http://127.0.0.1/delete.php?filename=bob.txt;id

回应

Please specify the name of the file to delete

uid=33(www-data) gid=33(www-data) groups=33(www-data) 

如果没有shell,为什么系统会被分号或php中的system()函数实现以这种方式识别分号?

【问题讨论】:

【参考方案1】:

是的,这个例子会告诉你:

echo system("echo $0");

【讨论】:

【参考方案2】:

它确实使用了外壳。在您链接到的问题中,我没有看到任何答案。

documentation 说:

system() 就像函数的 C 版本一样,它执行给定的命令并输出结果。

由于 C 函数使用 shell,PHP 函数也是如此。

文档有点误导,因为 C 函数不返回任何命令输出,而 PHP 函数返回输出的最后一行。

【讨论】:

我很困惑,因为 php 有一个名为 shell-exec() (php.net/manual/en/function.shell-exec.php) 的函数。我想他们为什么需要其中两个? 我不知道为什么 PHP 有所有这些不同的函数来执行命令。但据我所知,它们都使用 shell。 它们返回输出的方式略有不同。 shell_exec 将所有输出作为字符串返回,system 仅返回最后一行,exec 返回最后一行并将所有输出行附加到按值传递的数组中。

以上是关于PHP system() 函数 - 它是不是使用 shell 来执行命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 PHP 中是不是加密的 Zip 存档?

PHP执行系统外部命令函数:exec()passthru()system()shell_exec()

PHP:一个函数能知道它是不是被赋值为一个值吗?

GET参数不是空的,但我不能在PHP函数中使用它。

请教大牛 在win系统下 php调用系统命令删目录

win2003 PHP服务器的突破新思路