Мені потрібно виявити, чи php працює як ніхто. Як це зробити?
Чи є інші назви "ніхто"? "апаш"? Будь-які інші?
Мені потрібно виявити, чи php працює як ніхто. Як це зробити?
Чи є інші назви "ніхто"? "апаш"? Будь-які інші?
Відповіді:
Якщо є, ви можете перевірити поточний обліковий запис користувача, posix_geteuid
а потім отримати ім'я користувача posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Якщо ви працюєте в безпечному режимі (що часто трапляється, коли exec вимкнено), навряд чи ваш PHP-процес запускається ні за що, крім за замовчуванням www-data
або apache
обліковим записом.
get_current_user()
сторінках керівництва , що показує цей підхід. Щодо PHP 5.4, це можна скоротити до цього:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
Вид зворотного шляху, але без exec / system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Якщо ви створите файл, власником буде користувач PHP.
Це також може бути запущено з будь-якою з тимчасових функцій файлу, таких як tempnam()
, яка створює випадковий файл у тимчасовому каталозі та повертає ім'я цього файлу. Якщо виникають проблеми, пов’язані з дозволами open_basedir
чи безпечним режимом, які заважають писати файл, як правило, тимчасовий каталог все одно буде дозволений.
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
було б створити тимчасовий файл у каталозі temp у більшості будь-якої системи. Потім ви можете використовувати цей файл, щоб отримати користувача / групу. Дещо з цього я залишив перед користувачем, щоб розібратися.
Більш детально було б корисно, але якщо припустити, що це система Linux, і якщо припустимо, що php працює під apache, він буде працювати так, як працює коли-небудь користувальний апарат.
Простий спосіб перевірити (знову ж таки, якщо припустити, що таке середовище unix) - це створити файл php за допомогою:
<?php
print shell_exec( 'whoami' );
?>
що дасть вам користувача.
Для мого екземпляра AWS я отримую apache
вихід, коли запускаю цей сценарій.
Ви можете спробувати використати наступні посилання:
echo `whoami`;
я б використовував:
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_
grep "APACHE_RUN_" /etc/apache2/envvars
добре працювали, спасибі
exec('whoami')
зробимо це
<?php
echo exec('whoami');
?>
Прямо від оболонки ви можете запустити:
php -r "echo exec('whoami');"
додайте файл info.php у наступний каталог - ваш каталог http / apache за замовчуванням - як правило / var / www / html
із наступним змістом
<?php
phpinfo();
?>
Потім httpd / apache перезапустіть перехід до вашого HTML-каталогу за замовчуванням http://enter.server.here/info.php
доставив би весь родовід php!
У своєму налаштуванні я хочу перевірити, чи має поточний процес дозвіл на створення папок, папок і файлів, перш ніж розпочати процес, і запропонувати рішення, якщо схоже, що я не можу. Мені хотілося запустити stat(<file>)
різні речі, щоб забезпечити відповідність дозволів до тих, що виконується (я використовую php-fpm, щоб він мінявся залежно від пулу).
Рішення на основі Макса, яке Маріо дав вище, здається ідеальним, проте здається, що розширення posix - вимкнено, тому я не міг зробити вищезазначене, і як я хочу порівняти результати з відповіддю запущеного stat (), що працює whoami
в окремій оболонці також не корисно (мені потрібні uid та gid, а не ім’я користувача).
Однак я знайшов корисний натяк, я міг би stat(/proc/self)
і stat(/proc/self/attr)
побачити в UID і GID файлу.
Сподіваюся, що допоможе хтось інший
Ви можете використовувати ці команди:
<? system('whoami');?>
або
<? passthru('whoami');?>
або
<? print exec('whoami');?>
або
<? print shell_exec('whoami');?>
або
<? print get_current_user();?>
Я зазвичай використовую
<?php echo get_current_user(); ?>
Я буду рада, якщо це допомогло вам
get_current_user() - Gets the name of the owner of the current PHP script
- не користувач, що запускає процес PHP.
Невдовзі запізнився, але, хоча наступне є вирішенням проблеми, це вирішує вимогу, оскільки це працює чудово:
<?
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()
це в поточний запущений сценарій, він поверне те саме, що і батьківський скрипт, як згадувалося; тож нам потрібно запустити це як окремий запит, щоб набути чинності.
Для того, щоб зробити це ефективним, розгляньте запуск шаблону дизайну, який включає в себе "режим виконання", тож коли сервер перебуває в "режимі розробки або тестовому режимі", тоді тільки він міг би запустити цю функцію і зберегти свій результат десь у включеному , - або просто звичайний текст чи базу даних чи залежно від того, що було.
Звичайно, ви можете змінити деякі деталі коду вище, як хочете зробити його більш динамічним, але логіка така:
<?php phpinfo(); ?>
зберегти як info.php і
відкрити info.php у своєму браузері
ctrl + f, тоді введіть будь-яке з них:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
Ви можете бачити користувача, і група apache працює як.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Автентифікований користувач