Individuare gli script PHP che inviano SPAM: differenze tra le versioni
Riga 97: | Riga 97: | ||
<pre> | <pre> | ||
# /etc/init.d/apache2 restart | # /etc/init.d/apache2 restart | ||
</pre> | |||
== Test della configurazione == | |||
Per verificare che tutto funzioni correttamente, creiamo un file di test nella root di Apache: | |||
<pre> | |||
# nano /var/www/testphpmail.php | |||
</pre> | |||
di contenuto: | |||
<pre> | |||
<?php | |||
mail('yourname@yourdomain.com','This is a test message subject','This is a test message body'); | |||
echo 'Mail sent.'; | |||
?> | |||
</pre> | |||
Richiamiamolo in un browser: | |||
<pre> | |||
http://ip.del.nostro.server/testphpmail.php | |||
</pre> | |||
e verifichiamo nei log che l'invio sia stato tracciato correttamente: | |||
<pre> | |||
</pre> | </pre> |
Versione delle 08:07, 12 mar 2014
Introduzione
Quando un sito in PHP viene viene utilizzato per inviare tonnellate di email di SPAM tramite una qualche vulnerabilità nel codice, la prima cosa che si deve affrontare, oltre alla pulizia della coda di postfix, è l’individuazione dello script PHP responsabile.
Le cose si fanno più difficili quando sul nostro server sono presenti decine di Virtual Host, poichè il file colpevole dell’invio di spam diventa difficilmente identificabile.
Possiamo però modificare il comportamento di default di PHP per l'invio di email, istruendolo a tenere traccia di tutti gli invii effettuati in un file di log, che potremo poi consultare alla ricerca dello script colpevole.
Configurazione di PHP
Creiamo un nuovo file contenente le istruzioni personalizzate:
# nano /usr/local/bin/sendmail-php
con contenuto:
#!/usr/bin/php <?php /** Script per tracciare in un log tutti gli script che fanno uso della funzione PHP mail(). Author: Till Brehm, www.ispconfig.org (Hopefully) secured by David Goodwin <david @ _palepurple_.co.uk> Test e implementazione: Ferdinando Bassi per Debianizzati.org */ $sendmail_bin = '/usr/sbin/sendmail'; $logfile = '/var/log/mail_php.log'; //* Get the email content $logline = ''; $pointer = fopen('php://stdin', 'r'); while ($line = fgets($pointer)) { if(preg_match('/^to:/i', $line) || preg_match('/^from:/i', $line)) { $logline .= trim($line).' '; } $mail .= $line; } //* compose the sendmail command $command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_bin.' -t -i'; for ($i = 1; $i < $_SERVER['argc']; $i++) { $command .= escapeshellarg($_SERVER['argv'][$i]).' '; } //* Write the log file_put_contents($logfile, date('Y-m-d H:i:s') . ' ' . $_ENV['PWD'] . ' ' . $logline, FILE_APPEND); //* Execute the command return shell_exec($command); ?>
Rendiamo eseguibile lo script appena creato:
# chmod +x /usr/local/bin/sendmail-php
Creiamo il file di log e rendiamolo scrivibile:
# touch /var/log/mail_php.log # chmod 770 /var/log/mail_php.log
Ora istruiamo PHP a fare uso del nuovo script:
# nano /etc/php5/apache2/php.ini
modificando le istruzioni:
[mail function] ; For Win32 only. SMTP = localhost smtp_port = 25 ; For Win32 only. ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ;sendmail_path =
in
[mail function] ; For Win32 only. ;SMTP = localhost ;smtp_port = 25 ; For Win32 only. ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). sendmail_path = /usr/local/bin/sendmail-php
Se usate PHP come CGI, con SUPHP o FCGI, modificate alla stessa maniera anche il file /etc/php5/cgi/php.ini.
Riavviamo Apache per fargli digerire le modifiche:
# /etc/init.d/apache2 restart
Test della configurazione
Per verificare che tutto funzioni correttamente, creiamo un file di test nella root di Apache:
# nano /var/www/testphpmail.php
di contenuto:
<?php mail('yourname@yourdomain.com','This is a test message subject','This is a test message body'); echo 'Mail sent.'; ?>
Richiamiamolo in un browser:
http://ip.del.nostro.server/testphpmail.php
e verifichiamo nei log che l'invio sia stato tracciato correttamente: