查找发送邮件的php脚本


9

有什么办法让我找到发送电子邮件的PHP脚本。

我在“标准”安装中安装了apache + php(没有mod_suphp或suexec),我想找出女巫php脚本正在发送电子邮件,当我检查日志时,我只是看到正在发送电子邮件的用户的uid(在我的案例apache),但我想找出源自电子邮件的脚本。

有可能还是我必须安装suexec或mod_suphp才能保持跟踪?

寻求帮助。

Answers:


9

php 5.3已插入以获得更好的邮件跟踪,但是我不确定是否发生了这种情况。(编辑:是的,现在已内置php 5.3-php.ini具有配置变量mail.log,它将记录来自php代码的邮件使用。)

我们通过使sendmail成为包装Shell脚本解决了该问题。

在php.ini中设置一个新的邮件程序。例如:

sendmail_path = /usr/local/bin/sendmail-php -t -i

sendmail-php脚本仅使用记录器获取信息,然后调用系统的sendmail:

#!/bin/bash

logger -p mail.info -t sendmail-php "site=${HTTP_HOST}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, filename=${SCRIPT_FILENAME}, docroot=${DOCUMENT_ROOT}, pwd=${PWD}, uid=${UID}, user=$(whoami)"

/usr/sbin/sendmail -t -i $*

这将记录到syslog.conf文件中将mail.info设置为的内容。

另一个建议是安装suhosin php扩展名,以加强PHP中的漏洞,除非您正在运行Debian或Ubuntu,而这已是默认设置。


php 4.x在这里(有一些旧应用程序无法移植到php 5.x)
亚当

没问题,这个包装器可以解决问题。它在php外部。我之所以提到php 5.3仅仅是因为缺少日志记录功能,这将在那时解决。包装程序运行良好,我们能够查明用户允许垃圾邮件的有缺陷的脚本。
labradort

ks,我想我会采取你的方法。谢谢
亚当

1
嗨,现在不知道为什么,但是“ script = $ {SCRIPT_NAME},filename = $ {SCRIPT_FILENAME}”没有返回任何内容的原因,请参见:7 20:24:08网关记录器:sendmail-php:client =,filename =,pwd = / var / www / html / mail,uid = 48,user = apache
adam

您确定设置正确吗?如果在PHP环境中作为预定义变量不知道该变量,则应该在日志输出中看到:“ script =,”。再次仔细检查设置。您可以尝试:$ _SERVER ['SCRIPT_FILENAME']您可以在预定义变量的PHP文档中查找更多变量以进行日志记录:php.net/manual/en/reserved.variables.server.php
labradort

4

解决方案实际上需要几个步骤。上面的labradort的解决方案实际上不起作用,因为记录器脚本是bash脚本,而不是php,并且bash脚本无法访问php的变量,因此日志空白。基本上,您要记录的任何内容都需要在发送电子邮件之前保存到php中的环境变量中,以便记录器可以访问数据。由于您试图检测其他用户的脚本(不一定是您自己的脚本),因此无法控制php代码,因此您需要使用PHP的auto_prepend_file功能来确保所有执行的php在执行所有其他操作之前都运行您的初始化代码。我通过php.ini预先添加了以下代码,以确保在记录器中拥有所需的数据:

<?php
/**
 * This passes all SERVER variables to environment variables, 
 * so they can be used by called bash scripts later
 */
foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
?>

我整理了一个完整的教程,介绍如何在这里工作:http : //mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/


包装脚本确实可以在Redhat和Debian Linux的php defaults实现上使用,早在php 5.2和更早版本。这些天我只是在使用mail.log = /var/log/apache-mail.log,它可以满足我的需求。
labradort14年

1
这正是利用Shellshock错误的方式。我严重不建议这样做。
本·希区柯克

你有一定道理。您当然可以通过清理函数运行变量以清除有害内容,例如“(){:;};”。实际上,最好为变量名加上前缀,例如“ PHP_”,以防环境变量名冲突。
2014年

2

一个 PHP 修补程序,它将通过在发送的电子邮件中添加标头来显示哪个脚本在生成电子邮件。由于我不热衷于修补核心PHP,所以我没有进行过测试,但是我听到了很多好消息。


1
听起来这是一个很好的方法。+1。但是,如果要管理具有多个客户端的共享主机,则可能要通知这些客户端有关标头的信息,或者将输出重定向到日志文件中。
Pekka '04

是的,也许这是要走的路,但是在某种程度上,这是我的安全问题,所有人现在都想知道哪个脚本正在发送电子邮件,制作不当的脚本只是在被黑客入侵。重定向到日志可能更好
adam

效果不佳的脚本最初不应该放在服务器上,人们会发现它们是否存在(特别是如果它们是流行的cms系统的一部分)。但是我明白你的观点,也许有反对这种解决方案的情况。
WheresAlice10年

0

您将不得不对访问日志进行grep匹配,以适应将消息添加到后台处理时的时间范围。


对于重放来说,问题在于这是一个共享主机,而对于每个域,则是一个专用的访问日志。
亚当

是的,不幸的是,您将不得不遍历所有这些。
理查德·萨尔斯

0

可能只是在源文件中搜索“ mail(”子字符串?


有时值得一看,尤其是查看围绕它的源代码是否有垃圾邮件发送者可以使用的任何漏洞。但是,由于许多人在共享主机上拥有许多复杂的php脚本,因此这不是解决此问题的方法。
WheresAlice

在共享主机环境中,这可能无法精确定位脚本或可能导致多种误报
Eric Kigathi 2015年

0

只需在您的php.ini中启用它们

mail.add_x_header = On
mail.log = /var/log/phpmail.log

然后创建该文件并授予写许可权。在那之后关注它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.