Muszę wykryć, czy php działa jak nikt. Jak mam to zrobic?
Czy są jakieś inne nazwy na „nikt”? „apache”? Ktoś jeszcze?
Muszę wykryć, czy php działa jak nikt. Jak mam to zrobic?
Czy są jakieś inne nazwy na „nikt”? „apache”? Ktoś jeszcze?
Odpowiedzi:
Jeśli jest dostępny, możesz sprawdzić bieżące konto użytkownika za pomocą, posix_geteuid
a 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-data
lub apache
kontem.
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'];
<?php echo exec('whoami'); ?>
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_basedir
lub tryb awaryjny, które uniemożliwiają zapisanie pliku, zazwyczaj katalog tymczasowy nadal będzie dozwolony.
$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ł.
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ę apache
dane wyjściowe po uruchomieniu tego skryptu.
Możesz spróbować użyć grawisów w ten sposób:
echo `whoami`;
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_
grep "APACHE_RUN_" /etc/apache2/envvars
działało dobrze, dzięki.
exec('whoami')
zrobi to
<?php
echo exec('whoami');
?>
Prosto z muszli można uruchomić:
php -r "echo exec('whoami');"
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!
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 whoami
w 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
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();?>
Zwykle używam
<?php echo get_current_user(); ?>
Byłbym zadowolony, gdyby ci to pomogło
get_current_user() - Gets the name of the owner of the current PHP script
- nie użytkownik uruchamiający proces PHP.
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
?>
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.
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:
<?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.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Uwierzytelniony użytkownik