PHP通过bypass disable functions执行体系呼吁的要领汇总
副问题[/!--empirenews.page--]
一、为什么要bypass disable functions为了安详起见,许多运维职员会禁用PHP的一些“伤害”函数,譬喻eval、exec、system等,将其写在php.ini设置文件中,就是我们所说的disable functions了,出格是假造主机运营商,为了彻底断绝同处事器的客户,以及停止呈现大面积的安详题目,在disable functions的配置中也凡是较为严酷。 攻与防是对立的,也是相互增补的,既然有对函数的禁用法子,就会有人想方想法的去打破这层限定,我们只有在把握打破方法以及道理的基本之上,才气更好的去防御这类进攻。 执行体系呼吁凡是是进攻者拿到网站webshell之后想要进一步举措的肯定操纵,如若不能执行体系呼吁,接下来的更深入的进攻将很难继承,以是就有了网站打点者禁用相同exec、system之类函数的征象。然而跟着技能的不绝前进,不绝有新的思绪呈现,纯真的禁用这些函数,某些环境下已经不能阻止进攻者到达执行体系呼吁的目标了,那么进攻者用什么样的方法打破了disable functions呢?我们又奈何防御这样的进攻呢? 二、 Bash裂痕导致的恣意呼吁执行GNU Bash 情形变量长途呼吁执行裂痕(CVE-2014-6271)是GNU Bash 的一个长途代码执行裂痕,在这个CVE的先容中,可以看到这样的描写:“GNU Bash 4.3及之前版本中存在安详裂痕,该裂痕源于措施没有正确处理赏罚情形变量值内的函数界说。长途进攻者可借助特制的情形变量操作该裂痕执行恣意代码。以下产物和模块也许会被操作:OpenSSH sshd中的ForceCommand成果,Apache HTTP Server中的mod_cgi和mod_cgid模块,DHCP客户端等”。现实上,PHP也可以操作这个裂痕做许多工作,乃至有也许直接在80导致长途呼吁执行。关于这个裂痕的具体环境可以查阅CVE-2014-6271的相干资料,此处不再赘述。 下面我们来看一下PHP到底什么处所能用到bash的这个裂痕呢?着实可以用的处所不止一处,这里我们以mail函数作为例子,其他处所同理,可以自行说明。 PHP的mail函数提供了3个必选参数和2个可选参数,这里我们首要看最后一个参数,PHP官方手册上对最后一个参数的声名:
简朴的说就是这个参数可以通过添加附加的呼吁作为发送邮件时辰的设置,好比行使-f参数可以配置邮件发件人等,官方文档在典型Example #3也有所演示,详细可以参考官方文档: http://php.net/manual/zh/function.mail.php 。 在mail函数的源代码mail.c中,我们可以找到如下代码片断: 假如转达了第五个参数(extra_cmd),则用spprintf将sendmail_path和extra_cmd拼接到sendmail_cmd中(个中sendmail_path就是php.ini中的sendmail_path设置项),随后将sendmail_cmd丢给popen执行: 假如体系默认sh是bash,popen会派生bash历程,而我们适才提到的CVE-2014-6271裂痕,直接就导致我们可以操作mail()函数执行恣意呼吁,绕过disable_functions的限定。可是这里着实有一个题目,就是extra_cmd在spprintf之前做了安详搜查,我当前的PHP版本是最新的7.2.4,代码位置在mail.c的第371-375行: php_escape_shell_cmd函数会对非凡字符(包罗`|*?~<>^()[]{}$,x0A and xFF. ‘ 等)举办转义,那这样是不是就没步伐了呢?不是的,我们可以通过putenv函数来配置一个包括自界说函数的情形变量,然后通过mail函数来触发,网上早已有POC。 同样挪用popen派生历程的php函数尚有imap_mail,可能还也许有其他的我们没有发明的函数,以是假如要防御这类进攻,最好的步伐就是从来源上入手,修复CVE-2014-6271这个bash裂痕。 三、LD_PRELOAD:无需bash裂痕上文说到mail函数操作bash破壳裂痕可以实现打破disable functions的限定执行体系呼吁,可是像这样的裂痕,一样平常安详意识稍好一点的运维职员,城市打上补丁了,那么是不是打上补丁之后就必然安详了呢?显然谜底是否认的,LD_PRELOAD是Linux体系的下一个风趣的情形变量: “ 它应承你界说在措施运行前优先加载的动态链接库。这个成果首要就是用来有选择性的载入差异动态链接库中的沟通函数。通过这个情形变量,我们可以在主措施和其动态链接库的中间加载此外动态链接库,乃至包围正常的函数库。一方面,我们可以以此成果来行使本身的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的措施注入措施,从而到达特定的目标。 ” 它应承你界说在措施运行前优先加载的动态链接库,我们只要知道这一件事就足够了,这声名什么?这声名我们险些可以挟制PHP的大部门函数,还拿上文的mail函数作为例子,上文说过,php的mail函数现实上是挪用了体系的sendmail呼吁,那么我们来看一下sendmail都挪用了哪些库函数: 行使readelf -Ws /usr/sbin/sendmail呼吁来查察,我们发明sendmail函数在运行进程动态挪用了许多尺度库函数,我们从中任意选取一个库函数geteuid举办测试。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |