zen cart的漏洞和它一样流行.但是因特网上还是有N多的站没有升级,即使有补丁发布,那些漏洞依然大门敞开,再好的系统管理员也无用,因为后门总是开着啊.
今天碰到这样的一个问题
在新产生新订单时,magento后台没有发确认信。我直接的反应是不可能啊,因为一直都很正常啊,而且没有修改过代码?仔细一想,还有一个可以肯 定就是昨天有收到一封邮件,一个客户说收到了新订单确认邮件,但是没有进入付款页面。所以这就有茅盾。进一步确认是magento网站的contact us可以发出邮件。
查看mailog发现服务器在发大量的邮件。怀疑服务器让人利用发垃圾邮件,首先想到的是zen cart网站。查看apache的日志,确认发现有对zen cart的tell-a-friend页面的大量访问量。
关闭sendmail
清空
/var/spool/mqueue
/var/spool/clientqueue
将发垃圾邮件的IP从apache的access log中提取,暂时用iptable规则drop掉所来息这几个IP的的请求
启动sendmail
最重要的是如何完全的zen cart的给朋友发邮件推荐产品的功能彻底关闭掉
首先,关闭掉所有产品页面的"tell a friend”按钮
菜单Catalog 子菜单 Product Types 点击 Edit Layout 按钮 在页面中选择 Show Product Tell A Friend Button 这个选项编辑,修改为 false然后单击 update 保存
其次,关闭掉所有的"tell a friend”的sidebox
选项菜单Tools 子菜单 Layout Box Controller,在页面中找到 "sideboxes/tell_a_friend.php",选中所有的off,保存
这其实还不够,知道地址的人还是可以进入到发邮件的页面。所以,要在代码中禁用发邮件的功能。这不可能,因为发邮件的功能还是要用的。那什么办?有两个选项:
1,利用zen cart自带的配置机制,但是在后台是无法做到的,我是在查看代码之后看注释看到的
我用grep -r 'mail(' includes搜索php的mail函数,找到文件 includes/functions/functions_email.php,看到这段代码
...
...
/**
* Send email (text/html) using mime. This is the central mail function.
* If using "PHP" transport method, the SMTP Server or other mail application should be configured correctly in server's php.ini
*
* @param string $to_name The name of the recipient, e.g. "Jim Johanssen"
* @param string $to_email_address The email address of the recipient, e.g. john.smith@hzq.com
* @param string $email_subject The subject of the eMail
* @param string $email_text The text of the email, may contain HTML entities
* @param string $from_email_name The name of the sender, e.g. Shop Administration
* @param string $from_email_adrdess The email address of the sender, e.g. info@myzenshop.com
* @param array $block Array containing values to be inserted into HTML-based email template
* @param string $module The module name of the routine calling zen_mail. Used for HTML template selection and email archiving.
* This is passed to the archive function denoting what module initiated the sending of the email
* @param array $attachments_list Array of attachment names/mime-types to be included (this portion still in testing, and not fully reliable)
**/
function zen_mail($to_name, $to_address, $email_subject, $email_text, $from_email_name, $from_email_address, $block=array(), $module='default', $attachments_list='' )
...
...
// ignore sending emails for any of the following pages
// (The EMAIL_MODULES_TO_SKIP constAnt can be defined in a new file in the "extra_configures" folder)
if (defined('EMAIL_MODULES_TO_SKIP') && in_array($module,explode(",",constant('EMAIL_MODULES_TO_SKIP')))) return false;
// check for injection attempts. If new-line characters found in header fields, simply fail to send the message
foreach(array($from_email_address, $to_address, $from_email_name, $to_name, $email_subject) as $key=>$value) {
if (eregi("/r",$value) || eregi("/n",$value)) return false;
}
...
...
我先是看到$module参数,虽然注释说是为了调用模板之用,但是我想即使zen cart没做,我们自己要修改也应该是要利用这个参数来实现。但是从 (The EMAIL_MODULES_TO_SKIP constant can be defined in a new file in the "extra_configures" folder) 表明,我们只要在extra_configures目录下定义一个EMAIL_MODULES_TO_SKIP这个常量就OK了,我是这样做的:
define('EMAIL_MODULES_TO_SKIP', 'tell_a_friend,tell_a_friend_extra');
不过,在我测试的这个版本中,1.3.8中即使这样设置后,也会提示发送成功,但是其实是没有发送的。
另外一种方法就是禁止对tell_a_friend页面的请求,或者通过mod_rewrite将对这个页面的请求重定向到产品页或首页。