有什么方法可以帮助我找到发送电子邮件的 php 脚本。
我在“标准”安装中安装了 apache+php(没有 mod_suphp 也没有 suexec),我想找出哪个 php 脚本正在发送电子邮件,当我检查日志时,我只看到发送电子邮件的用户的 uid(在我的情况下是 apache),但我想找出发起电子邮件的脚本。
是否有可能或者我必须安装 suexec 或 mod_suphp 来跟踪这一点?
谢谢你的帮助。
答案1
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 脚本只是使用logger来获取信息,然后调用系统的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,而这已经是默认设置。
答案2
解决这个问题实际上需要几个步骤。上述 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/
答案3
有补丁对于 PHP,它将通过在要发送的电子邮件中添加标题来显示哪个脚本正在生成电子邮件。我没有测试过它,因为我不太热衷于修补核心 PHP,但我听说它很好。
答案4
可能只是在源文件中搜索“mail(”子字符串?