Hangi kullanıcı php'sinin çalıştığı nasıl kontrol edilir?


115

Php'nin hiç kimse olarak çalışıp çalışmadığını tespit etmem gerekiyor. Bunu nasıl yaparım?

"Hiçkimse" nin başka isimleri var mı? "Apache"? Herhangi diğerleri?


"Başka isim var mı" sorusuyla tam olarak ne demek istiyorsun? Sistem yöneticileri, istedikleri adla kullanıcılar oluşturabilir.
Álvaro González

Sunucu olarak kabul edilebilecek herhangi bir diğer varsayılan ad; apache, nobody, www-data, etc ..
Wesley

1
Doğru hatırlarsam, sistem kullanıcılarının normalde küçük bir UID'si olur (1024'ün altında?). Bu, başarmaya çalıştığınız şey için daha iyi bir ipucu olabilir.
Álvaro González


9
get_current_user (), php'nin şu anda çalışmakta olduğu kullanıcı değil, geçerli betiğin sahibini döndürür.
Dima L.

Yanıtlar:


85

Varsa, ile mevcut kullanıcı hesabını inceleyebilir posix_geteuidve ardından kullanıcı adını alabilirsiniz posix_getpwuid.

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

Bununla birlikte, güvenli modda çalışıyorsanız (bu, genellikle exec devre dışı bırakıldığında durumdur), PHP işleminizin varsayılan www-dataveya apachehesap dışında herhangi bir şey altında çalışması olası değildir .


10
Orada bir yorum get_current_user()manpage olduğunu gösterir bu yaklaşım. PHP 5.4'ten itibaren şu şekilde kısaltılabilir:print posix_getpwuid(posix_geteuid())['name'];
Palec

209

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


1
Yürütme veya sistem veya bu tür geçiş işlevlerini gerçekten kullanamazsınız.
Wesley

Tam ihtiyacım olan şeydi. get_current_user () kesinlikle ihtiyacım olan şey değildi.
dgig

5
Bazı kullanıcılar için faydalı olabilir: bunu komut satırı arayüzünden çalıştırırsanız , PHP kullanıcısını değil , komutu çalıştıran kullanıcıyı alırsınız .
Bram Vanroy

@BramVanroy o zaman nerede çalıştırmalısınız? = |
Andrew

@BramVanroy - Yorumunuzu anlamak istiyorum ama anlamıyorum. bunu cli'dan çalıştırırsanız, mevcut php sürecinin sahibi siz değil misiniz? Bu durumda PHP kullanıcısı sizden başka kim olurdu?
billynoah

72

Geriye doğru bir yol, ancak exec / system olmadan:

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

Bir dosya oluşturursanız, sahibi PHP kullanıcısı olacaktır.

Bu tempnam(), geçici dizinde rastgele bir dosya oluşturan ve bu dosyanın adını döndüren gibi geçici dosya işlevlerinden herhangi biriyle de çalıştırılabilir . İzinler open_basedirveya güvenli mod gibi bir dosyanın yazılmasını engelleyen bir şeyden kaynaklanan sorunlar varsa , genellikle geçici dizine yine de izin verilir.


2
Çok akıllı çapraz platform çözümü. Boh!
Matt Fletcher

3
Güzel: PHP'nin çalıştığı grubu bulmak için burada ayrıcalıklı olmayan tek çözüm .
tanius

2
değerli bir hack, daha yüksek bir yeri hak ediyor
Abraham Philip

1
@RavinderPayal Önerdiğim gibi tempnam işlevini kullanmadığınız sürece. Kullanıcının kim olursa olsun geçici dizine yazabileceği neredeyse garantilidir. Geçici dizine yazamadan, geçici olarak bir klasöre 777 izinleri verebilir ve etkinleştirilirse, bu yol için selinux'u devre dışı bırakabilirsiniz.
Jonathan Kuhn

1
@RavinderPayal, geçici yolu döndürmek için ek işlevler vardır. Bu nedenle $temp_file = tempnam(sys_get_temp_dir(), 'TMP');, herhangi bir sistemde geçici dizinde geçici bir dosya oluşturur. Daha sonra kullanıcı / grubu almak için bu dosyayı kullanabilirsiniz. Bunun bir kısmını çözmesi için kullanıcıya bıraktım.
Jonathan Kuhn

20

Daha fazla ayrıntı yararlı olabilir, ancak bunun bir linux sistemi olduğunu varsayarsak ve php'nin apache altında çalıştığını varsayarsak, kullanıcı apache'nin çalıştırdığı gibi çalışacaktır.

Kontrol etmenin kolay bir yolu (yine, bazı unix benzeri ortamlar varsayarak) şunlarla bir php dosyası oluşturmaktır:

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

bu size kullanıcıyı verecektir.

AWS örneğim için, apachebu komut dosyasını çalıştırdığımda çıktı olarak alıyorum .


16

Bunun gibi ters işaretler kullanmayı deneyebilirsiniz:

echo `whoami`;

7
Sadece yukarıdaki soruların kopyası.
volter9

2
Bazı kullanıcılar için faydalı olabilir: bunu komut satırı arayüzünden çalıştırırsanız , PHP kullanıcısını değil , komutu çalıştıran kullanıcıyı alırsınız .
Bram Vanroy

13

Kullanmak istiyorum:

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

bunlardan herhangi biri. Ssh komut satırınıza em yazabilirsiniz ve hangi kullanıcının hangi hizmeti dinlediğini göreceksiniz.

Ayrıca bu dosyaya gidip kontrol edebilirsiniz:

more /etc/apache2/envvars

ve şu satırları arayın:

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

envvars dosya verilerini filtrelemek için grep kullanabilirsiniz:

 more  /etc/apache2/envvars |grep APACHE_RUN_

1
grep "APACHE_RUN_" /etc/apache2/envvarsiyi çalıştı, teşekkürler.
Tarık

11

exec('whoami') bunu yapacak

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

Yürütme veya sistem veya bu tür geçiş işlevlerini gerçekten kullanamazsınız.
Wesley

@Wesley: Bu mümkün değil.
genesis

2
Bazı kullanıcılar için faydalı olabilir: bunu komut satırı arayüzünden çalıştırırsanız , PHP kullanıcısını değil , komutu çalıştıran kullanıcıyı alırsınız .
Bram Vanroy


1

info.php dosyasını aşağıdaki dizine ekleyin - varsayılan http / apache dizininiz - normalde / var / www / html

aşağıdaki içeriklerle

<?php                                                                           
phpinfo();                                                                    
?>  

Ardından httpd / apache, varsayılan html dizininize gidin http://enter.server.here/info.php

tüm php soyağacını sunacaktı!


3
ve bu çıktıda hangi değişkeni / değeri arıyoruz?
Andrew

Bunu daha önce bulduğunuza eminim ama o sayfada "kullanıcı" mı arıyorsunuz?
CRTLBREAK

0

Kurulumumda, bir işleme başlamadan önce mevcut işlemin klasörler, alt klasörler ve dosyalar oluşturma iznine sahip olup olmadığını kontrol etmek ve yapamayacak gibi görünüyorsa bir çözüm önermek istiyorum. stat(<file>)İzinlerin çalışan işlemin izinleriyle eşleşmesini sağlamak için çeşitli şeyler üzerinde çalışmak istedim (php-fpm kullanıyorum, bu yüzden havuza bağlı olarak değişir).
Mario'nun yukarıda verdiği posix tabanlı çözüm mükemmel görünüyor, ancak posix uzantısı devre dışı görünüyor, bu yüzden yukarıdakileri yapamadım ve sonuçları whoamiayrı bir kabukta çalışan stat () çalıştırma yanıtıyla karşılaştırmak istiyorum. yardımcı olmuyor (uid'e ihtiyacım var ve kullanıcı adına değil).

Ancak bunu yapabilmeyi, yararlı bir ipucu buldum stat(/proc/self)ve stat(/proc/self/attr)ve uid görmek ve dosyanın gid.

Umarım başkasına yardım eder


0

Şu komutları kullanabilirsiniz:

<? system('whoami');?>

veya

<? passthru('whoami');?>

veya

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

veya

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

veya

<? print get_current_user();?>

get_current_user () yok değil geçerli kullanıcı döndürür. Fonksiyonun çağrıldığı komut dosyasının sahibini döndürür.
2019

-1

Genellikle kullanırım

<?php echo get_current_user(); ?>

Sana yardım ederse sevinirim


Bu, soru altındaki yorumlarda zaten belirtilmiştir ve betiğin altında çalıştığı kullanıcıyla çok az ilgisi vardır.
Palec

get_current_user() - Gets the name of the owner of the current PHP script- PHP sürecini çalıştıran kullanıcı değil .
Francisco Zarabozo

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];çalışır ancak SSH'de mevcut oturum açmış kullanıcı adını verir.
Tarik

-1

öneri

Biraz geç, ancak aşağıdaki çözüm bir çözüm olsa da, bu gayet iyi çalıştığı için gereksinimi çözüyor:

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


Açıklama

Yukarıdaki kod vurgulama doğru değil, lütfen favori düzenleyicinize kopyalayıp yapıştırın ve PHP kodu olarak görüntüleyin veya kaydedin ve kendiniz test edin.

Muhtemelen bildiğiniz gibi get_current_user() "geçerli çalışan komut dosyasının" sahibini döndürür - bu nedenle, sunucuda bir komut dosyasını web sunucusu kullanıcısına "chown" etmediyseniz, büyük olasılıkla "hiç kimse" olacaktır veya geliştirici- kullanıcı aynı işletim sisteminde mevcutsa, bu kullanıcı adını göstermeyi tercih eder.

Bunu aşmak için, mevcut çalışan işlemle bir dosya oluşturuyoruz. Bunu sadece require()mevcut çalışan betiğe girerseniz , yukarıda belirtildiği gibi ana-betik ile aynı şeyi döndürür; bu nedenle, yürürlüğe girmesi için ayrı bir istek olarak çalıştırmamız gerekiyor.

Süreç akışı

Bunu etkili kılmak için, "çalışma zamanı modu" içeren bir tasarım modeli çalıştırmayı düşünün, böylece sunucu "geliştirme modunda veya test modunda" olduğunda, bu işlevi yalnızca o işlevi çalıştırabilir ve çıktısını içerme içinde bir yere kaydedebilir. , -veya sadece düz metin veya veritabanı veya hangisi.

Elbette, daha dinamik hale getirmek için yukarıdaki kodun bazı özelliklerini değiştirebilirsiniz, ancak mantık aşağıdaki gibidir:

  • Diğer kullanıcılarla etkileşimi sınırlandırmak için benzersiz bir referans tanımlayın
  • geçici bir dosya yazmak için yerel bir dosya yolu tanımlayın
  • Bu dosyayı kendi sürecinde çalıştırmak için genel bir url / yol tanımlayın
  • komut dosyası sahibinin adını veren geçici php dosyasını yazın
  • bir istekte bulunarak bu betiğin çıktısını alın
  • artık gerekmediği için dosyayı silin veya isterseniz bırakın
  • işlevin dönüş değeri olarak isteğin çıktısını döndürür

-1
<?php phpinfo(); ?>

info.php olarak kaydedin ve

tarayıcınızda info.php'yi açın

ctrl + f sonra şunlardan birini yazın:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

kullanıcı ve apache grubunun çalıştığını görebilirsiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.