在进行项目的时候遇到一个问题,通过网页来重启服务器 。即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角色执行命令了。
分享到:
相关推荐
需要注意的是,在实际操作中,出于安全考虑,给程序设置SUID权限是一项风险很高的操作,它可能被滥用来获取root权限,导致系统安全受到威胁。因此,在使用该方法时,应当确保代码的安全性,并尽量在可控制的范围内...
在MySQL环境中,通常指的是非root用户通过某种手段获取root级别的权限。本文将详细介绍几种在MySQL环境下利用root权限进行提权的方法。 #### 方法一:利用PHP脚本创建WebShell **步骤1**:首先,创建一个临时...
Root权限类似于Windows系统的管理员权限,让用户能够访问和修改系统级别的文件。通过Root,用户可以卸载预装应用、调整系统设置、安装自定义固件(如 CyanogenMod)以及实现更多高级功能。然而,这同时也带来了安全...
酷派7020获取roo权限操作方法 1、工具放在c:\根目录下; 2、工具文件夹名称为root; 准备工作: 下载附件,右键,解压,修改名称为root。拷贝root文件夹至c:\ 开始root: 01、开始菜单,运行,输入cmd,回车。输入...
本文将详细介绍酷派5910手机的刷机流程以及如何获取Root权限。 #### 二、准备工作 在开始刷机之前,请确保您的手机电量充足,并备份好重要数据。刷机存在一定的风险,可能会导致数据丢失甚至无法开机,请谨慎操作...
6. **搜索功能**:用户可以通过关键词搜索历史发布的新闻,提高信息获取效率。 7. **模板定制**:新闻页面可能有预设的样式模板,用户可以根据需求选择或自定义界面风格。 8. **统计分析**:系统可能会记录新闻的...
这篇文档将详细解析一个用于获取Linux服务器硬件配置信息的shell脚本,包括CPU、内存、硬盘、PCI Express(PCIe)设备、主板以及系统制造商等关键信息。 首先,让我们逐个分析脚本中的主要命令及其用途: 1. **`...
查看拥有root权限的命令文件,发现nmap命令,因为在早期的nmap中内置root终端,可以利用其进行提权。查看nmap版本,进行提权,发现key3文件,并获取key3。 本文提供了一个完整的渗透测试流程,从网络扫描到shell...
3. **权限控制**:PHPDisk提供了细致的权限管理机制,用户可以设置不同文件或文件夹的访问权限,如公开、私有、密码访问等,确保数据的安全性。 4. **统计分析**:系统能够记录并分析用户的上传下载行为,提供详细...
这个话题的核心是通过PHP脚本利用系统中的漏洞或不当配置,以提升非特权用户到root权限的过程,这通常被称为提权攻击。下面我们将详细探讨这个主题。 首先,"su"是Unix/Linux系统中的一个命令,全称为"switch user...
按照安装向导进行安装,并在配置阶段选择适当的服务器类型(如开发服务器或生产服务器),设置root用户的密码,以及数据文件的位置。 在安装完成后,我们需要创建一个数据库并配置连接。在MySQL命令行客户端中,...
使用`wget`命令从MySQL官网获取最新版本的源码包,这里是MySQL 5.1.31。 ```bash [root@localhost ~]# wget ...
4. **错误日志**: 当遇到问题时,查看PHP和MySQL的日志文件(`php_error.log`和`error.log`)以获取详细错误信息,这将帮助定位问题。 通过以上步骤,你应该能在Windows XP上成功搭建一个IIS、PHP、MySQL和...
在实际生产环境中,还需要考虑更多的安全因素,如限制Nginx和PHP-FPM的权限,设置防火墙规则,以及定期更新软件以获取安全补丁。此外,根据服务器性能调整Nginx和PHP的配置参数也是优化服务的关键。 总之,通过本次...
你可以访问MySQL的官方网站或者镜像站点获取最新的稳定版本。例如,下载到`/opt/software`目录下的`mysql-4.0.16.tar.gz`。 2. 解压缩源代码包: ``` [root@linuxsir01 root]# cd /opt/software [root@linuxsir...
在Windows Server 2012环境下安装MySQL 5.7.17.0,首先需要下载MySQL的安装程序,通常可以从MySQL官网或其他可靠的资源站点获取。根据提供的部分内容,本文将详细介绍安装过程中的关键步骤。 ##### 安装及配置 1. ...