Php имя пользователя root

Как запустить PHP exec() от имени пользователя root?

Я пытаюсь построить менеджер брандмауэра в PHP, но когда я выполняю, , массив результатов пуст.

Я пытался, и ответ www-data (пользователь, который использует Apache). Что я могу сделать, чтобы выполнить функцию exec от имени пользователя root? (Желательно без изменения пользователя Apache.)

9 ответов

Не делай этого! Вы будете широко открыты для всевозможных злонамеренных хакерских атак.

Посмотрите на документацию «sudo».

Вы должны быть в состоянии настроить все необходимые вам команды в качестве сценариев «sudo». Гораздо лучше писать конкретные сценарии с ограниченными функциями, чем выставлять основную привилегированную команду.

Я знаю, что это старый вопрос

добавьте пользователя php, запущенного в группу sudo, если он еще не назначен

используйте sudo -S, чтобы вы могли передать пароль через echo

$exec = "echo your_passwd | /usr/bin/sudo -S your command"; exec($exec,$out,$rcode); 

если у вас проблемы с путями — используйте

"bash -lc 'echo your_passwd | /usr/bin/sudo -S your command'" 

так что вы получите новый bash, который действует как оболочка входа в систему и имеет установленные пути

проверьте страницы руководства sudo

login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("sudo command\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?> 

Вы можете поместить необходимые команды в отдельный скрипт / исполняемый файл (sh, PHP, настоящий исполняемый файл, не имеет значения), изменить его владельца на root и применить к нему «setuid».

Это позволит всем и каждому запускать этот сценарий от имени пользователя root, поэтому вам нужно убедиться, что он имеет свои собственные правила безопасности, чтобы узнать, разрешено ли это, и очень ограничен в том, что он делает.

Это очень небезопасно и плохая идея. Переосмыслите свой дизайн. Если вы действительно хотите сделать это, используйте sudo, как советовали. Альтернативное решение может состоять в том, чтобы идти вперед и работать от имени пользователя root, но делать это внутри chroot или образа vm (оба из которых могут быть разбиты, но все же).

Или лучше всего запустить sudo внутри chroot!

Если вы не используете suphp и не настроите его для запуска с правами root, вы не сможете запускать любой скрипт PHP от имени любого другого пользователя системы, кроме того, кто запускает PHP.

Редактировать:

Просто маленькая идея. Как-нибудь добавить процесс очереди и запустить процесс cron в crontab корня.

Пожалуйста, будьте очень осторожны с этим. Любая инъекция может буквально разрушить систему.

Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash. Получите это здесь: https://github.com/merlinthemagic/MTS

Читайте также:  Simple slider

После загрузки вы просто используете следующий код:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('iptables -L'); //the return will be a string containing the return of the command echo $return1; 

Вам не нужно запускать root!

Я знаю, что это старый пост, но его много ищут, поэтому, пожалуйста, посмотрите мой ответ ниже, который не требует, чтобы вы давали права root для www-data.

Потерпите меня, но это работает (проверено на сервере Ubuntu 20.04 LTS, август 2021 г.)

Создайте текстовые файлы «sudocmds.txt» и «results.txt» вне корневого веб-пути, т.е.

Если ваш корневой каталог / var / www / html /, поместите свои текстовые файлы в / var / www / cmds /

Установите права доступа к файлам на www-data:

sudo chown www-data /var/www/cmds/sudocmds.txt sudo chown www-data /var/www/cmds/results.txt 

Я воспользуюсь вашим примером, чтобы показать «iptables -L» нажатием кнопки:

Используйте код PHP, чтобы записать «1» в файл sudocmds.txt при нажатии кнопки CMD:

Теперь создайте службу для запуска на вашем хосте, которая будет отслеживать файл и искать его, а затем выполнять команду.

Для этого я буду использовать в качестве примера inotify-tools:

sudo apt install inotify-tools -y 
sudo nano /opt/cmd-watcher.sh #!/bin/bash inotifywait -mqr -e close_write "/var/www/cmds/sudocmds.txt" | while read line do if grep -q 1 "/var/www/cmds/sudocmds.txt"; then sudo iptables -L > /var/www/cmds/results.txt fi done 

Сделайте скрипт исполняемым

sudo chmod +x /opt/cmd-watcher.sh 

Запускаем скрипт в фоновом режиме

Теперь перейдите на свою веб-страницу, обновите ее и нажмите кнопку, вы увидите, что результаты команды появятся через 1 секунду 🙂

Надеюсь, это поможет любому, кто ищет что-то подобное, если да, пожалуйста, проголосуйте за, спасибо.

Я знаю, что это немного сложный процесс, но это означает, что вы не должны подвергаться риску безопасности, выполняя команды от имени пользователя root с www-данными.

Источник

$_SERVER

Переменная $_SERVER — это массив ( array ), содержащий такую информацию, как заголовки, пути и местоположения скриптов. Записи в этом массиве создаются веб-сервером, поэтому нет гарантии, что каждый веб-сервер будет предоставлять любую из этих переменных; серверы могут опускать некоторые из них или предоставлять другие, не указанные здесь. Однако большинство из этих переменных учтены в спецификации » CGI/1.1 и, скорее всего, будут определены.

Замечание: При запуске PHP в командной строке большинство из этих записей будут недоступны или не будут иметь никакого значения.

В дополнение к перечисленным ниже элементам, PHP будет создавать дополнительные элементы со значениями из заголовков запросов. У элементов будет имя HTTP_ , за которым следует имя заголовка, написанное с заглавной буквы и с подчёркиванием вместо дефиса. Например, заголовок Accept-Language будет доступен как $_SERVER[‘HTTP_ACCEPT_LANGUAGE’] .

Читайте также:  Tuples in python immutable

Индексы

‘ PHP_SELF ‘ Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например, $_SERVER[‘PHP_SELF’] в скрипте по адресу http://example.com/foo/bar.php будет /foo/bar.php . Константа __FILE__ содержит полный путь и имя файла текущего (то есть подключённого) файла. Если PHP запущен в командной строке, эта переменная содержит имя скрипта. ‘argv’ Массив аргументов, переданных скрипту. Когда скрипт запущен в командой строке, это даёт C-подобный доступ к параметрам командной строки. Когда вызывается через метод GET, этот массив будет содержать строку запроса. ‘argc’ Содержит количество параметров, переданных скрипту (если запуск произведён в командной строке). ‘ GATEWAY_INTERFACE ‘ Содержит используемую сервером версию спецификации CGI; к примеру ‘CGI/1.1’ .. ‘ SERVER_ADDR ‘ IP-адрес сервера, на котором выполняется текущий скрипт. ‘ SERVER_NAME ‘ Имя хоста, на котором выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, здесь будет содержатся имя, определённое для этого виртуального хоста.

Замечание: В Apache 2 необходимо установить UseCanonicalName = On и ServerName . В противном случае это значение отразит имя хоста, предоставленное клиентом, которое может быть подделано. Небезопасно полагаться на это значение в контексте, требующем безопасности.

‘ SERVER_SOFTWARE ‘ Строка идентификации сервера, указанная в заголовках, когда происходит ответ на запрос. ‘ SERVER_PROTOCOL ‘ Имя и версия информационного протокола, через который была запрошена страница; к примеру ‘HTTP/1.0’ ; ‘ REQUEST_METHOD ‘ Какой метод был использован для запроса страницы; к примеру ‘GET’ , ‘HEAD’ , ‘POST’ , ‘PUT’ .

Замечание:

PHP-скрипт завершается после отправки заголовков (то есть после того, как осуществляется любой вывод без буферизации вывода), если метод запроса был HEAD .

‘ REQUEST_TIME ‘ Временная метка начала запроса. ‘ REQUEST_TIME_FLOAT ‘ Временная метка начала запроса с точностью до микросекунд. ‘ QUERY_STRING ‘ Строка запроса, если есть, через которую была открыта страница. ‘ DOCUMENT_ROOT ‘ Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера. ‘ HTTPS ‘ Принимает непустое значение, если запрос был произведён через протокол HTTPS. ‘ REMOTE_ADDR ‘ IP-адрес, с которого пользователь просматривает текущую страницу. ‘ REMOTE_HOST ‘ Удалённый хост, с которого пользователь просматривает текущую страницу. Обратный поиск DNS основан на значении переменной REMOTE_ADDR .

Замечание: Сервер должен быть настроен, чтобы создавать эту переменную. Для примера, в Apache необходимо присутствие директивы HostnameLookups On в файле httpd.conf , чтобы эта переменная создавалась. Смотрите также gethostbyaddr() .

‘ REMOTE_PORT ‘ Порт на удалённой машине, который используется для связи с сервером. ‘ REMOTE_USER ‘ Аутентифицированный пользователь. ‘ REDIRECT_REMOTE_USER ‘ Аутентифицированный пользователь, если запрос был перенаправлен изнутри. ‘ SCRIPT_FILENAME ‘

Читайте также:  Вызвать метод класса php

Абсолютный путь к исполняемому скрипту.

Замечание:

Если скрипт запускается в командной строке (CLI), используя относительный путь, такой как file.php или ../file.php , переменная $_SERVER[‘SCRIPT_FILENAME’] будет содержать относительный путь, указанный пользователем.

‘ SERVER_ADMIN ‘ Эта переменная получает своё значение (для Apache) из директивы конфигурационного файла сервера. Если скрипт запущен на виртуальном хосте, это будет значение, определённое для данного виртуального хоста. ‘ SERVER_PORT ‘ Порт на компьютере сервера, используемый сервером для соединения. Для установок по умолчанию, значение будет ’80’ ; используя SSL, например, это значение будет таким, какое сконфигурировано для соединений безопасного HTTP.

Замечание: Чтобы получить физический (реальный) порт в Apache 2, необходимо установить UseCanonicalName = On и UseCanonicalPhysicalPort = On , иначе это значение может быть подменено и не вернуть реальной значение физического порта. Полагаться на это значение небезопасно в контексте приложений, требующих усиленной безопасности.

‘ SERVER_SIGNATURE ‘ Строка, содержащая версию сервера и имя виртуального хоста, которые добавляются к генерируемым сервером страницам, если включено. ‘ PATH_TRANSLATED ‘ Путь файловой системы (не document root) к текущему скрипту, после того как сервер выполнил отображение virtual-to-real.

Замечание: Пользователи Apache 2 могут использовать директиву AcceptPathInfo = On в конфигурационном файле httpd.conf для задания переменной PATH_INFO .

‘ SCRIPT_NAME ‘ Содержит путь к текущему исполняемому скрипту. Это полезно для страниц, которые должны указывать на самих себя. Константа __FILE__ содержит полный путь и имя текущего (то есть включённого) файла. ‘ REQUEST_URI ‘ URI, который был предоставлен для доступа к этой странице. Например, ‘ /index.html ‘. ‘ PHP_AUTH_DIGEST ‘ При выполнении аутентификации HTTP Digest этой переменной присваивается заголовок ‘Authorization’, отправленный клиентом (который затем следует использовать для проведения соответствующей проверки). ‘ PHP_AUTH_USER ‘ При выполнении HTTP-аутентификации этой переменной присваивается имя пользователя, предоставленное пользователем. ‘ PHP_AUTH_PW ‘ При выполнении HTTP-аутентификации этой переменной присваивается пароль, предоставленный пользователем. ‘ AUTH_TYPE ‘ При выполнении HTTP-аутентификации этой переменной присваивается тип аутентификации, который используется. ‘ PATH_INFO ‘ Содержит любой предоставленный пользователем путь, содержащийся после имени скрипта, но до строки запроса, если она есть. Например, если текущий скрипт запрошен по URL http://www.example.com/php/path_info.php/some/stuff?foo=bar , то переменная $_SERVER[‘PATH_INFO’] будет содержать /some/stuff . ‘ ORIG_PATH_INFO ‘ Исходное значение переменной ‘ PATH_INFO ‘ перед обработкой PHP.

Примеры

Пример #1 Пример использования $_SERVER

Источник

Оцените статью