ホームページ  >  記事  >  バックエンド開発  >  PHP に ROOT 権限でシステムコマンドを実行させる方法_PHP チュートリアル

PHP に ROOT 権限でシステムコマンドを実行させる方法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:31:391131ブラウズ

これは、通常のユーザーが root 権限で実行できない一部のコマンドやアプリケーションを php が実行する問題を解決するための参考として使用されます。
実際には、PHP の Popen() 関数でこの問題を解決できますが、Linux の一部のバージョン (私が使用している Centos 5 など) ではシステム セキュリティを考慮しているため、
この問題の解決はさらに面倒になります。まず、popen() 関数を使用するネットユーザーの例を見てみましょう。

コードをコピーします コードは次のとおりです:

/* PHP でシステム ユーザーを追加する方法
以下は、james という名前のユーザーを追加するルーチンです。
root パスワードは louis です。参考のみ
*/
$sucommand = "su root --command";
$rootpasswd = "louis"; $user_add = sprintf("%s %s",$sucommand,$useradd);
$fp = @popen($user_add,"w");
@pclose($) fp);


私自身のテストの結果、このコードは作者が得たい結果を達成できないことが確認されました(少なくとも私のシステムでは)。久しぶりにググってみたら、
問題の鍵は、su rootコマンドに必要なパスワードはターミナルで入力する必要があり、他の方法では取得できないことです(他の方法があるかはわかりません)。
そして、このプロジェクトでは sudo などのアプリケーションを使用できない必要があるため、苦し紛れに、この問題を解決するためにネットユーザーが提案した C プログラムを作成する方法を選択しました。
まず C プログラムを作成し、run.c という名前を付け、ディレクトリ /scripts/demo/



コードをコピーします
コードは次のとおりです。 #include #include を使用します
uid = getuid();
euid = geteuid(); // ここに表示されている現在の uid はコメント化できます。 out.
printf("my euid :%un",geteuid()); //現在の euid がここに表示されます
if(setreuid(euid, uid)) //これら 2 つの ID を交換します
perror("setreuid");
printf("after setreuid uid :%un",getuid());
printf("after setreuid euid :%un",geteuid());
system("/scripts/demo/runscripts.php"); /Execute script
return 0 ;
}


このファイルをコンパイルします:
gcc -o run -Wall run.c
このパスに実行ファイル (この実行可能ファイル) を生成します。 PHP スクリプトを使用してこれを今すぐ呼び出すと、setreuid が設定されていても機能しません。
次に行うことは、実行するための suid 権限を与えることです
# chmod u+s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
OK、セットアップされました。それを呼び出す別の php ページを作成します。


コードをコピーします

コードは次のとおりです:


echo '
' <br>$last_line = system('/scripts/demo/run', $retval); <br>echo ' <div class="codetitle"> 

出力の最後の行: ' . $last_line . '
ブラウザで「参照」します。
私のuid:48
私のeuid:0
setreuid後のuid:0
sertreuid後のeuid:48

-------------------------- -------------------------------------------------- ----
出力の最後の行: afer sertreuid euid :48
--------------------------------- -----------------------------------------------
戻り値: 0
コマンドは正常に実行されました。
表示された結果からわかるように、Apache (デーモン) の uid は 48 です (実際、多くの Linux システムのデーモンの uid は 2)。
setreuid を呼び出した後、実効ユーザー ID と実際のユーザー ID が交換されます。 (chmod u+s が有効な場合に限ります) root コマンドを実行できるように、Apache の現在の uid を 0 にします。
C ファイル内のシステムによって実行されるコマンドを変更して、root 役割としてコマンドを実行する独自の PHP を実装するだけです。

C で遊ぶ。私は以前、PHP を使って root コマンドを実行する必要があったのですが、ある日スーパー プラグインを探すまでは失敗していました。ますます、C 言語を使用して外部コマンドを実行できることがわかりました。試してみたところ、成功しました。
外部ツールを使用せずに root コマンドを実行できます。 PHP を使用して root コマンドを実行する必要がある人は、次の方法を使用してください。心配する必要はありません。
実験用コマンド iptables の現在のディレクトリは /var/www/html/http です。プログラム
iptables は root 以外のユーザーは実行できないことは誰もが知っています
まず C プログラムを作成します
名前: ipt.c



コードをコピーします

コードは次のとおりです:

#include
#include
uid_t uid , euid;
uid = getuid() ;
printf("my uid",getuid()); //ここに表示される現在の uid はコメント化できます。 :%un",geteuid()); //現在の euid がここに表示されます
if(setreuid(euid, uid)) //これら 2 つの ID を交換します
perror("setreuid");
printf("after setreuid uid : %un",getuid());
printf("afer sertreuid euid :%un",geteuid());
system("/sbin/iptables -L"); //iptables -L コマンドを実行
return 0;
}



ファイル gcc -o ipt -Wall ipt.c をコンパイルします
このパスに ipt 実行可能ファイルを生成します
ここで PHP Web ページを使用して ipt を呼び出すと、setreuid が設定されている場合でも、動作しません。
次に行うことは chmod u+s ./ipt
ls
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s ビットが設定されました
別の php ページを呼び出してください。



コードをコピーします

コードは次のとおりです:
echo '
' $last_line = system('/var/www/html/http/ipt'; , $retval ); </span>echo ' </div>
出力の最後の行: ' . $last_line . ' 戻り値: ' . >


ブラウザで表示

[color=Red]Chain INPUT (policy ACCEPT)
target prot opt ソース先
Chain FORWARD (policy DROP)
target prot opt ソース先
ACCEPT all --どこでもどこでも状態 関連、確立
チェーン出力 (ポリシー ACCEPT)
ターゲット prot opt ソース宛先 [/color]
[color=Blue]my uid :48
my euid :0
setreuid 後 uid :0
ertreuid euid 以降:48[/カラー]

------------------------------------------ ------- -----------------------------
出力の最後の行: afer sertreuid euid :48
------------------------------------------------------ ------- ------------------------
戻り値: 0

コマンドは正常に実行されました。
誰もが知っています: Apache の uid は 48 です。 setreuid を呼び出した後、実効ユーザー ID と実際のユーザー ID が交換されます (chmod u+s が有効な場合に限ります)。 rootコマンドを実行できるようになります。

独自の PHP 実行ルート コマンドを実装するには、C ファイル内のシステムによって実行されるコマンドを変更するだけです。



http://www.bkjia.com/PHPjc/322943.html

www.bkjia.com

tru​​e
http://www.bkjia.com/PHPjc/322943.html

技術記事これは、通常のユーザーが root 権限で実行できない一部のコマンドやアプリケーションを php が実行する問題を解決するための参考として使用されます。 実際、PHP の Popen() 関数でこの問題を解決できますが、バージョンによっては...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHP_PHP を使用した XML DOM の読み書きのための実装コードのチュートリアル次の記事:PHP_PHP を使用した XML DOM の読み書きのための実装コードのチュートリアル

関連記事

続きを見る