Eu preciso detectar se o php está sendo executado como ninguém. Como eu faço isso?
Existem outros nomes para "ninguém"? "apache"? Quaisquer outros?
Eu preciso detectar se o php está sendo executado como ninguém. Como eu faço isso?
Existem outros nomes para "ninguém"? "apache"? Quaisquer outros?
Respostas:
Se disponível, você pode sondar a conta do usuário atual com posix_geteuid
e, em seguida, obter o nome do usuário com posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Se você estiver executando em modo de segurança (o que geralmente é o caso quando exec está desabilitado), então é improvável que seu processo PHP esteja executando em qualquer coisa além do padrão www-data
ou apache
conta.
get_current_user()
manual que mostra essa abordagem. A partir do PHP 5.4, ele pode ser reduzido para:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
Meio para trás, mas sem exec / sistema:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Se você criar um arquivo, o proprietário será o usuário PHP.
Isso provavelmente também poderia ser executado com qualquer uma das funções de arquivo temporário, como tempnam()
, que cria um arquivo aleatório no diretório temporário e retorna o nome desse arquivo. Se houver problemas devido a algo como as permissões open_basedir
ou modo de segurança que impedem a gravação de um arquivo, normalmente, o diretório temporário ainda será permitido.
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
, criaria um arquivo temporário no diretório temporário na maioria dos sistemas. Você pode então usar esse arquivo para obter o usuário / grupo. Eu deixei um pouco disso para o usuário descobrir.
Mais detalhes seriam úteis, mas assumindo que é um sistema linux, e assumindo que o php está rodando sob o apache, ele rodará como sempre o usuário do apache.
Uma maneira fácil de verificar (novamente, assumindo algum ambiente semelhante ao Unix) é criar um arquivo php com:
<?php
print shell_exec( 'whoami' );
?>
que lhe dará o usuário.
Para minha instância AWS, estou obtendo uma apache
saída quando executo este script.
Você pode tentar usar crases como este:
echo `whoami`;
eu usaria:
lsof -i
lsof -i | less
lsof -i | grep :http
nenhum desses. Você pode digitar em na linha de comando ssh e você verá qual usuário está ouvindo qual serviço.
você também pode verificar este arquivo:
more /etc/apache2/envvars
e procure por estas linhas:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
para filtrar os dados do arquivo envvars, você pode usar grep:
more /etc/apache2/envvars |grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvars
funcionou bem, obrigado.
exec('whoami')
vai fazer isso
<?php
echo exec('whoami');
?>
Direto do shell, você pode executar:
php -r "echo exec('whoami');"
adicione o arquivo info.php ao seguinte diretório - seu diretório http / apache padrão - normalmente / var / www / html
com o seguinte conteúdo
<?php
phpinfo();
?>
Em seguida, reinicie o httpd / apache e vá para o diretório html padrão http://enter.server.here/info.php
entregaria todo o pedigree do php!
Em minha configuração, desejo verificar se o processo atual tem permissão para criar pastas, subpastas e arquivos antes de iniciar um processo e sugerir uma solução, caso pareça que não posso. Eu queria executar stat(<file>)
em várias coisas para garantir que as permissões correspondam às do processo em execução (estou usando php-fpm, portanto, varia dependendo do pool).
A solução baseada em posix que Mario deu acima parece perfeita, no entanto, parece que a extensão posix está --disabled, então eu não pude fazer o acima e como eu quero comparar os resultados com a resposta da execução de stat () whoami
em um shell separado também não é útil (preciso do uid e do gid, não do nome de usuário).
No entanto eu encontrei uma dica útil, que pude stat(/proc/self)
e stat(/proc/self/attr)
e veja o uid e GID do arquivo.
Espero que ajude outra pessoa
Você pode usar estes comandos:
<? system('whoami');?>
ou
<? passthru('whoami');?>
ou
<? print exec('whoami');?>
ou
<? print shell_exec('whoami');?>
ou
<? print get_current_user();?>
Eu costumo usar
<?php echo get_current_user(); ?>
Ficarei feliz se te ajudou
get_current_user() - Gets the name of the owner of the current PHP script
- não o usuário executando o processo PHP.
Um pouco tarde, mas mesmo que o seguinte seja uma solução alternativa, ele resolve o requisito, pois funciona muito bem:
<?
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
?>
O destaque de código acima não é preciso, copie e cole em seu editor favorito e visualize como código PHP ou salve e teste você mesmo.
Como você provavelmente sabe, get_current_user()
retorna o proprietário do "script em execução atual" - então, se você não "chown" um script no servidor para o usuário do servidor web, muito provavelmente será "ninguém", ou se o desenvolvedor- usuário existe no mesmo sistema operacional, ele irá exibir esse nome de usuário.
Para contornar isso, criamos um arquivo com o processo em execução atual. Se você apenas fizer require()
isso no script em execução atual, ele retornará o mesmo que o script-pai mencionado; portanto, precisamos executá-lo como uma solicitação separada para ter efeito.
Para tornar isso eficaz, considere executar um padrão de design que incorpore o "modo de tempo de execução", de modo que quando o servidor estiver em "modo de desenvolvimento ou modo de teste", apenas ele poderá executar esta função e salvar sua saída em algum lugar de inclusão , -ou apenas texto simples ou banco de dados, ou o que for.
Claro que você pode alterar algumas particularidades do código acima, se desejar torná-lo mais dinâmico, mas a lógica é a seguinte:
<?php phpinfo(); ?>
salvar como info.php e
abra info.php em seu navegador
ctrl + f e digite qualquer um destes:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
você pode ver o usuário e o grupo com o qual o apache está sendo executado.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Usuário autenticado