esox_ch | Bon j'ai toujours pas trouvé comment faire en passant par Su, j'ai donc écrit un script passant par sudo en sécurisant le sécurisable :
visudo.sh (a executer en root la 1ere fois)
Code :
- echo "www-data CColomb=(ALL,!root) NOPASSWD: /usr/bin/passwd" >> /etc/sudoers
|
(Où www-data est l'utilisateur avec lequel tourne apache, CColomb est le nom de mon serveur, veillez à changer les path selon vos besoins)
La partie "interessante" du php
Code :
- if(eregi('^[[:alnum:]_.[:space:]-_]*$',$_POST['password']))
- {
- $command = 'sudo -u '.$user.' passwd';
- $descriptorspec = array(
- 0 => array("pipe", "r" ), // stdin is a pipe that the child will read from
- 1 => array("pipe", "w" ), // stdout is a pipe that the child will write to
- 2 => array("file", "/tmp/error-output.txt", "a" ) // stderr is a file to write to
- );
- $process = proc_open($command, $descriptorspec, $pipes, $cwd, $env);
- if (is_resource($process)) {
- // 0 => writeable handle connected to child stdin
- // 1 => readable handle connected to child stdout
- // Any error output will be appended to /tmp/error-output.txt
- fwrite($pipes[0], $_POST['password']."\n" );
- fwrite($pipes[0], $_POST['password']."\n" );
- fclose($pipes[0]);
- fclose($pipes[1]);
- // It is important that you close any pipes before calling
- // proc_close in order to avoid a deadlock
- $return_value = proc_close($process);
- file_put_contents('/tmp/error-output.txt',"\n".$return_value."\n" );
- }
- }
- else
- echo '<p> Sorry but the password cannot contain special caracters other than white space, dot, underscore and dash</p>';
|
Attention : La seule raison pour laquelle je n'ai pas fait de test sur la variable $user (par exemple controler qu'elle ne contient pas de caractères dangeureux) est qu'elle est considérée comme "sûre" dans cette partie du code étant donné qu'elle est récupérée à partir d'un fichier en lecture seule, dont tout le contenu est sûr. Si vous obtenez le username via le formulaire il vous faut absolument faire les contrôles qui vont bien dessus ! Autrement vous risquez qu'on vous injecte du code dans votre ligne de commande (avec les conséquences qui s'en suivent!)
Si qqn à mieux je suis tout à fait ouvert
---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
|