Temukan skrip php yang mengirim surat

9

Apakah ada cara bagi saya untuk menemukan skrip php yang mengirim email.

Saya memiliki apache + php (tanpa mod_suphp maupun suexec) dalam instalasi "standar", dan saya ingin mengetahui skrip php penyihir mengirim email, ketika saya memeriksa log saya hanya melihat pengguna yang mengirim email (dalam apache kasus saya) tetapi saya ingin mengetahui skrip yang berasal dari email.

Apakah mungkin atau saya harus menginstal suexec atau mod_suphp untuk menyimpannya?

Terima kasih atas bantuannya.

adam
sumber

Jawaban:

9

php 5.3 ditempatkan untuk mendapatkan penelusuran surat yang lebih baik, tetapi saya tidak yakin apakah itu terjadi. (sunting: ya, php 5.3 telah login sekarang - php.ini memiliki variabel config mail.log yang akan mencatat penggunaan email dari kode php.)

Kami memecahkan masalah dengan membuat sendmail skrip shell pembungkus.

Di php.ini atur mailer baru. Misalnya:

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

Skrip sendmail-php hanya menggunakan logger untuk mendapatkan info, dan kemudian memanggil sendmail sistem:

#!/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 $*

Ini akan masuk ke apa pun mail.info Anda diatur ke dalam file syslog.conf.

Saran lain adalah menginstal ekstensi php suhosin untuk memperketat celah dalam PHP, kecuali jika Anda menjalankan Debian atau Ubuntu di mana ini sudah menjadi default.

labradort
sumber
php 4.x di sini (punya beberapa aplikasi lama yang tidak bisa porting ke php 5.x)
adam
Tidak masalah, pembungkus ini akan melakukan trik. Ini eksternal untuk php. Saya menyebutkan php 5.3 hanya karena kekurangan fitur logging ini dijadwalkan untuk diperbaiki saat itu. Wrapper berfungsi dengan sangat baik dan kami dapat menentukan skrip yang cacat oleh pengguna yang mengizinkan spam.
labradort
Terima kasih, saya kira saya akan mengambil pendekatan Anda. terima kasih
adam
1
Hai, jangan sekarang mengapa tetapi "script = $ {SCRIPT_NAME}, nama file = $ {SCRIPT_FILENAME}" tidak mengembalikan apa pun lihat: 7 20:24:08 logger gateway: sendmail-php: client =, filename =, pwd = / var / www / html / mail, uid = 48, user = apache
adam
Apakah Anda yakin itu diatur dengan benar? Jika itu tidak dikenal sebagai variabel yang telah ditentukan di lingkungan PHP Anda, Anda harus melihat juga: "script =," di output log. Periksa apa yang Anda atur lagi dengan sangat hati-hati. Anda dapat mencoba: $ _SERVER ['SCRIPT_FILENAME'] Anda mungkin dapat mencari lebih banyak variabel untuk masuk dari dokumentasi PHP pada variabel yang telah ditentukan
labradort
4

Solusi untuk ini sebenarnya membutuhkan beberapa langkah. solusi labradort di atas tidak benar-benar berfungsi karena skrip logger adalah skrip bash, bukan php, dan skrip bash tidak memiliki akses ke variabel php, sehingga log keluar kosong. Pada dasarnya apa pun yang Anda ingin log perlu disimpan ke variabel lingkungan di php sebelum mengirim email sehingga logger memiliki akses ke data. Karena Anda mencoba mendeteksi skrip pengguna lain, belum tentu skrip Anda, Anda tidak memiliki kendali atas kode php, jadi Anda perlu menggunakan fitur auto_prepend_file PHP untuk memastikan bahwa semua php yang dieksekusi menjalankan kode inisialisasi Anda sebelum yang lainnya. Saya menambahkan kode berikut melalui php.ini untuk memastikan saya memiliki data yang saya butuhkan di logger:

<?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");
?>

Saya mengumpulkan tutorial lengkap tentang cara membuatnya bekerja di sini: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/

Tom McQuarrie
sumber
Script wrapper berhasil pada implementasi PHP default Redhat dan Debian Linux ketika php 5.2 dan sebelumnya. Saya hanya menggunakan mail.log = /var/log/apache-mail.log hari ini dan ia melakukan apa yang saya butuhkan.
labradort
1
Inilah tepatnya bagaimana bug shellshock dieksploitasi. Saya benar-benar tidak merekomendasikan melakukan hal-hal seperti ini.
Ben Hitchcock
Anda benar juga. Anda tentu saja dapat menjalankan variabel melalui fungsi sanitasi untuk menghapus apa pun yang berbahaya, seperti "() {:;};". Sebenarnya mungkin ide yang baik untuk awalan nama variabel juga, dengan sesuatu seperti "PHP_", kalau-kalau ada bentrokan nama variabel lingkungan.
Tom McQuarrie
2

Ada tambalan untuk PHP yang akan menunjukkan skrip mana yang menghasilkan surel dengan menambahkan tajuk ke surel yang dikirim. Saya belum mengujinya karena saya tidak tertarik menambal PHP inti, tapi saya sudah mendengar hal-hal baik.

Dimana saja
sumber
1
Ini kedengarannya seperti cara yang bagus untuk melangkah. +1. Namun, jika Anda mengelola host bersama dengan banyak klien, Anda mungkin ingin memberi tahu klien tersebut tentang header, atau mengarahkan output ke file log.
Pekka
Ya mungkin itu cara untuk pergi tetapi pada titik tertentu saya menjadi masalah keamanan, semua orang akan sekarang skrip apa yang mengirim email, skrip yang dibuat dengan buruk hanya mengundang untuk diretas. Redirect ke log mungkin lebih baik
adam
Skrip yang dibuat dengan buruk seharusnya tidak ada di server, orang akan menemukannya jika ada (terutama jika mereka adalah bagian dari sistem cms yang populer). Tapi saya mengerti maksud Anda bahwa mungkin ada kasus yang menentang solusi ini.
WheresAlice
0

Anda harus memeriksa log akses untuk sesuatu yang sesuai dengan jangka waktu kapan pesan ditambahkan ke spool.

Richard Garts
sumber
Terima kasih untuk replay, masalahnya adalah hosting bersama dan untuk setiap domain log akses khusus.
adam
Ya, sayangnya Anda harus melihat semuanya.
Richard Garts
0

Mungkin hanya mencari melalui file sumber untuk "mail (" substring?

Dmitry Trukhanov
sumber
Itu kadang-kadang layak untuk dilihat, dan khususnya melihat kode sumber yang mengelilinginya untuk kerentanan bagi spammer untuk digunakan. Tetapi dengan banyak skrip php rumit yang dimiliki oleh banyak orang di host bersama, itu bukan solusi untuk masalah ini.
WheresAlice
Dalam lingkungan hosting bersama, ini mungkin bukan pin-point skrip yang tepat atau dapat mengakibatkan banyak kesalahan positif
Eric Kigathi
0

Cukup aktifkan ini di php.ini Anda

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

lalu buat file itu dan berikan izin menulis. Awasi itu setelah itu.

Kevin Nguyen
sumber