如何检查用户 php 是以什么样的身份运行的?

我需要检测 php 是否作为无人运行?

“无名小卒”还有别的名字吗? “阿帕奇”? 还有别的吗?

202211 次浏览

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

exec('whoami') 将这样做

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

你可以试试这样使用反勾:

echo `whoami`;

如果可用,您可以使用 posix_geteuid探测当前用户帐户,然后使用 posix_getpwuid获取用户名。

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

但是,如果您在安全模式下运行(禁用 exec 时通常是这种情况) ,那么您的 PHP 进程不太可能在默认的 www-dataapache帐户以外的任何情况下运行。

有点落后,但没有 exec/system:

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

如果您创建一个文件,其所有者将是 PHP 用户。

这也可以与任何临时文件函数一起运行,比如 tempnam(),它在临时目录中创建一个随机文件并返回该文件的名称。如果由于权限、 open_basedir或安全模式等原因导致无法写入文件,通常情况下,临时目录仍然是允许的。

更多的细节将是有用的,但是假设它是一个 linux 系统,并且假设 php 在 apache 下运行,它将以任何用户 apache 的运行方式运行。

一种简单的检查方法(同样,假设有一些类似 unix 的环境)是创建一个 php 文件:

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

它会给你用户。

对于我的 AWS 实例,当我运行这个脚本时,我将获得 apache作为输出。

我会用:

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

您可以在 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_

在我的设置中,我想检查当前进程是否有权创建文件夹、子文件夹和文件,然后再开始进程,如果看起来我不能,我会建议一个解决方案。我希望在各种事情上运行 stat(<file>),以确保权限与正在运行的进程的权限相匹配(我使用的是 php-fpm,因此它取决于池)。
Mario 上面给出的基于 posx 的解决方案看起来很完美,但是似乎 posx 扩展被禁用了,所以我不能做上面的工作,因为我想将结果与在单独的 shell 中运行 stat ()运行 whoami的响应进行比较,这也没有帮助(我需要 uid 和 gid,而不是用户名)。

但是我发现了一个有用的提示,我可以看到 stat(/proc/self)stat(/proc/self/attr)文件的 uid 和 gid。

希望能帮到别人

我经常用

<?php echo get_current_user(); ?>

如果能帮到你,我会很高兴的

$_SERVER["USER"]


$_SERVER["USERNAME"]

提议

虽然有点晚,但是尽管下面是一个解决方案,它还是解决了这个需求,因为这个方案工作得很好:

<?
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()到当前运行的脚本中,它将返回与前面提到的父脚本相同的内容; 因此,我们需要将其作为单独的请求运行才能生效。

流程-流程

为了使其有效,可以考虑运行一个包含“运行时模式”的设计模式,这样当服务器处于“开发模式或测试模式”时,只有它可以运行这个函数并将其输出保存在 include 中的某个地方,或者只保存纯文本或数据库,或者其他任何地方。

当然,您可以更改上述代码的一些细节,以使其更具有动态性,但其逻辑如下:

  • 定义一个唯一的参考,以限制对其他用户的干扰
  • 定义用于写入临时文件的本地文件路径
  • 定义一个公共的 url/path 来在它自己的进程中运行这个文件
  • 编写输出脚本所有者名称的临时 php 文件
  • 通过向该脚本发出请求来获取该脚本的输出
  • 删除该文件,因为它不再需要-或留下它,如果你想要的
  • 将请求的输出作为函数的返回值返回

将文件 info.php 添加到以下目录-默认的 http/apache 目录-Normal/var/www/html

内容如下

<?php
phpinfo();
?>

然后重新启动 httpd/apache 转到默认的 html 目录 Http://enter.server.here/info.php

将带来整个 php 的血统!

$user = $_SERVER['REMOTE_USER'];

Http://php.net/manual/en/reserved.variables.server.php

身份验证用户

<?php phpinfo(); ?>

保存为 info.php 和

在浏览器中打开 info.php

Ctrl + f 然后键入以下任何一个:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

您可以看到用户和组 apache 的运行方式是。

你可以直接从外壳运行:

php -r "echo exec('whoami');"

您可以使用以下命令:

<? system('whoami');?>

或者

<? passthru('whoami');?>

或者

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

或者

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

请注意,get_current_user()返回当前 PHP 脚本所有者的名称!