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?
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?
Yanıtlar:
Varsa, ile mevcut kullanıcı hesabını inceleyebilir posix_geteuid
ve 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-data
veya apache
hesap dışında herhangi bir şey altında çalışması olası değildir .
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'];
<?php echo exec('whoami'); ?>
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_basedir
veya güvenli mod gibi bir dosyanın yazılmasını engelleyen bir şeyden kaynaklanan sorunlar varsa , genellikle geçici dizine yine de izin verilir.
$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.
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, apache
bu komut dosyasını çalıştırdığımda çıktı olarak alıyorum .
Bunun gibi ters işaretler kullanmayı deneyebilirsiniz:
echo `whoami`;
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_
grep "APACHE_RUN_" /etc/apache2/envvars
iyi çalıştı, teşekkürler.
exec('whoami')
bunu yapacak
<?php
echo exec('whoami');
?>
Doğrudan kabuktan çalıştırabilirsiniz:
php -r "echo exec('whoami');"
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ı!
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ı whoami
ayrı 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
Şu komutları kullanabilirsiniz:
<? system('whoami');?>
veya
<? passthru('whoami');?>
veya
<? print exec('whoami');?>
veya
<? print shell_exec('whoami');?>
veya
<? print get_current_user();?>
Genellikle kullanırım
<?php echo get_current_user(); ?>
Sana yardım ederse sevinirim
get_current_user() - Gets the name of the owner of the current PHP script
- PHP sürecini çalıştıran kullanıcı değil .
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
?>
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.
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:
<?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.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Doğrulanmış kullanıcı