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');
、ほとんどすべてのシステムの一時ディレクトリに一時ファイルが作成されます。その後、そのファイルを使用してユーザー/グループを取得できます。その一部をユーザーに任せて理解しました。
次のようにバックティックを使用してみることができます:
echo `whoami`;
私は使うだろう:
lsof -i
lsof -i | less
lsof -i | grep :http
これらのいずれか。sshコマンドラインにemと入力すると、どのユーザーがどのサービスをリッスンしているかがわかります。
このファイルにアクセスして確認することもできます。
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ベースのソリューションは完璧に見えますが、posix拡張が--disabledであるため、上記を実行できずwhoami
、別のシェルで実行されているstat()を実行した結果と比較したいのでどちらも役に立ちません(ユーザー名ではなく、uidとgidが必要です)。
しかし私は、有益なヒントを見つけた私ができたstat(/proc/self)
とstat(/proc/self/attr)
し、ファイルのuidとgidを参照してください。
それが他の誰かを助けることを願っています
私は通常使用します
<?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()
、「現在実行中のスクリプト」の所有者を返します。つまり、サーバー上のスクリプトをweb-server-userに「chown」しなかった場合は、おそらく「nobody」、または開発者がユーザーが同じOS上に存在する場合は、そのユーザー名が表示されます。
これを回避するために、現在実行中のプロセスを含むファイルを作成します。もしあなただけのrequire()
この現在実行中のスクリプトに述べたように、それは親スクリプトと同じように返されます。そのため、有効にするために別のリクエストとして実行する必要があります。
これを効果的にするために、「実行モード」を組み込んだ設計パターンを実行することを検討してください。サーバーが「開発モードまたはテストモード」の場合、サーバーだけがこの機能を実行してインクルードのどこかに出力を保存できます。 、またはプレーンテキストかデータベース、またはいずれか。
もちろん、より動的にするために、上記のコードの一部を変更できますが、ロジックは次のとおりです。
<?php phpinfo(); ?>
info.phpとして保存し、
ブラウザでinfo.phpを開きます
次にctrl + fで次のいずれかを入力します。
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
ユーザーとグループapacheが実行されているのを確認できます。