其实php里的popen()函数是可以解决这个问题的

用来作为消除php以root权限奉行一些普通顾客不可能施行的一声令下或行使的参照。
实际php里的popen()函数是能够缓和这些难点的,但是出于有些版本的linux(如本人利用的Centos 5)对系统安全的设想,
使得这几个标题消除起来麻烦了广大。先来看八个网上朋友使用popen()函数的事例。

复制代码 代码如下:

/* PHP中怎么着扩展三个系统顾客
上面是一段例程,扩充二个名叫james的客户,
root密码是 louis。仅供参照他事他说加以考察
*/
$sucommand = "su root --command";
$useradd = "/scripts/demo/runscripts.php";
$rootpasswd = "louis";
$user = "james";
$user_add = sprintf("%s %s",$sucommand,$useradd);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);

经过本身的测验,证实此段代码是不可能落到实处(至少在本身的连串里是那般的)小编想要得到的结果的。经过和煦十分短日子的google之后,
主题材料的重如若su root那一个命令须要的密码必得以终端的法子输入,无法透过其它的办法(作者也不精通还应该有未有任何的点子)获得。
又由于项目须求不能够选取类似于sudo这种利用,万般无奈之下,小编选拔了网民建议的用编写C程序的不二等秘书籍来化解此主题材料。
首先写个C程序,命名称叫:run.c 放在目录/scripts/demo/下

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
//char cmd[1024]; //变量近些日子未选择
uid = getuid() ;
euid = geteuid();
printf("my uid :%un",getuid()); //这里显示的是当前的uid 能够注释掉.
printf("my euid :%un",geteuid()); //这里彰显的是时下的euid
if(setreuid(euid, uid)) //调换那多少个id
perror("setreuid");
printf("after setreuid uid :%un",getuid());
printf("afer sertreuid euid :%un",geteuid());
system("/scripts/demo/runscripts.php"); //实行脚本
return 0;
}

编写翻译该公文:
gcc -o run -Wall run.c
在该路径下生成run文件,这一个可施行文件。纵然明日用PHP脚本调用 该run的话,固然setreuid了 也是特别的。
接下去要做的是:给run赋予suid权限
# chmod u s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
好了,已经安装上了,再写多个php页面调用它。

复制代码 代码如下:

<?php
echo '<pre>';
$last_line = system('/scripts/demo/run', $retval);
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

在浏览器中浏览。
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48


Last line of the output: afer sertreuid euid :48

Return value: 0
该命令实践成功。
从出示结果能够看到: apache(daemon)的uid 为48(事实上比较多linux系统下daemon的uid为2)。
调用setreuid后将平价用户id和骨子里客户id调换了。(必得在chmod u s生效的场馆下) 使apache当前的uid为0那样就能够进行root命令了。
只供给转移 C文件中的system所要实践的下令就能够完毕和睦的PHP以root剧中人物实行命令了。

在玩C 在此以前 玩过一段时间的PHP, 哪个时候必要用PHP 来运作root命令,一直未果,直到有一天寻觅到了super这些插件.
趁着玩C的生活多了.发掘能够用C语言来包裹 要运转的外表命令. 实验了一下.中标了.
无需别的外界工具就能够完毕用PHP 实行root命令.
本人下边就把办法颁布给咱们,有要求用php来运营root命令的相恋的人能够不用发愁了.
阳台:Linux. 实验命令iptables 当前的目录是/var/www/html/http
写程序的时候 用root客商
我们都知道iptables 非root客户不能运营.
率先写个C程序
命名为:ipt.c

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
uid = getuid() ;
euid = geteuid();
printf("my uid :%un",getuid()); //这里彰显的是现阶段的uid 可以注释掉.
printf("my euid :%un",geteuid()); //这里展现的是当前的euid
if(setreuid(euid, uid)) //沟通那五个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网页调用 该ipt的话,就算setreuid了 也是特别的.
接下去要做的是chmod u s ./ipt
ls 一下
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s位已经设置上了.
再写三个php页面调用它.

复制代码 代码如下:

<?php
echo '<pre>';
$last_line = system('/var/www/html/http/ipt', $retval);
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

在浏览器中浏览.

[color=Red]Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination [/color]
[color=Blue]my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48[/color]


Last line of the output: afer sertreuid euid :48

Return value: 0

该命令实行成功..
鲜明性: apache的uid 为48. 调用setreuid后 将低价客户id 和事实上顾客id交换了.(必得在chmod u s生效的情景下) 使apache当前的 uid为0 那样就会实行root命令了。

世家只须求改变 C文件中的 system所要实施的下令就能够达成团结的PHP实施root命令了.

您大概感兴趣的篇章:

  • PHP调用Linux命令权限不足难点一举成功方法
  • 怎么着在Apache和Nginx禁止上传目录里PHP的施行权限
  • 理清PHP在Linxu下进行时的文书权限方法

本文由金沙澳门官网-www.js333com-金沙js333com发布于金沙澳门官网计算机,转载请注明出处:其实php里的popen()函数是可以解决这个问题的

您可能还会对下面的文章感兴趣: