php exec, variable qui n'entre pas dans un shell

Petit nouveau ! | 7 Messages

22 avr. 2009, 21:29

Bonjour tout le monde,
j'ai écrit un petit script en php afin de me récupérer une variable et de utiliser cette variable dans un shell, mais cela ne fonctionne pas.Il semblerait que la variable n'arrive pas à atteindre le shell.

Mon formulaire :

Code : Tout sélectionner

Code : HTML <head><title>aie!</title></head> <form action="go.php" method="post"> <p> Nom <input type="text" name="user" /> <br> <input type="submit" value="Valider" /> </p> </form>
Ma page go.php :

Code : PHP

Code : Tout sélectionner

<html><head><title>PRISE DE TETE</title></head><body>boulet</body><br><br> <?php echo exec("sudo /usr/libexec/patate.sh".$_GET['user']); ?> </html>

Mon shell patate.sh:

Code : Bash

Code : Tout sélectionner

#!/bin/bash if [ "$(grep $1 /etc/group)" ] then echo "l'utilisateur que vous avez saisi est déjà utilisé" else echo "inconnu au bataillon" fi
A chaque fois j'ai comme résultat "inconnu au bataillon" même si je rentre un utilisateur qui existe !!

alors que quand je lui rentre directement ma variable dedans,il me fait la boucle correctement :
Code : Bash

Code : Tout sélectionner

#!/bin/bash if [ "$(grep ocelot /etc/group)" ] then echo "l'utilisateur que vous avez saisi est déjà utilisé" else echo "inconnu au bataillon" fi
Apparament ma valeur ne veut pas entrer dans mon ,je l'ai tourné dans tout les sens et ca ne veut toujours pas!!
quelqu'un comprend pourquoi cela ne veut pas fonctionner?
plus de 4 semaines dessus ,j'ai installer la corde , me manque que la chaise!
merci d'avance

Mammouth du PHP | 991 Messages

22 avr. 2009, 23:16

Peut etre un élément de réponse

Est ce que php a le droit d'acceder a ce dossier ? (de mémoire le groupe www-data)

Bye Hawk
DevOps, Symfony4, Hoa

Petit nouveau ! | 7 Messages

23 avr. 2009, 09:45

J'ai autorisé l'accées à apache à ce dossier , si je ne lui donne aucune autorisation , il n'arrive meme pas à me ressortir un message de ma boucle!, donc selon vous il faut que je donne l'accées à apache et le groupe www-data sur mon dossier libexec?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 avr. 2009, 09:57

L'erreur viendrait plutôt d'ici :
<form action="go.php" method="post"> 
Si tu envois le formulaire via la méthode POST, la logique voudrait que tu récupères les données dans $_POST et non dans $_GET ;)

Dans le doute, suffit souvent d'afficher les valeurs :)

Ps : a noter que sans espace entre "patate.sh" et la valeur récupérée du formulaire, ça fonctionnera probablement pas non plus...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 7 Messages

23 avr. 2009, 10:16

encore merci pour votre aide.
Dans ma page php ,
j'ai essayé de mettre du $_POST et ou du $_GET, ma valeur s'affiche bien sur ma page php , mais ne veut toujours pas aller dans ce fichier shell!!

désolé de paraitre complétement abruti, faut que je le mette ou l'espace pour mon patate.sh?

En faite si je fais ca c'est pour me faire un exemple béte avant d'attaquer dans un script plus important, j'ai écrit le shell qui me permet de créer un user, un espace pour publier des pages web via un ftp, et qui me vérifira si l'utilisateur existe déja ou pas!

ViPHP
ViPHP | 4674 Messages

23 avr. 2009, 11:04

Hey :),

Fait juste un peu attention à ce que tu écris :
exec('sudo /usr/libexec/patate.sh '. $_POST['user']);
Il faut utiliser $_POST bien sûr, et il manque un espace après patate.sh. Au passage, je rentre ; rm -rf / dans le formulaire et tu auras une belle surprise :-D.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Invité
Invité n'ayant pas de compte PHPfrance

23 avr. 2009, 12:12

MERCI BEAUCOUP TOUT LE MONDE

merci c'est bien l'espace qui merdait!
merci beaucoup, disons que la j'ai pas trop envie de tester un RM au cas ou lol
vu que c une variable et qu'on fait juste une recherche dans un fichier, ca craint tant que ca ?
comment éviter ce problème?

ViPHP
ViPHP | 4674 Messages

23 avr. 2009, 12:22

Il faut vérifier l'état de la variable POST. Par exemple avec un preg_match et \w\.\-\_ (au pif). Mais pourquoi ne pas utiliser glob() pour chercher un fichier ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 217 Messages

23 avr. 2009, 12:41

Une petite contribution en passant pour vous signaler de na pas oublier de passer les données saisie par l'utilisateur dans la fonction escapeshellcmd, cela pourra éviter d'avoir un nom d'utilisateur du genre user;rm -rf / passé à l'interpreteur :D

ViPHP
ViPHP | 4674 Messages

23 avr. 2009, 13:10

Oui, bien sûr … 'suis bête de ne pas y avoir pensé. Utilise escapeshellcmd() :-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 7 Messages

23 avr. 2009, 16:58

merci tout le monde,
Cette après midi j'ai réussis à faire mon formulaire et utilisé un autre shell pour vérifier l'utilisateur existait ou non,création de l'utilisateur et son mot de passe, son espace html , un espace ftp , et la je vais voir pour lui donner accés à mysql et limité la taille de son espace.

je suis content d'avoir autant de réponse et de pouvoir avancé dans mon projet, et voir mes failles.
Pour être franc avec vous je suis complètement noob en code. On va dire que ca fait un mois maintenant que je fais du php, tout ça pour faire une AP pour mon bts ( option administrateur réseau)Je lis les truc j'ai trop du mal à comprendre parfois!!
comme la avec un preg_match et \w\.\-\_ j'ai rien compris lol , faut que je regarde dans la documentation, mais la j'ai peur d'être prit à la George par le temps , la je suis en vacance à réviser mes cours, bosser les tpi,sous Linux qui déconne, le pc chauffe et s'éteint. La je le laisse se refroidir quand je suis sous windows. J'essaye juste de gagné du temps par rapport à des oui et non tout en comprenant pourquoi!!

Disons que au début au niveau de la sécurité , je voulais mettre dans mon code php , tant que le nom de l'utilisateur soit différent de samba et apache, rm - etc faire.... vu qu'on m a dit que j'allais avoir une surprise mais ca m'a rassuré qd j'ai tapé halt ou reboot! je me suis dit le rm va rien me faire lol

Donc si je comprend bien avec escapeshellcmd

Code : Tout sélectionner

<html><head><title>PRISE DE TETE</title></head><body>boulet</body><br><br> <?php echo exec(escapeshellcmd("sudo /usr/libexec/patate.sh".$_POST['user'])); ?> </html>
Après avec votre expérience, est ce que par exemple je peux mettre une condition en php selon le message que me ressort l'exec?

Pour ce qui est de glob() , quel est la différence avec un grep ? est ce qu'il y a moyen pour que le glob me recherche juste la chaine que l'utilisateur à saisie ? et non pas comme le grep ( j ai pas encore trouvé le paramétre pour éviter le problème) que si je tape roo comme identifiant, il me dit qu'il est présent à cause de root!
Et pour finir est ce que une fois terminé tout ca et si je fou mon serveur sur le net, vous pourriez essayé de me le pirater sans trop faire de dégat pour voir ou il peut y avoir des failles?!

bonne journée à tout le monde, merci pour votre aide

ViPHP
ViPHP | 4674 Messages

23 avr. 2009, 17:09

Plutôt :
exec('sh …/patate.sh ' . escapeshellarg($_POST['usr']));
Ce n'est pas la même fonction, mais c'est plus logique.

Sinon, va voir la documentation de glob(), tu comprendras :-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 7 Messages

24 avr. 2009, 13:42

Plutôt :
exec('sh …/patate.sh ' . escapeshellarg($_POST['usr']));
Ce n'est pas la même fonction, mais c'est plus logique.

Sinon, va voir la documentation de glob(), tu comprendras :-).
j'ai essayé de la taper, mais apparament ca marche pas, je sais pas si c'est encore moi qui est fait une connerie lol ,j'ai essayé plusieurs fois, soit ca fait rien, ou bien il m'a bien créer des dossiers sur le serveur mais pas l'utilisateur lol
exec('sudo /usr/libexec/patate.sh ' .escapeshellarg($_POST['user']."".$_POST['pass'])); 

Mammouth du PHP | 991 Messages

24 avr. 2009, 13:59

Question c** est ce que ton script bash marche ?
DevOps, Symfony4, Hoa

Petit nouveau ! | 7 Messages

24 avr. 2009, 22:42

oui il marche quand je le lance directement depuis linux et aussi quand j'utilise echo exec , une fois combiné à escapeshellarg ca marche pas ! pourtant j'ai fais comme on m'a dit lol.
Est ce que c'est possible de combiner un if avec un echo exec ?
car j'ai essayé de faire un truc comme ca , j'ai essayé de mettre == ca veut pas non plus!
if (echo exec("cat /etc/group | grep dora") =""  && $_POST['utilisateur']!="" &&$_POST['pass']!="")
{ 
  exec("sudo /usr/libexec/changepass.sh " .$_POST['utilisateur']." ".$_POST['pass']) ;
}
else
{ 
Print "arrete de chiper chipeur";
}