Bagaimana cara memeriksa php pengguna apa yang dijalankan?

115

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?

Wesley
sumber
Apa yang Anda maksud dengan pertanyaan "adakah nama lain"? Sysadmin dapat membuat pengguna dengan nama apapun yang mereka inginkan.
Álvaro González
Nama default lainnya untuk apa pun yang mungkin dianggap sebagai server; apache, tidak ada, www-data, dll ..
Wesley
1
Jika saya ingat dengan benar, pengguna sistem biasanya memiliki UID kecil (di bawah 1024?). Itu mungkin petunjuk yang lebih baik untuk apa pun yang ingin Anda capai.
Álvaro González
9
get_current_user () mengembalikan pemilik skrip saat ini, bukan pengguna php yang sedang berjalan.
Dima L.

Jawaban:

85

Jika tersedia, Anda dapat menyelidiki akun pengguna saat ini dengan posix_geteuiddan 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-dataatau apacheakun.

mario
sumber
10
Ada komentar di get_current_user()halaman manual yang menunjukkan pendekatan ini. Mulai dari PHP 5.4, dapat disingkat menjadi ini:print posix_getpwuid(posix_geteuid())['name'];
Palec
209

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

AlienWebguy
sumber
1
Tidak dapat benar-benar menggunakan exec atau sistem atau fungsi passthru semacam itu.
Wesley
Hanya yang saya butuhkan. get_current_user () bukanlah yang saya butuhkan.
dgig
5
Mungkin berguna untuk beberapa pengguna: jika Anda menjalankan ini dari antarmuka baris perintah, Anda akan mendapatkan pengguna yang menjalankan perintah, dan bukan pengguna PHP.
Bram Vanroy
@BramVanroy lalu di mana Anda harus menjalankannya? = |
Andrew
@BramVanroy - Saya ingin memahami komentar Anda, tetapi saya tidak. jika Anda menjalankannya dari cli, bukankah Anda yang memiliki proses php saat ini? Dalam kasus ini, siapa pengguna PHP selain Anda?
billynoah
72

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_basediratau mode aman yang mencegah penulisan file, biasanya, direktori temp akan tetap diizinkan.

Jonathan Kuhn
sumber
2
Solusi lintas platform yang sangat cerdas. Boh!
Matt Fletcher
3
Nice: satu-satunya solusi non-hak istimewa di sini untuk juga menemukan grup yang menjalankan PHP.
tanius
2
peretasan yang layak, layak mendapatkan tempat yang lebih tinggi
Abraham Philip
1
@RavinderPayal Kecuali Anda menggunakan fungsi tempnam seperti yang saya sarankan. Hampir dijamin bahwa pengguna dapat menulis ke direktori sementara tanpa memandang siapa mereka. Tanpa bisa menulis ke direktori sementara, Anda bisa sementara memberikan izin folder 777 dan jika diaktifkan, nonaktifkan selinux untuk jalur itu.
Jonathan Kuhn
1
@RavinderPayal ada fungsi tambahan untuk mengembalikan jalur temp. Jadi $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.
Jonathan Kuhn
20

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 apachesebagai output saat menjalankan skrip ini.

Seth
sumber
16

Anda dapat mencoba menggunakan backticks seperti ini:

echo `whoami`;
ricbra
sumber
7
Itu hanya duplikat dari pertanyaan di atas.
volter9
2
Mungkin berguna untuk beberapa pengguna: jika Anda menjalankan ini dari antarmuka baris perintah, Anda akan mendapatkan pengguna yang menjalankan perintah, dan bukan pengguna PHP.
Bram Vanroy
12

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_
Lukas Liesis
sumber
1
grep "APACHE_RUN_" /etc/apache2/envvarsbekerja dengan baik, terima kasih.
Tarik
11

exec('whoami') akan melakukan ini

<?php
echo exec('whoami');
?>
asal
sumber
Tidak dapat benar-benar menggunakan exec atau sistem atau fungsi passthru semacam itu.
Wesley
@Wesley: jadi itu tidak mungkin.
kejadian
2
Mungkin berguna untuk beberapa pengguna: jika Anda menjalankan ini dari antarmuka baris perintah, Anda akan mendapatkan pengguna yang menjalankan perintah, dan bukan pengguna PHP.
Bram Vanroy
5

Langsung dari cangkang Anda dapat menjalankan:

php -r "echo exec('whoami');"
Gabriel Vilches Alves
sumber
1

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!

CRTLBREAK
sumber
3
dan variabel / nilai manakah dalam keluaran tersebut yang kita cari?
Andrew
Saya yakin Anda sudah menemukan ini tetapi cari "pengguna" di halaman itu?
CRTLBREAK
0

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

sibaz
sumber
0

Anda dapat menggunakan perintah ini:

<? system('whoami');?>

atau

<? passthru('whoami');?>

atau

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

atau

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

atau

<? print get_current_user();?>
Warga kehormatan
sumber
get_current_user () tidak mengembalikan pengguna saat ini. Ini mengembalikan pemilik skrip tempat fungsi tersebut dipanggil.
dansens
-1

Saya biasanya menggunakan

<?php echo get_current_user(); ?>

Saya akan senang jika itu membantu Anda

yiimar
sumber
Ini telah disebutkan dalam komentar di bawah pertanyaan dan itu tidak ada hubungannya dengan pengguna yang menjalankan skrip di bawahnya.
Palec
get_current_user() - Gets the name of the owner of the current PHP script- bukan pengguna yang menjalankan proses PHP.
Francisco Zarabozo
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
Langkah
sumber
echo $_SERVER["USER"];berfungsi tetapi memberikan nama pengguna yang masuk saat ini di SSH.
Tarik
-1

Usul

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


Deskripsi

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.

Alur proses

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:

  • tentukan referensi unik untuk membatasi gangguan dengan pengguna lain
  • menentukan jalur file lokal untuk menulis file sementara
  • tentukan url / jalur publik untuk menjalankan file ini dalam prosesnya sendiri
  • tulis file php sementara yang menampilkan nama pemilik skrip
  • dapatkan hasil dari skrip ini dengan membuat permintaan padanya
  • hapus file karena tidak lagi diperlukan - atau tinggalkan jika Anda mau
  • mengembalikan output dari permintaan sebagai nilai-kembali dari fungsi

sumber
-1
<?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.

Jerome Jr. Formentera
sumber