四、为什么没有精确处理mail()函数的第5个参数会激发安然问题
一、媒介
在我们发掘PHP应用法度榜样马脚的过程中,我们向有名的Webmail办事供给商Roundcube提交了一个长途敕令履行马脚(CVE-2016-9920)。该马脚许可进击者经由过程应用Roundcube接口发送一个精心构造的电子邮件大年夜而在目标体系上履行随便率性敕令。在我们向厂商提交马脚,宣布了相干的马脚分析文┞仿后,因为PHP内联函数mail()导致的瞎迤婀鄄问题在其他的PHP应用法度榜样中陆续曝出。在这篇文┞仿中,我们将分析一下这些马脚的合营点,那些安然补丁仍然存在问题,以及若何安然的应用mail()函数。
二、浅析PHP的mail()函数
PHP自带了一个内联函数mail()用于在PHP应用法度榜样中发送电子邮件。开辟者可以经由过程应用以下五个参数来设备邮件发送。
http://php.net/manual/en/function.mail.php

- bool mail(
- string $to,
- string $subject,
- string $message [,
- string $additional_headers [,
- string $additional_parameters ]]
- )
这个函数的前三个参数这里就不细说了,因为这些参数一般情况下不会受到注入进击的影响。然则,值得存眷的一点是,如不雅$to参数由用户控制控制的话,那么其可以向随便率性电子邮件地址发送垃圾邮件。
三、邮件头注入
- system(escapeshellcmd("./program -param1 ". escapeshellarg( $_GET['arg'] )));
在这篇文┞仿中我们重点分析后两个参数。第四个参数$additional_headers的重要功能是规定额外电子邮件报头。比如From、Reply-To、Cc以及Bcc。因为邮件报头由CRLF换行符\r\n分隔。当用户输入可以控制第四个参数,进击者可以应用这些字符(\r\n)来增长其他的邮件报头。这种进击方法称为电子邮件头注入(或短电子邮件注入)。这种进击可以经由过程向邮件头注入CC:或BCC:字段造成发送多封垃圾邮件。值得留意的是,某些邮件法度榜样会主动将\n调换为\r\n。
为了在PHP中应用mail()函数,必须设备一个电子邮件法度榜样或办事器。在php.ini设备文件中可以应用以下两个选项:
- 设备PHP连接的SMTP办事器的主机名和端口
- 设备PHP用作邮件传输代劳(MTA)的邮件法度榜样文件路径
当PHP设备了第二个选项时,调用mail()函数的将导致履行设备的MTA(邮件传输代劳)法度榜样。尽管PHP内部可声调用escapeshellcmd()函数防止恶意用户注入其他的shell敕令,mail()函数的第5个参数$additional_parameters许可向MTA(邮件传输代劳)中添加新的法度榜样参数。是以,进击者可以在一些MTA中附加法度榜样标记,启用创建一个用户可控内容的文件。
1. 马脚演示代码
- mail("myfriend@example.com", "subject", "message", "", "-f" . $_GET['from']);
在上述代码中存在一个长途敕令履行马脚,这个问题轻易被没有安然意识的开辟人员忽视。GET参数完全由用户控制,进击者可以应用该处输入向邮件法度榜样传递其他额外的参数。举例来说,在发送邮件的过程中可以应用-O参数来设备发送邮件的选项,应用-X参数可以指定日记文件的地位。
2. 概念性验证(PoC)
- example@example.com -OQueueDirectory=/tmp -X/var/www/html/rce.php
这个PoC的功能是在Web目次中生成一个PHP webshell。该文件(rce.php)包含受到PHP代码污染的日记信息。是以,当拜访rce.php文件时,进击者可以或许在Web办事器上履行随便率性PHP代码。读者可以在我们的宣布的文┞仿和这里找到更多关于若何应用这个马脚的相干信息。
五、最新相干的安然马脚

对应参考链接:CVE-2016-9920、Discussion、CVE-2016-10033、CVE-2016-10034、CVE-2016-10074、CVE-2017-7692
因为一些广泛应用的Web应用法度榜样(如Wordpress,Joomla和Drupal)部分模块基于以上库开辟,所以也会受到该类马脚的影响。
五、为什么escapeshellarg()函数没有那么安然?
当开辟人员应用该函数验证电子邮件格局作为独一的安然验证办法,此时仍然是可以被进击者应用的:与我们之前的进击方法类似,在PHP法度榜样发送邮件时,我们精心构造的恶意“电子邮件地址”会将将PHP webshell生成在Web办事根目次下。
推荐阅读
一、False Injection起首我们常见的注入11=1 0<1 ''='' 三、END这些都是基于1=1如许的值得比较的通俗注入,下面来说说关于False注入,应用False我们可以绕过一些特定的WAF以及一些将来不肯>>>详细阅读
本文标题:在PHP应用程序开发中不正当使用mail()函数引发的血案
地址:http://www.17bianji.com/lsqh/35046.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示