Saya perlu mendeteksi apakah php berjalan sebagai bukan siapa-siapa. Bagaimana saya melakukan ini?
Apakah ada nama lain untuk "tidak ada"? "apache"? Ada yang lain?
Saya perlu mendeteksi apakah php berjalan sebagai bukan siapa-siapa. Bagaimana saya melakukan ini?
Apakah ada nama lain untuk "tidak ada"? "apache"? Ada yang lain?
Jawaban:
Jika tersedia, Anda dapat menyelidiki akun pengguna saat ini dengan posix_geteuid
dan kemudian mendapatkan nama pengguna dengan posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Namun jika Anda menjalankan mode aman (yang sering terjadi ketika exec dinonaktifkan), maka tidak mungkin proses PHP Anda berjalan di bawah apa pun kecuali default www-data
atau apache
akun.
get_current_user()
halaman manual yang menunjukkan pendekatan ini. Mulai dari PHP 5.4, dapat disingkat menjadi ini:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
Jenis cara mundur, tetapi tanpa exec / system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Jika Anda membuat file, pemiliknya adalah pengguna PHP.
Ini juga mungkin dapat dijalankan dengan salah satu fungsi file sementara seperti tempnam()
, yang membuat file acak di direktori sementara dan mengembalikan nama file itu. Jika ada masalah karena sesuatu seperti izin, open_basedir
atau mode aman yang mencegah penulisan file, biasanya, direktori temp akan tetap diizinkan.
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
akan membuat file sementara di direktori temp di sebagian besar sistem apa pun. Anda kemudian dapat menggunakan file itu untuk mendapatkan pengguna / grup. Saya menyerahkan sebagian kepada pengguna untuk mencari tahu.
Rincian lebih lanjut akan berguna, tetapi dengan asumsi itu adalah sistem linux, dan dengan asumsi php berjalan di bawah apache, itu akan berjalan seperti apa pun yang dijalankan oleh apache pengguna.
Cara mudah untuk memeriksa (sekali lagi, dengan asumsi beberapa lingkungan seperti unix) adalah dengan membuat file php dengan:
<?php
print shell_exec( 'whoami' );
?>
yang akan memberi Anda pengguna.
Untuk instance AWS saya, saya mendapatkan apache
sebagai output saat menjalankan skrip ini.
Anda dapat mencoba menggunakan backticks seperti ini:
echo `whoami`;
saya akan menggunakan:
lsof -i
lsof -i | less
lsof -i | grep :http
semua ini. Anda dapat mengetikkan em di baris perintah ssh Anda dan Anda akan melihat pengguna apa yang mendengarkan layanan apa.
Anda juga dapat pergi dan memeriksa file ini:
more /etc/apache2/envvars
dan cari baris ini:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
untuk memfilter data file envars, Anda dapat menggunakan grep:
more /etc/apache2/envvars |grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvars
bekerja dengan baik, terima kasih.
exec('whoami')
akan melakukan ini
<?php
echo exec('whoami');
?>
Langsung dari cangkang Anda dapat menjalankan:
php -r "echo exec('whoami');"
tambahkan file info.php ke direktori berikut - direktori http / apache default Anda - biasanya / var / www / html
dengan isi sebagai berikut
<?php
phpinfo();
?>
Kemudian httpd / apache restart pergi ke direktori html default Anda http://enter.server.here/info.php
akan memberikan seluruh silsilah php!
Dalam pengaturan saya, saya ingin memeriksa apakah proses saat ini memiliki izin untuk membuat folder, subfolder dan file sebelum saya memulai proses dan menyarankan solusi jika sepertinya saya tidak bisa. Saya ingin menjalankan stat(<file>)
berbagai hal untuk memastikan izin sesuai dengan proses yang sedang berjalan (saya menggunakan php-fpm sehingga bervariasi tergantung pada kolam).
Solusi berbasis posix yang diberikan Mario di atas, tampaknya sempurna, namun tampaknya ekstensi posix dinonaktifkan sehingga saya tidak dapat melakukan hal di atas dan karena saya ingin membandingkan hasilnya dengan respons dari menjalankan stat () yang berjalan whoami
di shell terpisah juga tidak membantu (saya perlu uid dan gid bukan nama pengguna).
Namun saya menemukan petunjuk yang berguna, saya bisa stat(/proc/self)
dan stat(/proc/self/attr)
dan melihat uid dan gid dari file tersebut.
Harapan yang membantu orang lain
Anda dapat menggunakan perintah ini:
<? system('whoami');?>
atau
<? passthru('whoami');?>
atau
<? print exec('whoami');?>
atau
<? print shell_exec('whoami');?>
atau
<? print get_current_user();?>
Saya biasanya menggunakan
<?php echo get_current_user(); ?>
Saya akan senang jika itu membantu Anda
get_current_user() - Gets the name of the owner of the current PHP script
- bukan pengguna yang menjalankan proses PHP.
Sedikit terlambat, tetapi meskipun berikut ini adalah solusi, itu menyelesaikan persyaratan karena ini berfungsi dengan baik:
<?
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
?>
Penyorotan kode di atas tidak akurat, silakan salin & tempel di editor favorit Anda dan lihat sebagai kode PHP, atau simpan dan uji sendiri.
Seperti yang mungkin Anda ketahui, get_current_user()
mengembalikan pemilik "skrip yang sedang berjalan" - jadi jika Anda tidak "menyisipkan" skrip di server ke pengguna-server-web, kemungkinan besar skrip itu "bukan siapa-siapa", atau jika pengembang- pengguna ada di OS yang sama, itu akan menampilkan nama pengguna itu.
Untuk mengatasi ini, kami membuat file dengan proses yang sedang berjalan. Jika Anda hanya require()
memasukkan ini ke dalam skrip yang sedang berjalan, ini akan mengembalikan sama seperti skrip induk seperti yang disebutkan; jadi, kita perlu menjalankannya sebagai permintaan terpisah agar berlaku.
Untuk membuatnya efektif, pertimbangkan untuk menjalankan pola desain yang menggabungkan "mode-runtime", jadi ketika server dalam "mode-pengembangan atau mode-uji" maka hanya server yang dapat menjalankan fungsi ini dan menyimpan keluarannya di suatu tempat dalam penyertaan , -atau hanya teks biasa atau database, atau yang mana saja.
Tentu saja Anda dapat mengubah beberapa keterangan kode di atas sesuai keinginan Anda untuk membuatnya lebih dinamis, tetapi logikanya adalah sebagai berikut:
<?php phpinfo(); ?>
simpan sebagai info.php dan
buka info.php di browser Anda
ctrl + f lalu ketik salah satu dari ini:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
Anda dapat melihat pengguna dan apache grup berjalan sebagai.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Pengguna terotentikasi