Apache-2.2

使使用者能夠通過 PHP 中的“su -”在伺服器上執行 shell 命令

  • September 11, 2017

我從 GitHub 下載了一個庫,可以在 PHP 腳本中執行 shell 命令。它是這樣工作的:

   $process = new Process("su - {$login}"); 
   $process->put($password);
   $process->put("\n");
   $process->put($command);
   $process->put("\n");
   $data = $process->get();
   $process->put("exit"); 
   $process->put("\n");

它基於proc_open(). 我在我localhost的 Linux 登錄名和密碼上使用它,一切正常。我想在 Web 伺服器上使用這個庫。我想嘗試'www-data'登錄,但不知道要傳遞什麼作為www-data's密碼。使用什麼作為登錄來允許使用者在真實的 Web 伺服器上使用這個庫,而不是 localhost?

(我將此發佈到stackoverflow,但他們否決了它並補充說它與程式無關,更多關於伺服器故障)

首先,從 web 伺服器 PHP 腳本執行系統命令,甚至將密碼以純文字形式儲存在 php 腳本中,這實際上是一個壞主意。想像一下,您正在獲取一些使用者輸入以將其傳遞給$command,現在如果您錯過了一些檢查,您將允許惡意使用者製作使用者參數以在您的系統上執行任意命令。

接下來為什麼你實際上不能這樣做很可能是因為有兩件事:

  1. 您的 www-data 使用者很可能沒有設置任何密碼。這不允許使用su該使用者登錄。
  2. 您的 www-data 使用者外殼很可能設置為/sbin/nologin有意義的內容,因為該使用者不應該以真實使用者身份登錄系統。

但是您實際上不需要更改使用者來執行系統程序。此外,您的發行版很可能有該 www-data 使用者在其下執行 Web 伺服器(使用系統方式),並且您在 Web 伺服器上執行的每個 PHP 腳本都已經在該使用者權限下執行。只需執行您的命令而不執行 su 就可以了。像這樣的東西:

$process = new Process($command); 
$data = $process->get();

如果這不起作用,請參閱該庫手冊,了解如何在沒有 的情況下生成 shell su,可能$process = new Process('/bin/bash')也可以。

引用自:https://serverfault.com/questions/873032