设为首页 收藏本站
查看: 425|回复: 0

[经验分享] PHP获取root权限

[复制链接]

尚未签到

发表于 2017-3-23 12:17:40 | 显示全部楼层 |阅读模式
  在进行项目的时候遇到一个问题,通过网页来重启服务器 。即php需要获取root权限才能执行重启操作。有问题问百度,百度不知问谷歌 。查了很多的资料,最后找到了一个可执行的方案 。即下面的这篇文章 。
  

这种问题我想大家可能都遇到过,网友提供的解决方法也很多。我也只是结合自己系统的需求并结合网友的解决方案来总结的一种方法

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考。


其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑,

使得这个问题解决起来麻烦了好多。先来看一个网友使用popen()函数的例子。

<?php
/* 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 :%u/n",getuid()); //这里显示的是当前的uid 可以注释掉.  
printf("my euid :%u/n",geteuid()); //这里显示的是当前的euid  
if(setreuid(euid, uid)) //交换这两个id  
perror("setreuid");
printf("after setreuid uid :%u/n",getuid());
printf("afer sertreuid euid :%u/n",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角色执行命令了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-354149-1-1.html 上篇帖子: PHP之Memcached和ttserver 下篇帖子: php http_build_query
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表