PHP PEAR Mail包任意文件读写漏洞


添加时间:
2009-05-08

系统编号:
WAVDB-01402

影响版本:
PHP PEAR Mail

程序介绍:

PEAR是PHP的官方开源类库, PHP Extension and Application Repository的缩写。PEAR将PHP程序开发过程中常用的功能编写成类库,涵盖了页面呈面、数据库访问、文件操作、数据结构、缓存操作、网络协 议等许多方面,用户可以很方便地使用。它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR就是PHP的cpan。

漏洞分析:

PEAR的Mail包错误地使用escapeShellCmd来过滤传入到sendmail命令的用户参数,用户提交精心构造的参数即可调用sendmail的其他参数,即可在操作系统上读写任意文件。
Sendmail.php

 
  1. ......   
  2. if (!isset($from)) {   
  3. return PEAR::raiseError('No from address given.');   
  4. elseif (strpos($from' ') !== false ||   
  5. strpos($from';') !== false ||   
  6. strpos($from'&') !== false ||   
  7. strpos($from'`') !== false) {   
  8. return PEAR::raiseError('From address specified with dangerous characters.');   
  9. }   
  10.   
  11. $from = escapeShellCmd($from);   
  12. $mail = @popen($this->sendmail_path . (!emptyempty($this->sendmail_args) ? ' ' . $this->sendmail_args : '') . " -f$from -- $recipients"'w');   
  13. if (!$mail) {   
  14. return PEAR::raiseError('Failed to open sendmail [' . $this->sendmail_path . '] for execution.’);   
  15. }   
  16. ……  
可以看到 $from 变量的过滤并不完全,由于escapeShellCmd会将\等字符替换为空,即可绕过对空格的检查,而escapeshellcmd本身并不检查对于参数的调用,所以导致安全漏洞的发生。

漏洞利用:

 
  1. <?php   
  2. ini_set('include_path',ini_get('include_path').':/usr/local/lib/php/PEAR:');   
  3. require_once("Mail.php");   
  4. $from = "From: " . $_REQUEST['email'] . “\r\n”;   
  5. $to = “xxxxxxx@zzzz.com”;   
  6. $subj = “subscription request”;   
  7. $body = “subscribe me”;   
  8. $hdrs = array(   
  9. “To” => $to,   
  10. “Cc” => $cc,   
  11. “Bcc” => $bcc,   
  12. “From” => $from,   
  13. “Subject” => $subject,   
  14. );   
  15. $body=”test”;   
  16. $mail =& Mail::factory(’sendmail’);   
  17. $mail->send($to$hdrs$body);   
  18. ?>  


解决方案:
厂商补丁:
PHP
---
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.php.net

信息来源:
<* 来源:鬼仔'S Blog
连接:http://huaidan.org/archives/3064.html *>