J'ai besoin de détecter si php fonctionne en tant que personne. Comment puis-je faire cela?
Existe-t-il d'autres noms pour "personne"? "Apache"? D'autres?
Si disponible, vous pouvez sonder le compte d'utilisateur actuel avec posix_geteuid
puis obtenir le nom d'utilisateur avec posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Cependant, si vous utilisez le mode sans échec (ce qui est souvent le cas lorsque exec est désactivé), il est peu probable que votre processus PHP soit exécuté sous un compte autre que le compte par défaut www-data
ou Apache
.
<?php echo exec('whoami'); ?>
Sorte de retour, mais sans exec/system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Si vous créez un fichier, le propriétaire sera l'utilisateur PHP.
Cela pourrait également probablement être exécuté avec l'une des fonctions de fichier temporaire telles que tempnam()
, qui crée un fichier aléatoire dans le répertoire temporaire et renvoie le nom de ce fichier. Si des problèmes liés aux autorisations, au open_basedir
ou au mode sans échec empêchent l'écriture d'un fichier, le répertoire temporaire est toujours autorisé.
Plus de détails seraient utiles, mais en supposant qu'il s'agisse d'un système linux, et en supposant que php fonctionne sous Apache, il fonctionnera de la même manière que l'utilisateur.
Un moyen facile de vérifier (encore une fois, en supposant que certains environnements sont similaires à Unix) est de créer un fichier php avec:
<?php
print Shell_exec( 'whoami' );
?>
ce qui vous donnera l'utilisateur.
Pour mon instance AWS, je reçois Apache
en sortie lorsque j'exécute ce script.
Vous pouvez essayer d'utiliser des backticks comme ceci:
echo `whoami`;
j'utiliserais:
lsof -i
lsof -i | less
lsof -i | grep :http
aucun de ceux-ci. Vous pouvez taper em dans votre ligne de commande ssh et vous verrez quel utilisateur écoute quel service.
vous pouvez aussi aller vérifier ce fichier:
more /etc/Apache2/envvars
et cherchez ces lignes:
export Apache_RUN_USER=user-name
export Apache_RUN_GROUP=group-name
pour filtrer les données du fichier envvars, vous pouvez utiliser grep:
more /etc/Apache2/envvars |grep Apache_RUN_
exec('whoami')
le fera
<?php
exec('whoami');
?>
ajoutez le fichier info.php au répertoire suivant - votre répertoire http/Apache par défaut - normalement/var/www/html
avec le contenu suivant
<?php
phpinfo();
?>
Puis httpd/Apache redémarrez Allez dans votre répertoire HTML par défaut http://enter.server.here/info.php
livrerait le pedigree php entier!
Dans ma configuration, je souhaite vérifier si le processus en cours est autorisé à créer des dossiers, des sous-dossiers et des fichiers avant de commencer un processus, et proposer une solution si cela semble impossible. Je voulais exécuter stat(<file>)
sur différentes choses pour m'assurer que les autorisations correspondent à celles du processus en cours (j'utilise php-fpm, donc cela varie en fonction du pool).
La solution basée sur le posix que Mario a donnée ci-dessus, semble parfaite, mais il semble que l'extension posix soit --disabled. Je ne pouvais donc pas faire ce qui précède et comme je veux comparer les résultats avec la réponse de stat () exécutant whoami
dans un shell séparé n'est pas utile non plus (j'ai besoin de l'uid et gid pas le nom d'utilisateur).
Cependant, j’ai trouvé un indice utile: je pouvais utiliser stat(/proc/self)
et stat(/proc/self/attr)
et voir les uid et gid du fichier.
J'espère que ça aide quelqu'un d'autre
Directement à partir de Shell, vous pouvez exécuter:
php -r "echo exec('whoami');"
Vous pouvez utiliser ces commandes:
<? system('whoami');?>
ou
<? passthru('whoami');?>
ou
<? print exec('whoami');?>
ou
<? print Shell_exec('whoami');?>
ou
<? print get_current_user();?>
Un peu tard, mais même si ce qui suit est une solution de contournement, cela résout le problème car cela fonctionne parfaitement:
<?
function get_sys_usr()
{
$unique_name = uniqid(); // not-so-unique id
$native_path = "./temp/$unique_name.php";
$public_path = "http://example.com/temp/$unique_name.php";
$php_content = "<? echo get_current_user(); ?>";
$process_usr = "Apache"; // fall-back
if (is_readable("./temp") && is_writable("./temp"))
{
file_put_contents($native_path,$php_content);
$process_usr = trim(file_get_contents($public_path));
unlink($native_path);
}
return $process_usr;
}
echo get_sys_usr(); // www-data
?>
La mise en surbrillance du code ci-dessus n’est pas exacte. Copiez-collez-la dans votre éditeur favori et affichez-la sous forme de code PHP ou sauvegardez-la et testez-la vous-même.
Comme vous le savez probablement, get_current_user()
renvoie le propriétaire du "script en cours d'exécution" - de sorte que si vous n'avez pas "chown" un script sur le serveur à l'utilisateur du serveur Web, il s'agira probablement de "personne", ou si le développeur -user existe sur le même système d'exploitation, il affichera plutôt ce nom d'utilisateur.
Pour contourner ce problème, nous créons un fichier avec le processus en cours d'exécution. Si vous ne faites que require()
this dans le script en cours d’exécution, le résultat sera identique à celui du script parent mentionné ci-dessus; donc, nous devons l'exécuter en tant que demande distincte pour prendre effet .
Pour rendre cela efficace, envisagez d'exécuter un modèle de conception intégrant le "mode d'exécution". Ainsi, lorsque le serveur est en "mode de développement ou en mode test", il est le seul à pouvoir exécuter cette fonction et enregistrer sa sortie quelque part dans une inclusion. , ou simplement du texte brut ou une base de données, ou autre.
Bien sûr, vous pouvez modifier certains détails du code ci-dessus si vous souhaitez le rendre plus dynamique, mais la logique est la suivante:
$_SERVER["USER"]
$_SERVER["USERNAME"]
J'utilise habituellement
<?php echo get_current_user(); ?>
Je serai heureux si cela vous a aidé
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Utilisateur authentifié
<?php phpinfo(); ?>
enregistrer sous info.php et
ouvrez info.php dans votre navigateur
ctrl + f puis tapez l'un de ces éléments:
Apache_RUN_USER
Apache_RUN_GROUP
user/group
vous pouvez voir l'utilisateur et le groupe sous lequel Apache est exécuté.