Jak sprawdzić, jako użytkownik php działa?

115

Muszę wykryć, czy php działa jak nikt. Jak mam to zrobic?

Czy są jakieś inne nazwy na „nikt”? „apache”? Ktoś jeszcze?

Wesley
źródło
Co dokładnie masz na myśli, pytając „czy są jakieś inne nazwiska”? Administratorzy systemów mogą tworzyć użytkowników o dowolnej nazwie.
Álvaro González
Wszelkie inne domyślne nazwy czegokolwiek, co można by uznać za serwer; apache, nobody, www-data, etc ..
Wesley,
1
Jeśli dobrze pamiętam, użytkownicy systemu zwykle mają mały UID (poniżej 1024?). To może być lepsza wskazówka co do tego, co próbujesz osiągnąć.
Álvaro González
9
get_current_user () zwraca właściciela bieżącego skryptu, a nie użytkownika, który aktualnie działa.
Dima L.,

Odpowiedzi:

85

Jeśli jest dostępny, możesz sprawdzić bieżące konto użytkownika za pomocą, posix_geteuida następnie uzyskać nazwę użytkownika za pomocą posix_getpwuid.

$username = posix_getpwuid(posix_geteuid())['name'];

Jeśli jednak pracujesz w trybie awaryjnym (co często ma miejsce, gdy exec jest wyłączony), jest mało prawdopodobne, że Twój proces PHP działa na jakimkolwiek koncie poza domyślnym www-datalub apachekontem.

mario
źródło
10
Na stronie get_current_user()podręcznika jest komentarz, który pokazuje takie podejście. Od PHP 5.4 można to skrócić do tego:print posix_getpwuid(posix_geteuid())['name'];
Palec
209

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

AlienWebguy
źródło
1
Naprawdę nie można użyć funkcji exec, system ani żadnej z takich funkcji tranzytowych.
Wesley,
To było to, czego potrzebowałem. get_current_user () zdecydowanie nie był tym, czego potrzebowałem.
dgig
5
Może być przydatne dla niektórych użytkowników: jeśli uruchomisz to z interfejsu wiersza poleceń, otrzymasz użytkownika, który uruchamia polecenie, a nie użytkownika PHP.
Bram Vanroy,
@BramVanroy to gdzie powinieneś go uruchomić? = |
Andrew
@BramVanroy - Chcę zrozumieć twój komentarz, ale nie rozumiem. jeśli uruchomisz to z CLI, czy nie jesteś właścicielem obecnego procesu php? Kim byłby w tym przypadku użytkownik PHP oprócz Ciebie?
billynoah
72

Coś w stylu wstecznym, ale bez exec / system:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

Jeśli utworzysz plik, właścicielem będzie użytkownik PHP.

Prawdopodobnie można to również uruchomić z dowolną funkcją pliku tymczasowego, taką jak tempnam(), która tworzy losowy plik w katalogu tymczasowym i zwraca nazwę tego pliku. Jeśli występują problemy wynikające z czegoś takiego jak uprawnienia open_basedirlub tryb awaryjny, które uniemożliwiają zapisanie pliku, zazwyczaj katalog tymczasowy nadal będzie dozwolony.

Jonathan Kuhn
źródło
2
Bardzo sprytne rozwiązanie wieloplatformowe. Boh!
Matt Fletcher
3
Fajnie: jedyne nieuprzywilejowane rozwiązanie, które pozwala również znaleźć grupę, w której działa PHP.
tanius
2
godny hack, zasługuje na wyższe miejsce
Abraham Philip
1
@RavinderPayal Chyba że używasz funkcji tempnam, tak jak zasugerowałem. Jest prawie pewne, że użytkownik może pisać do katalogu tymczasowego niezależnie od tego, kim jest. Bez możliwości zapisu w katalogu tymczasowym, można tymczasowo nadać folderowi 777 uprawnienia i wyłączyć selinux dla tej ścieżki, jeśli jest włączony.
Jonathan Kuhn
1
@RavinderPayal są dodatkowe funkcje zwracające ścieżkę tymczasową. Utworzyłby więc $temp_file = tempnam(sys_get_temp_dir(), 'TMP');plik tymczasowy w katalogu tymczasowym w większości systemów. Możesz następnie użyć tego pliku, aby pobrać użytkownika / grupę. Zostawiłem część tego użytkownikowi, aby się domyślił.
Jonathan Kuhn
20

Przydałoby się więcej szczegółów, ale zakładając, że jest to system linuxowy i zakładając, że php działa pod Apache, będzie działał tak, jak działa apache użytkownika.

Łatwym sposobem sprawdzenia (ponownie, zakładając pewne środowisko podobne do unixa) jest utworzenie pliku php z:

<?php
    print shell_exec( 'whoami' );
?>

co da ci użytkownika.

W przypadku mojej instancji AWS otrzymuję apachedane wyjściowe po uruchomieniu tego skryptu.

Seth
źródło
16

Możesz spróbować użyć grawisów w ten sposób:

echo `whoami`;
Ricbra
źródło
7
To tylko duplikat powyższych pytań.
volter9
2
Może być przydatne dla niektórych użytkowników: jeśli uruchomisz to z interfejsu wiersza poleceń, otrzymasz użytkownika, który uruchamia polecenie, a nie użytkownika PHP.
Bram Vanroy,
13

użyłbym:

lsof -i
lsof -i | less
lsof -i | grep :http

którykolwiek z nich. Możesz wpisać em w linii poleceń ssh, a zobaczysz, który użytkownik nasłuchuje jakiej usługi.

możesz też przejść i sprawdzić ten plik:

more /etc/apache2/envvars

i poszukaj tych wierszy:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

aby odfiltrować dane pliku envvars, możesz użyć grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_
Lukas Liesis
źródło
1
grep "APACHE_RUN_" /etc/apache2/envvarsdziałało dobrze, dzięki.
Tarik
11

exec('whoami') zrobi to

<?php
echo exec('whoami');
?>
geneza
źródło
Naprawdę nie można użyć funkcji exec, system ani żadnej z takich funkcji tranzytowych.
Wesley,
@Wesley: więc to niemożliwe.
genesis
2
Może być przydatne dla niektórych użytkowników: jeśli uruchomisz to z interfejsu wiersza poleceń, otrzymasz użytkownika, który uruchamia polecenie, a nie użytkownika PHP.
Bram Vanroy,
5

Prosto z muszli można uruchomić:

php -r "echo exec('whoami');"
Gabriel Vilches Alves
źródło
1

dodaj plik info.php do następującego katalogu - domyślny katalog http / apache - normalnie / var / www / html

z następującą treścią

<?php                                                                           
phpinfo();                                                                    
?>  

Następnie httpd / apache uruchom ponownie, przejdź do domyślnego katalogu html http://enter.server.here/info.php

dostarczy cały rodowód php!

CRTLBREAK
źródło
3
i jakiej zmiennej / wartości w tym wyjściu szukamy?
Andrew
Jestem pewien, że już to znalazłeś, ale szukasz „użytkownik” na tej stronie?
CRTLBREAK
0

W mojej konfiguracji chcę sprawdzić, czy bieżący proces ma uprawnienia do tworzenia folderów, podfolderów i plików przed rozpoczęciem procesu i zasugerować rozwiązanie, jeśli wygląda na to, że nie mogę. Chciałem uruchamiać stat(<file>)różne rzeczy, aby upewnić się, że uprawnienia pasują do uruchomionego procesu (używam php-fpm, więc różni się w zależności od puli).
Rozwiązanie oparte na posix, które Mario podał powyżej, wydaje się idealne, jednak wydaje się, że rozszerzenie posix jest - wyłączone, więc nie mogłem zrobić tego powyżej i ponieważ chcę porównać wyniki z odpowiedzią po uruchomieniu stat () działającym whoamiw oddzielnej powłoce też nie jest pomocna (potrzebuję uid i gid, a nie nazwy użytkownika).

Jednak uważam użyteczną wskazówkę, mogłem stat(/proc/self)i stat(/proc/self/attr)i zobaczyć UID i GID pliku.

Mam nadzieję, że to pomoże komuś innemu

sibaz
źródło
0

Możesz użyć tych poleceń:

<? system('whoami');?>

lub

<? passthru('whoami');?>

lub

<? print exec('whoami');?>

lub

<? print shell_exec('whoami');?>

lub

<? print get_current_user();?>
Obywatel
źródło
get_current_user () nie zwraca bieżącego użytkownika. Zwraca właściciela skryptu, w którym wywoływana jest funkcja.
andsens
-1

Zwykle używam

<?php echo get_current_user(); ?>

Byłbym zadowolony, gdyby ci to pomogło

yiimar
źródło
Zostało to już wspomniane w komentarzach pod pytaniem i ma to bardzo niewiele wspólnego z użytkownikiem, na którym działa skrypt.
Palec
get_current_user() - Gets the name of the owner of the current PHP script - nie użytkownik uruchamiający proces PHP.
Francisco Zarabozo
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
Krok
źródło
echo $_SERVER["USER"];działa, ale podaje nazwę aktualnie zalogowanego użytkownika w SSH.
Tarik
-1

Wniosek

Trochę późno, ale chociaż poniższe rozwiązanie jest obejściem, to rozwiązuje to wymaganie, ponieważ działa dobrze:

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


Opis

Podświetlanie kodu powyżej nie jest dokładne, skopiuj i wklej w swoim ulubionym edytorze i wyświetl jako kod PHP lub zapisz i przetestuj samodzielnie.

Jak zapewne wiesz, get_current_user()zwraca właściciela „aktualnie uruchomionego skryptu” - więc jeśli nie „wyrzuciłeś” skryptu na serwerze do użytkownika serwera WWW, najprawdopodobniej będzie to „nikt” lub jeśli programista- użytkownik istnieje w tym samym systemie operacyjnym, będzie raczej wyświetlać tę nazwę użytkownika.

Aby obejść ten problem, tworzymy plik z aktualnie uruchomionym procesem. Jeśli dodasz require()to tylko do aktualnie działającego skryptu, zwróci to samo, co wspomniany skrypt nadrzędny; więc musimy uruchomić to jako oddzielne żądanie, aby odniosło skutek.

Przebieg procesu

Aby uczynić to skutecznym, rozważ uruchomienie wzorca projektowego, który zawiera "tryb wykonawczy", więc gdy serwer jest w "trybie programistycznym lub testowym", tylko on może uruchomić tę funkcję i zapisać jej dane wyjściowe gdzieś w dołączonej , -lub po prostu zwykły tekst lub baza danych lub cokolwiek.

Oczywiście możesz zmienić niektóre szczegóły powyższego kodu, aby uczynić go bardziej dynamicznym, ale logika jest następująca:

  • zdefiniować unikalne odniesienie, aby ograniczyć interferencję z innymi użytkownikami
  • zdefiniuj lokalną ścieżkę do pliku do zapisu pliku tymczasowego
  • zdefiniuj publiczny adres URL / ścieżkę do uruchamiania tego pliku we własnym procesie
  • napisz tymczasowy plik php, który wypisuje nazwę właściciela skryptu
  • uzyskać wynik tego skryptu, wysyłając do niego żądanie
  • usuń plik, ponieważ nie jest już potrzebny - lub zostaw go, jeśli chcesz
  • zwraca wynik żądania jako wartość zwracaną przez funkcję

źródło
-1
<?php phpinfo(); ?>

zapisz jako info.php i

otwórz info.php w swojej przeglądarce

ctrl + f, a następnie wpisz dowolne z poniższych:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

możesz zobaczyć użytkownika i grupę Apache działa jako.

Jerome Jr. Formentera
źródło