【问题标题】:shell_exec returns NULL but when tried from console, it worksshell_exec 返回 NULL 但从控制台尝试时,它可以工作
【发布时间】:2011-10-17 04:14:51
【问题描述】:

我有三个 php 脚本。一,我从初始化脚本开始。第二个由第一个本身启动,然后第二个使用shell_exec 通过定期向第三个脚本传递各种参数来获取第三个脚本的输出。

但这并没有发生。当我var_dumpshell_exec 的输出时,在第二个脚本中,我得到NULL。但是当我在第二个脚本中打印shell_exec 中使用的实际命令并尝试将其输入到控制台时,它工作得很好!

我从启动初始化脚本的同一用户的控制台尝试了命令。

这可能是权限问题。但我有适当的权限设置,即

  1. +x 用于第三个脚本
  2. 第三个脚本(实际上这三个脚本都是)由我使用控制台的同一用户和组拥有

注意 - 我尝试使用 shebang 启动第三个脚本,以及删除 shebang 并在脚本路径前添加 php。使用 root 一切运行良好。

另外,请注意,第一个脚本将第二个脚本的输出重定向到日志文件(这是我发现第三个脚本在 shell_exec 上返回 NULL

更新:第二个脚本的代码使用shell_exec

$command = "/var/data/user-data.php '{$user}' '{$request['token']}' '{$request['secret']}'";
$data = json_decode( shell_exec( $command ), true );   

我尝试打印$commandvar_dump( shell_exec( $command ) )。前者返回预期值(参数),后者返回 NULL

【问题讨论】:

  • 发布您使用的确切代码

标签: linux daemon php


【解决方案1】:

没有直接评论问题是什么-

停下来。不要掏空。这是一个安全雷区。

$command = "/var/data/user-data.php '{$user}' '{$request['token']}' '{$request['secret']}'";

如果用户通过了会发生什么,比如说:

http://yoursite.com/index.php?token=';rm -rf / #

Answer: 你的整个服务器都被删除了(或者至少是 PHP 脚本用户可以触摸的任何东西)。当然,人们还可以做其他更阴险的事情。而这种漏洞可以并且被自动扫描器发现,进而自动root你的服务器。

所以不要掏空,尤其是当您只是调用另一个 PHP 脚本时。将您的代码放入一个函数中,包含包含它的 php 文件,并在需要数据时调用该函数。

【讨论】:

  • 这些文件不在网络根目录中,实际上只是$request 而不是$_REQUEST :) 但是,是的,我喜欢包含脚本的想法。
  • @KPL,不管它们是否在网络根目录中,如果用户可以控制任何这些变量,你就完蛋了。即使您拥有安全权利(如果您甚至考虑为此进行炮击,这极不可能),炮击也很慢并且实际上比将该死的东西放入函数中更多的工作。
  • 这应该是评论,绝对不值得作为答案。我在这里的问题和原因是找出 shell_exec 返回 null 的原因。你没有回答。 wtf 与互联网有关,每个人都认为有更好的方法来做某事。 stfu 并回答人们提出的问题。
  • @JonathonByrd,我拒绝给人们建议,如果实施,可能会使互联网成为一个更危险的地方。通常有比炮击更好的方法来做你想做的事,而且在 OP 的特定情况下,几乎可以肯定是这样。不过,如果没有大小限制,我会发表评论 :) 如果您有合法的用例,请随时提出另一个问题 - 请务必引用此问题,以免人们认为它是重复的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多