Exécuter les commandes root via PHP

j'ai un serveur Linux CentOS 5.7 et j'utilise php5.3.x.

sur un système pfSense, vous pouvez redémarrer les services-qui nécessitaient des permissions root en utilisant une page Web php.

j'essaie de faire quelque chose de similaire, j'ai écrit du code php pour exécuter des commandes shell. Par exemple, pour redémarrer le service sshd:

<?php
exec('/sbin/service sshd restart');
?>

et j'ai essayé d'exécuter cette commande via la fonction exec, mais elle a besoin de la permission de root, mais nous avons un utilisateur apache autorité.

j'ai rencontré quelques solutions:

  1. "exécuter apache avec l'utilisateur root" vraiment dangereux. Je ne veux pas le faire.
  2. " apache ALL=NOPASSWD: / sbin / service to / etc / sudoers" J'ai essayé, mais le problème persiste.

D'autres solutions? Merci pour les réponses.


maintenant.. il est intéressant. j'ai essayé @refp post et ça a fonctionné sur mon serveur ubuntu local. Mais j'ai essayé la même chose sur mon serveur cenOS vps. Il ne fonctionne pas.et c'est le log d'erreur d'apache "rm: cannot remove `/var/lock/subsys/vsftpd': Permission denied "

48
demandé sur Tim Post 2011-12-16 13:43:16

5 réponses

de Lire ce post avant de l'essayer, il y a des choix à faire.


Solution à l'aide d'un binaire (wrapper avec le suid bit)

1) créez un script (de préférence .sh ) qui contient ce que vous voulez être exécuté en tant que root.

# cat > php_shell.sh <<CONTENT
  #!/bin/sh
  /sbin/service sshd restart
CONTENT

2) ce fichier devrait être détenu par root, et puisqu'il sera, plus tard, avec les permissions root assurez-vous que seul root a la permission d'écrire dans le fichier.

# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh

3) pour exécuter le script en tant que root, quel que soit l'utilisateur qui l'exécute, nous aurons besoin d'un wrapper binaire. Créez-en un qui exécutera notre php_shell.sh .

# cat > wrapper.c <<CONTENT
  #include <stdlib.h>
  #include <sys/types.h>
  #include <unistd.h>

  int
  main (int argc, char *argv[])
  {
     setuid (0);

     /* WARNING: Only use an absolute path to the script to execute,
      *          a malicious user might fool the binary and execute
      *          arbitary commands if not.
      * */

     system ("/bin/sh /path/to/php_shell.sh");

     return 0;
   }
CONTENT

4) compilez et définissez les permissions appropriées, y compris le bit suid (en disant qu'il devrait fonctionner avec root privilèges):

# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root

php_root s'exécute maintenant avec les permissions root, et exécute les commandes spécifiées dans php_root.sh .


si vous n'avez pas besoin de l'option pour changer facilement quelles commandes qui seront exécutées, je vous recommande d'écrire les commandes directement dans wrapper.c sous l'étape 4 . Alors vous n'avez pas besoin d'avoir un binaire exécutant un script externe exécutant les commandes en question.

dans wrapper.c , utilisez system ("your shell command here"); pour spécifier les commandes que vous souhaitez exécuter.

86
répondu Filip Roséen - refp 2014-08-01 12:21:22

Je ne voudrais pas que PHP exécute de commandes sudo. Pour moi, c'est comme chercher les ennuis. Au lieu de cela, je créerais deux systèmes distincts.

le premier système, en PHP (le niveau web), traiterait les demandes des utilisateurs. Quand une requête est faite qui nécessite une commande sudo, je place cette requête dans une file d'attente. Il peut s'agir d'une base de données ou d'une sorte de logiciel intermédiaire tel que ZeroMQ.

le deuxième système (le niveau d'entreprise) se lirait ou recevrait les messages de cette file d'attente et auraient la capacité d'exécuter des commandes sudo mais ne seront pas dans le cadre de votre processus de serveur web.

je sais que c'est un peu vague et qu'il peut être résolu de différentes façons avec diverses technologies, mais je pense que c'est la meilleure et la plus sûre façon de procéder.

21
répondu Luke 2012-12-19 02:59:39

permet à l'utilisateur de données www d'exécuter program1 et program2 sans mot de passe:

sudo visudo

ajouter au contenu du fichier sudoers:

User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS

Save.

de https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root

4
répondu harrrrrrry 2017-04-13 12:22:38

j'ai récemment publié un projet qui permet à PHP d'obtenir et d'interagir avec un véritable shell Bash, il vous donnera facilement un shell connecté en tant que root. Ensuite, vous pouvez simplement exécuter les commandes de bash individuelles plutôt que de les regrouper dans un script. De cette façon, vous pouvez également gérer le retour. Obtenez-le ici: https://github.com/merlinthemagic/MTS

après le téléchargement, il vous suffit d'utiliser le code suivant:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('service sshd restart');

echo $return1;

//On CentOS 7 output would be like: 
//Redirecting to /bin/systemctl restart  sshd.service

//On CentOS 6 and lower output would be like:
//Stopping sshd:                                             [  OK  ]
//Starting sshd:                                             [  OK  ]
2
répondu MerlinTheMagic 2016-05-22 16:55:55

Solution à l'aide d'un binaire (wrapper avec le suid bit) La modification de Filip Roséen - refp après.

pour exécuter une commande wrapper modifiée.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main (int argc, char  **argv)
{
 setuid (0);
 char cmd[100] = "";
 int i;
 char *p;
 for(i=0; i < argc; i++) {
    if(i != 0){
   strcat(cmd, *(argv+i));
   strcat(cmd, " ");
    }
 }

 system (cmd);

 return 0;
 }

compiler et définir les permissions appropriées;

  gcc wrapper.c -o php_root     # php_root can be any name.
  chown root php_root
  chmod u=rwx,go=xr,+s php_root

appelle maintenant de PHP. Exécutez n'importe quelle commande.

 shell_exec('./php_root '.$cmd);//execute from wrapper
2
répondu sharif143 2018-03-11 05:20:20