Ich muss erkennen, ob PHP als niemand läuft. Wie mache ich das?
Gibt es noch andere Namen für "niemand"? "Apache"? Irgendwelche anderen?
Ich muss erkennen, ob PHP als niemand läuft. Wie mache ich das?
Gibt es noch andere Namen für "niemand"? "Apache"? Irgendwelche anderen?
Antworten:
Falls verfügbar, können Sie das aktuelle Benutzerkonto mit prüfen posix_geteuidund dann den Benutzernamen mit abrufen posix_getpwuid.
$username = posix_getpwuid(posix_geteuid())['name'];
Wenn Sie jedoch im abgesicherten Modus ausgeführt wird (was oft der Fall ist , wenn exec deaktiviert ist), dann ist es unwahrscheinlich , dass Ihr PHP - Prozess unter etwas läuft , aber das Standard - www-dataoder apacheKonto.
get_current_user()Manpage , der diesen Ansatz zeigt. Ab PHP 5.4 kann es wie folgt gekürzt werden:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
Art rückwärts, aber ohne exec / system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Wenn Sie eine Datei erstellen, ist der Eigentümer der PHP-Benutzer.
Dies kann wahrscheinlich auch mit einer der temporären Dateifunktionen ausgeführt werden, z. B. tempnam()die eine zufällige Datei im temporären Verzeichnis erstellt und den Namen dieser Datei zurückgibt. Wenn es Probleme aufgrund von Berechtigungen open_basediroder des abgesicherten Modus gibt, die das Schreiben einer Datei verhindern, ist das temporäre Verzeichnis normalerweise weiterhin zulässig.
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');würde eine temporäre Datei im temporären Verzeichnis auf fast jedem System erstellen. Sie können diese Datei dann verwenden, um den Benutzer / die Gruppe abzurufen. Ich habe einiges davon dem Benutzer überlassen, um es herauszufinden.
Weitere Details wären nützlich, aber wenn es sich um ein Linux-System handelt und wenn PHP unter Apache ausgeführt wird, wird es so ausgeführt, wie der Benutzer-Apache ausgeführt wird.
Eine einfache Möglichkeit, dies zu überprüfen (wiederum unter der Annahme einer Unix-ähnlichen Umgebung), besteht darin, eine PHP-Datei zu erstellen mit:
<?php
print shell_exec( 'whoami' );
?>
das gibt Ihnen den Benutzer.
Für meine AWS-Instanz bekomme ich apache beim Ausführen dieses Skripts eine Ausgabe angezeigt.
Sie können versuchen, Backticks wie folgt zu verwenden:
echo `whoami`;
ich würde ... benutzen:
lsof -i
lsof -i | less
lsof -i | grep :http
eines davon. Sie können em in Ihre ssh-Befehlszeile eingeben und sehen, welcher Benutzer welchen Dienst abhört.
Sie können diese Datei auch überprüfen:
more /etc/apache2/envvars
und suchen Sie nach diesen Zeilen:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
Um die Daten der envvars-Datei herauszufiltern, können Sie grep verwenden:
more /etc/apache2/envvars |grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvarshat gut funktioniert, danke.
exec('whoami') werde das tun
<?php
echo exec('whoami');
?>
Direkt aus der Shell können Sie laufen:
php -r "echo exec('whoami');"
Fügen Sie die Datei info.php dem folgenden Verzeichnis hinzu - Ihrem Standardverzeichnis http / apache - normalerweise / var / www / html
mit folgenden Inhalten
<?php
phpinfo();
?>
Starten Sie anschließend httpd / apache neu und wechseln Sie in Ihr Standard-HTML-Verzeichnis http://enter.server.here/info.php
würde den ganzen PHP-Stammbaum liefern!
In meinem Setup möchte ich überprüfen, ob der aktuelle Prozess die Berechtigung zum Erstellen von Ordnern, Unterordnern und Dateien hat, bevor ich einen Prozess beginne, und eine Lösung vorschlagen, wenn es so aussieht, als ob ich es nicht kann. Ich wollte stat(<file>)verschiedene Dinge ausführen, um sicherzustellen, dass die Berechtigungen mit denen des laufenden Prozesses übereinstimmen (ich verwende php-fpm, daher variiert dies je nach Pool).
Die oben angegebene posix-basierte Lösung, die Mario oben angegeben hat, scheint perfekt zu sein, jedoch scheint die posix-Erweiterung --disabled zu sein, sodass ich die oben genannten Schritte nicht ausführen konnte und die Ergebnisse mit der Antwort von stat () vergleichen möchte, die whoamiin einer separaten Shell ausgeführt wird ist auch nicht hilfreich (ich brauche die UID und GID nicht den Benutzernamen).
Ich fand jedoch einen nützlichen Hinweis, ich konnte stat(/proc/self)und stat(/proc/self/attr)und sah die UID und GID der Datei.
Hoffe das hilft jemand anderem
Sie können diese Befehle verwenden:
<? system('whoami');?>
oder
<? passthru('whoami');?>
oder
<? print exec('whoami');?>
oder
<? print shell_exec('whoami');?>
oder
<? print get_current_user();?>
Ich benutze normalerweise
<?php echo get_current_user(); ?>
Ich werde mich freuen, wenn es Ihnen geholfen hat
get_current_user() - Gets the name of the owner of the current PHP script- nicht der Benutzer, der den PHP-Prozess ausführt.
Ein bisschen spät, aber obwohl das Folgende eine Problemumgehung ist, löst es die Anforderung, da dies gut funktioniert:
<?
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
?>
Die obige Code-Hervorhebung ist nicht korrekt. Kopieren Sie sie in Ihren bevorzugten Editor und zeigen Sie sie als PHP-Code an oder speichern und testen Sie sie selbst.
Wie du wahrscheinlich weißt, get_current_user() der Eigentümer des "aktuell ausgeführten Skripts" zurückgegeben. Wenn Sie also dem Webserver-Benutzer kein Skript auf dem Server "chown" haben, ist es höchstwahrscheinlich "niemand", oder wenn der Entwickler- Benutzer existiert auf demselben Betriebssystem, es wird eher dieser Benutzername angezeigt.
Um dies zu umgehen, erstellen wir eine Datei mit dem aktuell ausgeführten Prozess. Wenn Sie dies nur require()in das aktuell ausgeführte Skript eingeben, wird dasselbe wie das übergeordnete Skript wie erwähnt zurückgegeben. Daher müssen wir es als separate Anforderung ausführen, um wirksam zu werden.
Um dies effektiv zu gestalten, sollten Sie ein Entwurfsmuster ausführen, das den "Laufzeitmodus" enthält. Wenn sich der Server also im "Entwicklungsmodus oder Testmodus" befindet, kann nur er diese Funktion ausführen und seine Ausgabe irgendwo in einem Include speichern , -oder einfach nur Text oder Datenbank oder was auch immer.
Natürlich können Sie einige Details des obigen Codes ändern, um ihn dynamischer zu gestalten, aber die Logik lautet wie folgt:
<?php phpinfo(); ?>
Speichern Sie als info.php und
öffne info.php in deinem Browser
Geben Sie dann Strg + F ein und geben Sie eine der folgenden Optionen ein:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
Sie können sehen, dass der Benutzer und der Gruppenapache als ausgeführt werden.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Authentifizierter Nutzer