web-dev-qa-db-ja.com

ルートとしてPHP exec()を実行するには?

PHPでファイアウォールマネージャーを構築しようとしていますが、<?php exec('iptables -L'); ?>を実行すると、結果の配列が空になります。

<?php echo exec('whoami'); ?>を試しましたが、応答はwww-data(Apacheが使用しているユーザー)。ルートとしてexec機能を実行するにはどうすればよいですか? (できればApacheユーザーを変更しないでください。)

30
user145447

しないでください!あなたは、あらゆる種類の悪意のあるハッカーに対して自分自身を広く開いたままにします。

「Sudo」ドキュメントをご覧ください。

必要なすべてのコマンドを「Sudo」可能なスクリプトとして設定できるはずです。基礎となる特権コマンドを公開するよりも、機能が制限された特定のスクリプトを記述する方がはるかに優れています。

次のように:

exec ('Sudo getIpTables.ksh')
34
James Anderson

phpseclib、純粋なPHP SSH実装 を使用してSudoを実行できます。

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
$ssh->login('username', 'password');

$ssh->read('[Prompt]');
$ssh->write("Sudo command\n");
$ssh->read('Password:');
$ssh->write("Password\n");
echo $ssh->read('[Prompt]');
?>
13
user580858

これは古い質問です

phpがまだ割り当てられていない場合、phpが実行されるユーザーを追加します。

sudo -Sを使用して、エコー経由でパスワードを渡すことができます

$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のmanページを確認してください

9
lumos0815

suphp を使用してrootとして実行するように設定しない限り、PHPを実行しているユーザー以外の他のシステムユーザーに代わってPHPスクリプトを実行できません。

編集:

ちょっとしたアイデア。何らかの方法でキュープロセスを追加し、ルートのcrontabで cron プロセスを実行します。

本当に注意してください。注入すると文字通りシステムが破壊される可能性があります。

3
Gabriel Sosa

これは非常に安全ではなく、悪い考えです。デザインを再考してください。本当にこれを行いたい場合は、推奨どおりSudoを使用してください。別の解決策として、先に進んでrootとして実行することもできますが、chrootまたはvmイメージ内で実行します(どちらも分割できますが、まだ実行できます)。

または何よりも、chroot内でSudoとして実行されます!

3
Collin

必要なコマンドを別のスクリプト/実行可能ファイル(sh、PHP、実際の実行可能ファイル、重要ではありません)に入れ、所有者をrootに変更し、「setuid」を適用できます。

これにより、すべてのユーザーがこのスクリプトをrootとして実行できるようになるため、これが許可されているかどうかを確認するための独自のセキュリティルールがあり、その動作が非常に制限されていることを確認する必要があります。

1

私は最近、PHPが実際のBashシェルを取得して対話できるようにするプロジェクトを公開しました。ここから入手できます。 https://github.com/merlinthemagic/MTS

ダウンロード後、次のコードを使用するだけです。

$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;
1
MerlinTheMagic

単なる仮定-これはPHPこれを行うWebアプリですか?これはあまり安全ではないように思えます。そうでない場合は、ルートとして実行できるようにプロセスをSudoすることができます。