免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7106 | 回复: 6

PHP 执行root 命令 [原创] [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-07-02 22:05 |显示全部楼层
在玩C 以前 玩过一段时间的PHP, 哪个时候需要用PHP 来运行root命令,一直未果,直到有一天搜索到了super这个插件.

随着玩C的日子多了.发现可以用C语言来包裹 要运行的外部命令. 实验了一下.成功了.

不需要任何外部工具就可以实现用PHP 执行root命令.

我下面就把方法发布给大家,有需求用php来运行root命令的朋友可以不用发愁了.

平台:Linux. 实验命令iptables  当前的目录是/var/www/html/http
写程序的时候 用root用户

大家都知道iptables 非root用户不能运行.

首先写个C程序

命名为:ipt.c



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>

  5. int main()
  6. {
  7.     uid_t uid ,euid;

  8.     uid = getuid() ;
  9.     euid = geteuid();

  10.     printf("my uid :%u\n",getuid());  //这里显示的是当前的uid 可以注释掉.
  11.     printf("my euid :%u\n",geteuid()); //这里显示的是当前的euid
  12.     if(setreuid(euid, uid))  //交换这两个id
  13.         perror("setreuid");
  14.     printf("after setreuid uid :%u\n",getuid());
  15.     printf("afer sertreuid euid :%u\n",geteuid());

  16.     system("/sbin/iptables -L"); //执行iptables -L命令
  17.     return 0;
  18. }
复制代码



编译该文件 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页面调用它.


  1. <?php
  2. echo '<pre>';

  3. $last_line = system('/var/www/html/http/ipt', $retval);

  4. echo '
  5. </pre>
  6. <hr />Last line of the output: ' . $last_line . '
  7. <hr />Return value: ' . $retval;
  8. ?>
复制代码


在浏览器中浏览.


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         

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的uid 为48. 调用setreuid后 将有效用户id 和实际用户id互换了.(必须在chmod u+s生效的情况下) 使apache当前的 uid为0 这样就能执行root命令了。


大家只需要更改 C文件中的 system所要执行的命令就可以实现自己的PHP执行root命令了.

[ 本帖最后由 mq110 于 2006-7-21 07:36 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-07-02 22:24 |显示全部楼层
刚才翻了翻以前的帖子,发现有人用sudo 命令来解决.
不过需要在php文件里暴漏root的密码,感觉不够安全.

论坛徽章:
0
发表于 2006-07-03 03:16 |显示全部楼层
这个方法不错,可以写成通用"代理"程序,就可以用APACHE来执行任意ROOT权限的命令了.C与PHP之间的命令传递可通过base64之类的编码来避免关键字冲突.

论坛徽章:
0
发表于 2006-07-03 09:06 |显示全部楼层
哈哈,
我以前用PERL的时候,用过这种方法,确实不错,为了安全着想,可以限制只在这个命令里面执行iptables

看看偶以前写的:

默认情况下,用PERL写的CGI,是不可以调用某些系统管理命令的,比如iptables,近日开发一网关,要求Perl调用iptables实现网络配置,本来打算用SuidPerl实现Perl调用iptables的,但发现那网关系统上没有SuidPerl,而且不带编译器,无法编辑同版本的Suidperl。

最后想一办法,用C写程序,把C程序设成suid程序,把ipables命令做为这个C程序的参数调用,成功的解决了这一问题。

C程序大概如下:

#include <string.h>

...(ipaddr,admin.net(at)163.com)

int main(int argv,char * argc[])

{

.....

return (system(argc[1]));

}

gcc syscommand.c
chmod a+x syscommand
chmod a+s syscommand
chown root.root syscommand
mv syscommand /sbin/

Perl里面这样调用iptables:

system("/sbin/syscommand 'iptables -L'");

以上思路经测试成功,一直漂原创,转载请注明

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-07-03 12:03 |显示全部楼层
原帖由 crazysoul 于 2006-7-3 03:16 发表
这个方法不错,可以写成通用"代理"程序,就可以用APACHE来执行任意ROOT权限的命令了.C与PHP之间的命令传递可通过base64之类的编码来避免关键字冲突.


这样到是可以.

可以给C程序传命令行参数,处理 argv就行了.

只是不够安全.

再提一点:
C程序里可以进行一步 euid检查,如果euid是48则可以交换.保证其他普通用户 非apache用户 使用该程序.

论坛徽章:
0
发表于 2006-07-04 09:20 |显示全部楼层
多谢。

论坛徽章:
0
发表于 2006-07-21 18:34 |显示全部楼层
原帖由 mq110 于 2006-7-2 22:24 发表
刚才翻了翻以前的帖子,发现有人用sudo 命令来解决.
不过需要在php文件里暴漏root的密码,感觉不够安全.

呵呵,其实php也可以不在本文件中暴露root密码的,调用一个加密文件来root进入就可以了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP