Як перевірити, як працює php користувача?


115

Мені потрібно виявити, чи php працює як ніхто. Як це зробити?

Чи є інші назви "ніхто"? "апаш"? Будь-які інші?


Що саме ви маєте на увазі під питанням "чи є інші імена"? Sysadmins може створювати користувачів із будь-яким ім'ям.
Альваро Гонсалес

Будь-які інші імена за замовчуванням для всього, що може вважатися сервером; apache, ніхто, www-data тощо.
Wesley

1
Якщо я правильно пам'ятаю, системні користувачі зазвичай мають невеликий UID (нижче 1024?). Це може бути кращою підказкою для того, що ви намагаєтеся досягти.
Альваро Гонсалес


9
get_current_user () повертає власника поточного сценарію, а не користувальницький php в даний час працює.
Діма Л.

Відповіді:


85

Якщо є, ви можете перевірити поточний обліковий запис користувача, posix_geteuidа потім отримати ім'я користувача posix_getpwuid.

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

Якщо ви працюєте в безпечному режимі (що часто трапляється, коли exec вимкнено), навряд чи ваш PHP-процес запускається ні за що, крім за замовчуванням www-dataабо apacheобліковим записом.


10
Існує коментар на get_current_user()сторінках керівництва , що показує цей підхід. Щодо PHP 5.4, це можна скоротити до цього:print posix_getpwuid(posix_geteuid())['name'];
Palec

209

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


1
Неможливо реально використовувати exec чи систему чи будь-які подібні функції passthru.
Веслі

Було саме те, що мені потрібно. get_current_user () - це не те, що мені точно потрібно.
дег

5
Можливо, корисним для деяких користувачів: якщо запустити це через інтерфейс командного рядка, ви отримаєте користувача, який виконує команду, а не користувача PHP.
Брем Ванрой

@BramVanroy тоді де його запустити? = |
Андрій

@BramVanroy - Я хочу зрозуміти ваш коментар, але я цього не роблю. якщо ви запускаєте це з кліпу, чи не вам належить поточний процес php? Хто б у цьому випадку був користувачем PHP, крім вас?
billynoah

72

Вид зворотного шляху, але без exec / system:

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

Якщо ви створите файл, власником буде користувач PHP.

Це також може бути запущено з будь-якою з тимчасових функцій файлу, таких як tempnam(), яка створює випадковий файл у тимчасовому каталозі та повертає ім'я цього файлу. Якщо виникають проблеми, пов’язані з дозволами open_basedirчи безпечним режимом, які заважають писати файл, як правило, тимчасовий каталог все одно буде дозволений.


2
Дуже розумне рішення для платформ. Бох!
Метт Флетчер

3
Ніцца: єдине непривілейоване рішення тут також знайти групу , в якій працює PHP.
таніус

2
гідний хак, заслуговує вищого місця
Авраам Філіп

1
@RavinderPayal Якщо ви не використовуєте функцію tempnam, як я запропонував. Майже гарантується, що користувач може записувати у тимчасовий каталог незалежно від того, хто вони є. Не маючи змоги писати у тимчасовий каталог, ви можете тимчасово надати папці 777 дозволів і, якщо це включено, вимкнути selinux для цього шляху.
Джонатан Кун

1
@RavinderPayal є додаткові функції для повернення тимчасового шляху. Так $temp_file = tempnam(sys_get_temp_dir(), 'TMP');було б створити тимчасовий файл у каталозі temp у більшості будь-якої системи. Потім ви можете використовувати цей файл, щоб отримати користувача / групу. Дещо з цього я залишив перед користувачем, щоб розібратися.
Джонатан Кун

20

Більш детально було б корисно, але якщо припустити, що це система Linux, і якщо припустимо, що php працює під apache, він буде працювати так, як працює коли-небудь користувальний апарат.

Простий спосіб перевірити (знову ж таки, якщо припустити, що таке середовище unix) - це створити файл php за допомогою:

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

що дасть вам користувача.

Для мого екземпляра AWS я отримую apacheвихід, коли запускаю цей сценарій.


16

Ви можете спробувати використати наступні посилання:

echo `whoami`;

7
Це просто дублікат запитань вище.
volter9

2
Можливо, корисним для деяких користувачів: якщо запустити це через інтерфейс командного рядка, ви отримаєте користувача, який виконує команду, а не користувача PHP.
Брем Ванрой

12

я б використовував:

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

будь-яке з них. Ви можете ввести em у своєму командному рядку ssh, і ви побачите, який користувач слухає яку послугу.

Ви також можете перейти і перевірити цей файл:

more /etc/apache2/envvars

і шукайте наступні рядки:

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

щоб відфільтрувати дані файлу envvars, ви можете використовувати grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_

1
grep "APACHE_RUN_" /etc/apache2/envvarsдобре працювали, спасибі
Тарік,

11

exec('whoami') зробимо це

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

Неможливо реально використовувати exec чи систему чи будь-які подібні функції passthru.
Веслі

@Wesley: так це неможливо.
генезис

2
Можливо, корисним для деяких користувачів: якщо запустити це через інтерфейс командного рядка, ви отримаєте користувача, який виконує команду, а не користувача PHP.
Брем Ванрой


1

додайте файл info.php у наступний каталог - ваш каталог http / apache за замовчуванням - як правило / var / www / html

із наступним змістом

<?php                                                                           
phpinfo();                                                                    
?>  

Потім httpd / apache перезапустіть перехід до вашого HTML-каталогу за замовчуванням http://enter.server.here/info.php

доставив би весь родовід php!


3
і яку змінну / значення в цьому висновку ми шукаємо?
Андрій

Я впевнений, що ви це вже знайшли, але шукаєте "користувача" на цій сторінці?
CRTLBREAK

0

У своєму налаштуванні я хочу перевірити, чи має поточний процес дозвіл на створення папок, папок і файлів, перш ніж розпочати процес, і запропонувати рішення, якщо схоже, що я не можу. Мені хотілося запустити stat(<file>)різні речі, щоб забезпечити відповідність дозволів до тих, що виконується (я використовую php-fpm, щоб він мінявся залежно від пулу).
Рішення на основі Макса, яке Маріо дав вище, здається ідеальним, проте здається, що розширення posix - вимкнено, тому я не міг зробити вищезазначене, і як я хочу порівняти результати з відповіддю запущеного stat (), що працює whoamiв окремій оболонці також не корисно (мені потрібні uid та gid, а не ім’я користувача).

Однак я знайшов корисний натяк, я міг би stat(/proc/self)і stat(/proc/self/attr)побачити в UID і GID файлу.

Сподіваюся, що допоможе хтось інший


0

Ви можете використовувати ці команди:

<? system('whoami');?>

або

<? passthru('whoami');?>

або

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

або

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

або

<? print get_current_user();?>

get_current_user () не повертає поточного користувача. Він повертає власнику сценарію, до якого викликається функція.
andsens

-1

Я зазвичай використовую

<?php echo get_current_user(); ?>

Я буду рада, якщо це допомогло вам


Про це вже згадувалося в коментарях до питання, і це має дуже мало спільного з користувачем, під яким працює сценарій.
Палець

get_current_user() - Gets the name of the owner of the current PHP script- не користувач, що запускає процес PHP.
Франциско Зарабобозо

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];працює, але надає поточне введене ім’я користувача в SSH.
Тарик

-1

Пропозиція

Невдовзі запізнився, але, хоча наступне є вирішенням проблеми, це вирішує вимогу, оскільки це працює чудово:

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


Опис

Виділення коду, вказане вище, не є точним, скопіюйте його та вставте у своєму улюбленому редакторі та перегляньте як PHP-код або збережіть і протестуйте його самостійно.

Як ви, напевно, знаєте, get_current_user()повертає власника "поточного запущеного сценарію" - тож якщо ви не "придушили" сценарій на сервері веб-серверу-користувачеві, він, швидше за все, буде "ніхто", або якщо розробник- Користувач існує в одній ОС, він швидше відобразить це ім'я користувача.

Щоб вирішити цю проблему, ми створюємо файл із поточним запущеним процесом. Якщо ви просто require()це в поточний запущений сценарій, він поверне те саме, що і батьківський скрипт, як згадувалося; тож нам потрібно запустити це як окремий запит, щоб набути чинності.

Процес-потік

Для того, щоб зробити це ефективним, розгляньте запуск шаблону дизайну, який включає в себе "режим виконання", тож коли сервер перебуває в "режимі розробки або тестовому режимі", тоді тільки він міг би запустити цю функцію і зберегти свій результат десь у включеному , - або просто звичайний текст чи базу даних чи залежно від того, що було.

Звичайно, ви можете змінити деякі деталі коду вище, як хочете зробити його більш динамічним, але логіка така:

  • визначити унікальну посилання для обмеження втручання в інших користувачів
  • визначити локальний шлях до запису тимчасового файлу
  • визначити загальнодоступний URL / шлях для запуску цього файлу у своєму власному процесі
  • написати тимчасовий файл php, який видає ім'я власника сценарію
  • отримати вихід цього сценарію, зробивши запит на нього
  • видаліть файл, оскільки він більше не потрібен - або залиште його, якщо хочете
  • повернути вихід запиту як значення повернення функції

-1
<?php phpinfo(); ?>

зберегти як info.php і

відкрити info.php у своєму браузері

ctrl + f, тоді введіть будь-яке з них:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

Ви можете бачити користувача, і група apache працює як.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.