メールを送信するphpスクリプトを見つける


9

メールを送信しているphpスクリプトを見つける方法はありますか?

「標準」インストールにapache + php(mod_suphpもsuexecもありません)があり、witch phpスクリプトがメールを送信していることを確認したいのですが、ログを確認すると、メールを送信しているユーザーのuidが表示されます(私のケースはapache)ですが、電子メールを発信したスクリプトを見つけたいのです。

それの追跡を維持するために可能ですか、それともsuexecまたはmod_suphpをインストールする必要がありますか?

助けてくれてありがとう。

回答:


9

php 5.3は、より良いメール追跡を取得するためにスロット化されましたが、それが起こったかどうかはわかりません。(編集:はい、php 5.3にはロギングが組み込まれています-php.iniには、phpコードからのメールの使用を記録する設定変数mail.logがあります。)

sendmailをラッパーシェルスクリプトにすることで問題を解決しました。

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に移植できない古いアプリがいくつかありました)
adam

問題ありません。このラッパーでうまくいきます。これはphpの外部にあります。ロギング機能のこの欠如がそれまでに修正される予定だったので、私は単にphp 5.3に言及しました。ラッパーは非常にうまく機能し、スパムを許可していたユーザーが欠陥のあるスクリプトを特定することができました。
ラブラドール

ありがとう、私はあなたのアプローチを取るつもりだと思います。ありがとう
アダム

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.net/manual/en/reserved.variables.server.php
labradort

4

これを解決するには、実際にはいくつかの手順が必要です。ロガースクリプトはphpではなくbashスクリプトであり、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 5.2以前のデフォルトのphpのデフォルトに戻っていました。最近は単にmail.log = /var/log/apache-mail.logを使用しているだけで、必要なことを実行できます。
ラブラドール14年

1
これがまさに、シェルショックのバグが悪用される方法です。私は真剣に物事を行うことをお勧めしません。
ベンヒッチコック

あなたはポイントを持っています。"(){:;};"のような有害なものを取り除くために、サニタイズ関数を介して変数を実行することもできます。実際には、環境変数名の衝突がある場合に備えて、変数名にも "PHP_"のようなプレフィックスを付けることをお勧めします。
Tom McQuarrie、2014年

2

送信されるメールにヘッダーを追加することにより、どのスクリプトがメールを生成しているかを示すPHPのパッチがあります。コアPHPにパッチを当てるのが苦手なので、テストはしていませんが、良いことは聞いています。


1
これはすばらしい方法のように思えます。+1。ただし、複数のクライアントで共有ホストを管理している場合は、それらのクライアントにヘッダーを通知するか、代わりに出力をログファイルにリダイレクトすることができます。
Pekka

はい、たぶんそれは進むべき道ですが、ある時点でそれは私のセキュリティ問題です、すべての人々は今、どのスクリプトが電子メールを送信しているのかを知るつもりです。ログにリダイレクトするほうがいいかもしれません
adam

不十分に作成されたスクリプトはそもそもサーバーにあるべきではありません。そこにあれば、人々はそれらを見つけます(特に、人気のあるcmsシステムの一部である場合)。しかし、私はあなたがこの解決策に反対するケースがあるかもしれないというあなたのポイントを得る。
WheresAlice、2010

0

メッセージがスプールに追加されたときのタイムフレームに適合するものについて、アクセスログをgrepする必要があります。


再生のおかげで、問題は、共有ホスティングであり、各ドメインの専用アクセスログであるということです。
アダム

はい、残念ながら、それらすべてをgrepする必要があります。
Richard Salts

0

"mail("サブストリングのソースファイルを検索するだけかもしれません。


これは、時々見る価値があり、特にスパマーが使用する脆弱性について、それを取り巻くソースコードを調べることは価値があります。しかし、多くの複雑なphpスクリプトが共有ホスト上の多くの人々によって所有されているため、これはこの問題の解決策ではありません。
WheresAlice、2010

共有ホスティング環境では、これは正確なスクリプトを正確に示していないか、複数の誤
検知を引き起こす

0

php.iniでこれらを有効にするだけです

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

次にそのファイルを作成し、書き込み権限を付与します。その後、それを見てください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.