Consigli di programmazione (in)sicura

Stavo facendo un giro su Digg nella sezione sicurezza e mi sono imbattuto in una segnalazione di un articolo sulla programmazione sicura con PHP di Jeff Skrysak.

L’articolo affronta punto per punto le principali problematiche di sicurezza che si presentano al momento della scrittura di una Web Application. Il fatto è che alcuni dei consigli sono sbagliati.

  • Handle errors gracefully
    Place the ampersat symbol (@) in front of many of your PHP function calls. If they fail, the ampersand will stop from from showing that failure in the browser window. This is very useful when making database calls but your database is down, or the SQL statement returns an error. Such messages would only give feedback to intruders, or look unprofessional to regular users.
  • Strip backslashes, HTML, SQL and PHP tags from any form field data
    If someone maliciously tries to send HTML, SQL or PHP code through a text field entry not meant to expect it, they can disrupt or break your code. Use the following PHP functions to strip out such text: strip_tags(), str_replace() and stripslashes().
    Example: $login = @strip_tags($login); Example: $login = @stripslashes($login);
  • Add “LIMIT 1″ to the end of your SQL statements
    That will limit the number of results to just 1. If someone successfully hijacks your site, and is able to run a SQL statement that returns data, or deletes it, placing “LIMIT 1″ at the end of any SQL string will help limit the amount of data they are able to see or damage.
    Example: SELECT * FROM useraccount WHERE Login=’$login’ AND Password=’$encrypted’ LIMIT 1
  • Use $_POST not $_REQUEST
    If your HTML form uses POST to send the data to the login script, then make sure your login script gets the input data using $_POST, and not $_REQUEST. The latter would allow someone to pass data via GET, on the end of the URL string.

Gli errori ritornati dalle funzioni non andrebbero nascosti all’utente tramite “@” ma attraverso le varie funzioni di PHP: in primis set_error_handler() potendo così anche salvare tutti gli errori su un database o su un file. In linea generale il metodo “security through obscurity” non è ottimo, ma nelle Web Application potrebbe aiutare a nascondere ad un attaccante dettagli necessari come la posizione sul file system dei file, la versione del linguaggio usato, il tipo di database utilizzato, ecc…

Le funzioni strip_tags e stripslashes suggerite non sono sufficenti ad evitare l’iniezione di codice Javascript.
Se vi fosse una pagina che riceve dati da un form in questo modo:
//...
$url = striptags(stripslashes($_POST['url']));
echo '<a href="'.$url.'">Url</a>';
//...

passando tramite la variabile “url”, inviata via metodo POST, una stringa uguale a questa è possibile creare un XSS:

" onmouseover=”myJSfunc();

Un metodo più efficace contro l’iniezione di codice JS è questo:
$url = htmlentities(strip_tags($_POST['url']),ENT_QUOTES);
così facendo tutti i tag HTML verranno cancellati e tutti caratteri speciali verranno convertiti nelle rispettive entità HTML. Ovviamente tali funzioni dovrebbero essere sempre usate come ultima spiaggia dopo aver validato la stringa con espressioni regolari o con la nuova funzione filter_input di PHP 5.
Nel caso di dati da inserire in un DataBase ci viene incontro una ottima funzione nativa di PHP: {mysql,mysqli,ps,sqlite}_escape_string. Una ottima contromusira alle SQL Injection la forniscono anche le “prepared statements” disponibili con PHP 5 e Zend Framework.
L’aggiunta dell’istruzione “LIMIT 1″ alla fine di una query non rende immune ad attacchi un’applicazione che non effettua i dovuti controlli sui dati ricevuti. Se vi fosse una pagina che riceve dati da un form in questo modo:
//...
$id = $_POST['id'];
$query = '<SELECT * FROM users WHERE id='.$_POST['id'].' LIMIT 1';
//...

passando tramite la variabile “id”, inviata via metodo POST, una stringa uguale a questa sarebbe possibile creare una SQL Injection bypassando anche la direttiva “LIMIT 1″:

1 OR 1=1; –

Per concludere, l’utilizzo del metodo POST al posto di GET o del più generale REQUEST aiuta certo ad evitare XSS di tipo 1 ma non rende più difficile, ad un attaccante, manipolare i paramentri inviati alla Web Application.

 

Il phishing su Poste Italiane si fa insistente

Dopo le precendeti segnalazioni il phishing su Poste Italiane non si è fermato, anzi si è fatto ancora più insistente.

Di recente è cambiata l’impaginazione delle e-mail, alcune con un italiano alquanto ostentato, altre invece sono state confezionate veramente bene.

Ecco alcune esempi:

From: “Poste Italiane” <account@poste.it>
Reply-To: “Poste Italiane” <account@poste.it>
To: xxxxxx@xxxxxx.xxx
Subject: Autenticazione di cliente richiesta

Caro Poste Italiane cliente ,

Eseguiamo attualmente la manutenzione regolare delle nostre misure di sicurezza. Il suo conto è stato scelto a caso per questa manutenzione, e lei sarà adesso portato attraverso una serie di pagine di verifica di identità.
[...]
Se facciamo no riceve la verifica di conto appropriata entro 24 ore, poi presumeremo che questo conto è fraudolento e sarà sospeso. Lo scopo di questa verifica è assicurare che il suo conto non è stato fraudolentamente usato e combattere la frode dalla nostra comunità.

From: “Poste Italiane” <staff@poste.it>
Subject: Aggiorna i tuoi dati
To: undisclosed-recipients:;

Caro cliente Poste.it,

Una nuova gamma completa di servizi online è adesso disponibile !
Per poter usufruire dei nuovi servizi online di Poste.it occorre prima diventare UTENTE VERIFICATO.

Accedi a Poste.it » Accedi ai servizi online di Poste.it e diventa UTENTE VERIFICATO »

L’Assistenza Clienti, dopo aver ricevuto la documentazione e averne verificato la completezza e la veridicità, provvederà immediatamente ad attivare il suo ” Nome Utente Verificato “. Verrai informato telefonicamente di tale attivazione.

To: xxxxxx@xxxx.xxx
Subject: Aggiorna i tuoi dati
From: “Poste Italiane” <staff@poste.it>

Caro cliente Poste.it ,
Il Servizio Tecnico di Poste Italia sta eseguendo un aggiornamento programmato del software al fine di migliorare la qualita’ dei servizi bancari. Le chiediamo di avviare la procedura di conferma dei dati del Cliente. A questo scopo, La preghiamo di cliccare sul link che trover alla fine di questo messaggio

Accedi a Poste.it Acc! edi ai servizi online di Poste.it e verifichi il suo account
Il sistema automaticamente, dopo aver ricevuto la documentazione e averne verificato la completezza e la veridicit provveder immediatamente ad riattivare il suo account.
Grazie della collaborazione Poste.it

Reply-To: <staff@poste.it>
From: “Poste Italiane” <staff@poste.it>
Subject: Il tuo conto di PostePay sara chiuso oggi
To: undisclosed-recipients:;

Il vostro conto sara chiuso perche non lo avete utilizzato nel mese passato.
Se volete annullare la chiusura, dovete verificare le vostre informazioni di utente

Accedi a Poste.it » Accedi ai servizi online di Poste.it e verifica i tuoi dati per continuare usare i nostri servizi!

Dopo che hai verificato i dati riceverai un email di conferma tra 24 ore.

To: xxxxxxxxx@xxxxxxx.xxx
Subject: Communicazione!
From: Poste Italiane <support@poste.it>
Reply-To:

Gentile Cliente,
Abbiamo ricevuto una segnalazione di accredito di Euro 129 ricevuta il giorno 24/4/2007 da UFFICIO POSTALE 13.55 BRANDIZZO. L’accredito è stato temporaneamente bloccato a causa delle fascie orarie, potrà ora essere verificato e successivamente accreditato sul suo conto postale:

Accedi a Poste.it » Acceda al servizio accrediti di Poste.it e verifichi le sue transazioni »

Seguono alcuni URL utilizzati per ospitare le pagine di phishing (httx e l’underscore dopo il dominio o l’ip sono stati aggiunti per sicurezza):

  • httx://www.larimer.org_/store/red.html
  • httx://71-246.lerstenen.t3.se_/.bancoposta/index.htm
  • httx://web2.sbinet.com_/bancopostaonline.poste.it/poste/bpol/bancoposta/formslogin.htm
  • httx://216.84.195.93_/www.poste.it/online/bancopostaonline.poste.it/formslogin.htm
  • httx://pponline.altervista.org_/priv/bpol/cartepr/index.htm
  • http://www.aquitania.co.uk_/gallery/albums/300d1/www.poste.it/formslogin.htm

Analizzando le intestazioni delle e-mail si capisce come esse siano state inviate tramite script ospitati su account, presumibilmente compromessi, e tramite worm che sfruttano il terminale dell’ignara vittima per connettersi a server smtp esteri.

 

Ancora spam e malware pubblicizzato come Internet Explorer 7

Nelle ultime ore è stata rilevata una nuova variante delle e-mail di spam “Internet Explorer 7.0 Beta”. Tutte quante hanno un link verso un file eseguibile dal nome “update.exe” ospitato su diversi domini.
Per ingannare i filtri anti-spam il testo, inserito nel corpo della mail, è stato racchiuso in tag HTML in modo che ad un loro controllo risultasse una semplice conversazione tra amici e invece all’apertura dell’e-mail con un qualsiasi client di posta venisse visualizzato solamente il link al file eseguibile.

Questi gli header più significativi:

From: <admin@microsoft.com>
To: xxxxx@xxxxxxxxx.xxx
Subject: Internet Explorer 7.0 Beta

Questi i domini, per ora individuati, che ospitano il file eseguibile:

  • httx://accentstaffing.com_/images/update.exe
  • httx://mikelike.cd_/update.exe
  • httx://xoozee.cd_/update.exe
  • httx://merzingo.cd_/update.exe
  • httx://endfriends.cd_/update.exe
  • httx://netdesks.cd_/update.exe
  • httx://pleasedostock.hk_/update.exe
  • httx://wordcasts.cd_/update.exe
  • httx://abyssrecycling.co.uk_/images/update.exe
  • httx://bcweblist.com_/images/update.exe
  • httx://actorsandactresses.co.uk_/images/update.exe

(httx e l’underscore dopo il TLD sono stati inseriti per sicurezza)

Il primo nella lista, almeno nelle e-mail che ho ricevuto io, è stato quello più utilizzato. Fortunatamente già molti dei domini nella lista sono stati ripuliti e il link al file eseguibile restituisce un errore HTTP 404.

Il consiglio è quello di bloccare i domini sopra riportati tramite il proprio gateway o proxy di rete, oppure in maniera più semplice aggiungere, sul proprio server mail, dei pattern per il riconoscimento delle e-mail provenienti da “admin@microsoft.com” con oggetto “Internet Explorer 7.0 Beta”.
Per eventuali aggiornamenti rifarsi alla segnalazione dell’ISC.