当前位置:首页 > 电脑常识 > 正文

风行开源电子邮件措施Roundcube v1.2.2命令执行缝隙分析 8090安适门户

11-22 电脑常识

简介
Roundcube是一款被广泛使用的开源的电子邮件措施,在全球范畴内有很多组织和公司都在使用。在过去的1年里,仅SourceForge上的镜像文件被下载次数就赶过26万,这还仅仅是实际使用群体中的一小部分。在处事器上告成安置Roundcube之后,它会供给给用户一个web接口,通过验证的用户就可以通过Web浏览器收发电子邮件。
在本文中,我们将看到打击者是如何仅仅通过Roundcube1.2.2(>=1.0)写封邮件,就能对底层系统实现任意命令执行。这是个高危缝隙,由于使用默认安置方法的Roundcube都受影响,所以我们强烈建议使用Roundcube的打点员尽快更新到1.2.3版本。

RIPS(一款自动化PHP代码静态分析工具)花了25秒的时间完整分析了整个应用措施,检测出了以上图表所展示的安适缝隙。虽然图表中列举了很多问题,但是大部分都不太严重,因为它们属于安置模块的一部分或者是遗留代码。不过,我们还是建议修补这些缝隙,以及将遗留代码删除,防备这些代码被不安适的使用或与其他安适缝隙形成组合缝隙。
以上分析功效可以在我们的RIPS demo中看到。注意,我们在分析功效中仅展示了本文所述缝隙
缝隙操作条件
Roundcube必需配置成使用PHP的mail()函数(如果没有指定SMTP,则是默认开启)
PHP的mail()函数配置使用sendmail(默认开启)
封锁PHP配置文件中的safe_mode(默认开启)
打击者必需知道或者猜出网站根目录的绝对路径
以上条件都很容易达成,反过来说也就意味着网络中存在该缝隙的系统有很多。
缝隙描述
在Roundcube1.2.2或者更早的版本里,用户的输入未颠末滤就被传到了PHP内建函数mail()的第五个参数,这已被证明是有很高安适危害的。问题的根柢在于mail()函数的挪用会导致PHP挪用sendmail措施。该参数允许被传入其他参数,以配置sendmail。同时sendmail还供给了-X选项将邮件通信数据记录到一个文件,打击者可以操作此选项在网站根目录下创建一个恶意PHP文件,以下代码可触发缝隙。

program/steps/mail/sendmail.inc $from = rcube_utils::get_input_value(’_from’, rcube_utils::INPUT_POST, true, $message_charset); ⋮ $sent = $RCMAIL->deliver_message($MAIL_MIME, $from, $mailto,$smtp_error, $mailbody_file, $smtp_opts);

在以上代码中,获取到POST参数_from的值,然后传入到deliver_message()要领中作为第二个参数$from挪用。

program/lib/Roundcube/rcube.php public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null) { ⋮ if (filter_var(ini_get(‘safe_mode’), FILTER_VALIDATE_BOOLEAN)) $sent = mail($to, $subject, $msg_body, $header_str); else $sent = mail($to, $subject, $msg_body, $header_str, “-f$from”);

然后该要领将$from参数通报到mail()函数中。目的是将自界说的from头通过-f选项通报给sendmail措施。
过滤不严
有趣的事,似乎from参数已被正则表达式过滤。一般而言,$from参数中不能有空格,这也使得-f选项后面不能附加其他参数。使用类似$IFS的空格常量或是注入新的shell命令`都弗成功。然而,应用中存在一个会导致过滤掉效逻辑缺陷。

program/steps/mail/sendmail.inc else if ($from_string = rcmail_email_input_format($from)) { if (preg_match(‘/(\S+@\S+)/‘, $from_string, $m)) $from = trim($m1, ‘‘); else $from = null; }

在105 行,从用户控制的$from变量(不包罗空格)里提取出一封邮件。不过只有当rcmail_email_input_format()返回TRUE时才华告成提取。接下来,我们就好好分析下这个函数。

program/steps/mail/sendmail.inc function rcmail_email_input_format($mailto, $count=false, $check=true) { global $RCMAIL, $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT; // simplified email regexp, supporting quoted local part $email_regexp = ‘(\S+|(”[^“]+”))@\S+‘; ⋮ // replace new lines and strip ending ‘, ‘, make address input more valid $mailto = trim(preg_replace($regexp, $replace, $mailto)); $items = rcube_utils::explode_quoted_string($delim, $mailto); $result = array(); foreach ($items as $item) { $item = trim($item); // address in brackets without name (do nothing) if (preg_match(‘/^$/’, $item)) { $item = rcube_utils::idn_to_ascii(trim($item, ‘‘)); $result[] = $item; }

分页阅读: 1 2

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/13328.html

博客主人杰米WWW
杰米博客,为大家提供seo以及it方面技巧喜欢的朋友收藏哦!
  • 11365文章总数
  • 1378074访问次数
  • 建站天数
  •