Ich muss feststellen, ob PHP als niemand läuft. Wie mache ich das?
Gibt es noch andere Namen für "niemand"? "Apache"? Irgendwelche anderen?
Falls vorhanden, können Sie das aktuelle Benutzerkonto mit posix_geteuid
prüfen und dann den Benutzernamen mit posix_getpwuid
abrufen.
$username = posix_getpwuid(posix_geteuid())['name'];
Wenn Sie jedoch im abgesicherten Modus laufen (was häufig der Fall ist, wenn exec deaktiviert ist), ist es unwahrscheinlich, dass Ihr PHP Prozess unter einem anderen als dem Standardkonto www-data
oder Apache
ausgeführt wird.
<?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 Besitzer der Benutzer PHP.
Dies könnte 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 Probleme aufgrund von Berechtigungen wie open_basedir
oder dem abgesicherten Modus auftreten, die das Schreiben einer Datei verhindern, ist das temporäre Verzeichnis normalerweise weiterhin zulässig.
Weitere Details wären nützlich, aber unter der Voraussetzung, dass es sich um ein Linux-System handelt, und unter der Voraussetzung, dass PHP unter Apache läuft, wird es so laufen, wie der Benutzer, auf dem Apache läuft.
Eine einfache Möglichkeit zur Überprüfung (wiederum unter der Annahme einer Unix-ähnlichen Umgebung) ist das Erstellen einer PHP-Datei mit:
<?php
print Shell_exec( 'whoami' );
?>
das gibt Ihnen den Benutzer.
Für meine AWS-Instanz erhalte ich Apache
als Ausgabe, wenn ich dieses Skript ausführte.
Sie können versuchen, Backticks wie folgt zu verwenden:
echo `whoami`;
ich würde ... benutzen:
lsof -i
lsof -i | less
lsof -i | grep :http
irgendetwas 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 suche nach diesen Zeilen:
export Apache_RUN_USER=user-name
export Apache_RUN_GROUP=group-name
um Envvars-Datei-Daten herauszufiltern, können Sie grep verwenden
more /etc/Apache2/envvars |grep Apache_RUN_
exec('whoami')
wird dies tun
<?php
exec('whoami');
?>
fügen Sie die Datei info.php dem folgenden Verzeichnis hinzu - Ihrem Standardverzeichnis für http/Apache - normalerweise/var/www/html
mit folgenden Inhalten
<?php
phpinfo();
?>
Dann httpd/Apache neu starten Gehen Sie zu Ihrem Standard-HTML-Verzeichnis http://enter.server.here/info.php .
würde den ganzen PHP-Stammbaum liefern!
Ich möchte in meinem Setup überprüfen, ob der aktuelle Prozess die Berechtigung hat, Ordner, Unterordner und Dateien zu erstellen, bevor ich mit dem Prozess beginne und eine Lösung vorschlage, falls dies nicht der Fall ist. Ich wollte stat(<file>)
auf verschiedenen Dingen ausführen, um sicherzustellen, dass die Berechtigungen mit denen des laufenden Prozesses übereinstimmen (ich verwende php-fpm, sodass es je nach Pool unterschiedlich ist).
Die posix-basierte Lösung, die Mario oben gegeben hat, scheint perfekt zu sein, jedoch scheint die posix-Erweiterung --disabled zu sein. Ich konnte das oben nicht tun und da ich die Ergebnisse mit der Antwort von stat () vergleichen möchte, läuft whoami
in einer separaten Shell ist auch nicht hilfreich (ich brauche die uid und gid nicht den Benutzernamen).
Ich fand jedoch einen nützlichen Hinweis, ich könnte stat(/proc/self)
und stat(/proc/self/attr)
sehen und die UID und GID der Datei sehen.
Hoffe das hilft jemand anderem
Direkt von der Shell aus können Sie Folgendes ausführen:
php -r "echo exec('whoami');"
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();?>
Ein bisschen spät, aber obwohl Folgendes 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 Code-Hervorhebung oben ist nicht korrekt. Bitte kopieren Sie sie in Ihren bevorzugten Editor und zeigen Sie sie als PHP Code an, oder speichern und testen Sie sie selbst.
Wie Sie wahrscheinlich wissen, gibt get_current_user()
den Besitzer des "aktuell ausgeführten Skripts" zurück. Wenn Sie also kein Skript auf dem Server an den Webserver-Benutzer "übergeben" haben, wird es höchstwahrscheinlich "niemand" sein oder der Entwickler -user existiert auf demselben Betriebssystem, es wird vielmehr dieser Benutzername angezeigt.
Um dies zu umgehen, erstellen wir eine Datei mit dem aktuell ausgeführten Prozess. Wenn Sie dies nur in das aktuell laufende Skript require()
eingeben, wird dasselbe wie das übergeordnete Skript zurückgegeben. Daher müssen wir es als separate Anforderung ausführen, um wirksam zu werden .
Um dies wirksam zu machen, sollten Sie ein Entwurfsmuster ausführen, das den "Laufzeitmodus" enthält. Wenn sich der Server im "Entwicklungsmodus" oder "Testmodus" befindet, kann er diese Funktion nur ausführen und seine Ausgabe irgendwo in einem Include speichern , -oder nur Text oder Datenbank oder was auch immer.
Natürlich können Sie einige Details des obigen Codes ändern, wenn Sie es dynamischer gestalten möchten. Die Logik sieht jedoch so aus:
$_SERVER["USER"]
$_SERVER["USERNAME"]
Ich benutze normalerweise
<?php echo get_current_user(); ?>
Ich würde mich freuen, wenn es Ihnen geholfen hat
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/de/reserved.variables.server.php
Authentifizierter Nutzer
<?php phpinfo(); ?>
speichern als info.php und
Öffne die info.php in deinem Browser
strg + F tippen Sie dann eine der folgenden:
Apache_RUN_USER
Apache_RUN_GROUP
user/group
sie sehen den Benutzer und die Gruppe, in der Apache läuft.