PHP Execute Command Bypass Disable_functions

分析过程是我的男神phith0n 写的。

先简单说一下php调用mail()函数的过程。
看到源码ext/mail.c
236行:

从INI中获得sendmail_path变量。我们看看php.ini里是怎么说明的:

注释中可以看到,send_mail默认值为”sendmail -t -i”.

extra_cmd(用户传入的一些额外参数)存在的时候,调用spprintf将sendmail_path和extra_cmd组合成真正执行的命令行sendmail_cmd 。不存在则直接将sendmail_path赋值给sendmail_cmd 。
如下:

之后执行:

将sendmail_cmd丢给popen执行。
如果系统默认sh是bash,popen就会丢给bash执行。而之前的bash破壳(CVE-2014-6271)漏洞,直接导致我们可以利用mail()函数执行任意命令,绕过disable_functions。

影响版本:php 各版本

修复方法:修复CVE-2014-6271

给出POC(http://www.exploit-db.com/exploits/35146/)如下:

php

PS:啰嗦几句,这个是绕过disable_functions是两个的结合体。如果没有putenv函数可以修改变量,然后以及bash破壳(CVE-2014-6271)任意命令执行漏洞。任意修复了一个都是不行的。比如禁止了putenv函数,或者是Mail函数(这个不是很显示)。修复CVE-2014-6271就从根本上解决了问题。当然,个人感觉最直接的修复的办法就是禁用putenv以及打上内核补丁。

原文链接:,转发请注明来源!

发表评论

要发表评论,您必须先登录