gpt4 book ai didi

php - 添加到 sudoers.d 的脚本未以 root 身份执行

转载 作者:IT王子 更新时间:2023-10-29 00:40:26 27 4
gpt4 key购买 nike

在 xubuntu 机器上,我有以下脚本让 PHP 创建我的用户拥有的目录:

<?php
if(!isset($_REQUEST['path'])) die('No path specified');
$path = $_REQUEST['path'];
$res1 = shell_exec("sudo mkdir -p $path");
$res2 = shell_exec("sudo chown -R majid:majid $path");
var_dump($res1, $res2);
?>

脚本在/var/www/path/to/mkdir.php

我还将此文件添加到 /etc/sudoers.d/grantmkdir 中,内容如下:

www-data ALL=(ALL:ALL) NOPASSWD: /var/www/path/to/mkdir.php

我也已将文件 chmod 编辑为 0440。从浏览器访问 mkdir.php,var 转储的输出为 NULL NULL,并且没有创建目录。我做错了什么?

最佳答案

您的设置有点困惑。

当您从浏览器访问此脚本时,apache 使用 www-data 用户启动它。

Sudo 没有被执行。你不能让 apache 通过 sudo 调用你的脚本。您必须将敏感脚本包装到 sudo 调用中。

例如这样:

创建两个脚本。第一个会被 apache 调用,第二个会被第一个通过 sudo 调用。

首先.php:

<?php
if(!isset($_REQUEST['path'])) die('No path specified');
$path = $_REQUEST['path'];
// By the way here you should verify the path! Otherwise malicious users can make your system execute whatever they want...
shell_exec("sudo /var/www/path/to/second.php " . $path);
?>

second.php

#!/usr/bin/php
<?php
shell_exec("sudo mkdir -p " . $argv[1]);
shell_exec("sudo chown -R majid:majid " . $argv[1]);
?>

并通过 sudo 使 second.php 可执行:

/etc/sudoers.d/second

www-data ALL=(ALL:ALL) NOPASSWD: /var/www/path/to/second.php

这样 apache 将启动 first.php,然后使用 sudo 启动 second.php。

您可以测试 sudo 设置是否可以正常登录到您的服务器,切换到 www-data (su www-data)。并手动运行脚本。

一些旁注:

  • 检查错误日志可能会有用。 (tail/var/log/apache/error_log 或 stg 类似)
  • 不要忘记验证您的输入,否则您的系统将容易受到攻击。此问题的详细信息和解决方案:http://php.net/escapeshellarg
  • NULL NULL可以正常。详情:http://php.net/shell_exec

Note:

This function can return NULL both when an error occurs or the program produces no output. It is not possible to detect execution

failures using this function. exec() should be used when access to the program exit code is required.

关于php - 添加到 sudoers.d 的脚本未以 root 身份执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27474657/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com