wake-up-neo.net

Wie überprüfe ich, unter welchem ​​Benutzer PHP läuft?

Ich muss feststellen, ob PHP als niemand läuft. Wie mache ich das? 

Gibt es noch andere Namen für "niemand"? "Apache"? Irgendwelche anderen?

83
Wesley

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.

57
mario

<?php echo exec('whoami'); ?>

180
AlienWebguy

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.

62
Jonathan Kuhn

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.

20
Seth

Sie können versuchen, Backticks wie folgt zu verwenden:

echo `whoami`;
13
ricbra

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_
8
Lukas

exec('whoami') wird dies tun

<?php
exec('whoami');
?>
6
genesis

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!

2
CRTLBREAK

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

1
sibaz

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();?>
1
Freeman

Vorschlag

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
?>


Beschreibung

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 .

Prozessablauf

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:

  • definieren Sie eine eindeutige Referenz, um die Interferenz mit anderen Benutzern zu begrenzen
  • definieren Sie einen lokalen Dateipfad zum Schreiben einer temporären Datei
  • definieren Sie einen öffentlichen URL/Pfad, um diese Datei in einem eigenen Prozess auszuführen
  • schreiben Sie die temporäre PHP-Datei, die den Namen des Skriptbesitzers ausgibt
  • holen Sie sich die Ausgabe dieses Skripts, indem Sie eine Anforderung an dieses Skript senden
  • löschen Sie die Datei, da sie nicht mehr benötigt wird - oder lassen Sie sie, wenn Sie möchten
  • gibt die Ausgabe der Anforderung als Rückgabewert der Funktion zurück
0
argon
$_SERVER["USER"]

$_SERVER["USERNAME"] 
0
Step

Ich benutze normalerweise

<?php echo get_current_user(); ?>

Ich würde mich freuen, wenn es Ihnen geholfen hat

0
yiimar
$user = $_SERVER['REMOTE_USER'];

http://php.net/manual/de/reserved.variables.server.php

Authentifizierter Nutzer

0
Tybion
<?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.