ck1987 发表于 2018-12-19 13:35:17

让PHP以ROOT权限执行系统命令的方法

  参考
  首先写个C程序,命名为:run.c 放在目录/scripts/demo/下
  复制代码 代码如下:
  #include
  #include
  #include
  #include
  int main()
  {
  uid_t uid ,euid;
  //char cmd; //变量暂时未使用
  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页面调用它。
  复制代码 代码如下:
  
  在浏览器中浏览。
  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]
查看完整版本: 让PHP以ROOT权限执行系统命令的方法