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 来执行命令?的主要内容,如果未能解决你的问题,请参考以下文章