Un paio di parole sulla sicurezza degli script CGI

Le form e l' autorizzazione degli script CGI sono probabilmente il piu' importante rischio per un server web. Infatti gli script CGI sono programmi che GIRANO sul tuo server. Il problema e': quando la CGI accetta l' input di un utente, e lo script non controlla le informazioni ricevute, beh, quelle informazioni potrebbero trasformarsi in pericolosi COMANDI, ed il server li eseguira! Percio' attenzione ai CGI liberamente disponibili sulla rete. Prima di installare un nuovo script CGI che non conosci, dovresti controllarlo. Ricorda queste regole:
  1. Controlla l' input degli utenti
  2. Non installare script CGI troppo voluminosi
  3. Evita assolutamente i programmi generati automaticamente
  4. Evita le chiamate alla shell Unix

Ma vediamo che tipo di rischi si corrono in seguito di attacchi di utenti malintenzionati:

  1. Sendmail e Perl
  2. Chiamate alla shell Unix

Sendmail e Perl

Ok, supponi di voler sviluppare un servizio basato su script CGI, con il quale gli utenti possono accedere ad un database ed effettuare delle ricerche per poi ricevere i risultati via email (ad esempio i nuovi libri arrivati nella tua libreria e disponibili per consultazioni). Al fine di raggiungere questo scopo devi costruire questo comando:

sendmail -t utente@indirizzo.com </.nuoviarrivi

Il comando qui sopra invia il file 'nuoviarrivi' all' indirizzo email dell' utente specificato (per esempio 'utente@indirizzo.com'). Cosi' costruisci una form con un campo di input dove l' utente puo' specificare il suo indirizzo. Bene, il problema e': se il tuo script non controlla l' input degli utenti, un utente malintenzionato potrebbe compilare la tua form in questo modo:

utente@indirizzo.com </etc/passwd;

Cosa e' successo? Bene, prima di tutto devi sapere una cosa: il file passwd e' il file piu' ambito ed agognato per gli utenti malintenzionati, infatti contiene tutti gli userid e le password...di tutti gli utenti che hanno un account sull' host dove gira il server...Percio' cosa e' successo? E' semplice: l' utente malintenzionato sta chiedendo al tuo server: 'per favore, invia il file delle password al mio indirizzo...grazie...'. ma come e' possibile? Il tuo script invia solamente della posta agli indirizzi specificati...Certo, ma il tuo script 'legge' l' input dell' utente e lo considera un indirizzo email. L' interprete Perl sa che ';' significa la fine di un comando, cosi capisce che deve eseguire 2 comandi. Il comando originario diventa:

sendmail -t utente@indirizzo.com </etc/passwd; </.nuoviarrivi

E l' interprete Perl eseguira':

  1. sendmail -t utente@indirizzo.com </etc/passwd
  2. </.nuoviarrivi

Ovviamente il secondo comando produrra' un errore, ma il primo verra' eseguito!

Chiamate alla shell Unix

L' interprete Perl o anche il linguaggio C, hanno delle funzioni che consentono di effettuare delle chiamate di sistema. In altre parole il tuo script potrebbe eseguire qualsiasi comando tramite alcune funzioni particolari, come system(), popen() od eval(). Usa la funzione Perl exec invece di system().

Come posso evitare questi problemi?

Controlla l' input degli utenti. Dovresti ammettere solo cifre e lettere e piazzare un bel '\' prima di qualsiasi carattere 'strano'. Per esempio: il simbolo '<' permette la redirezione dell' output, percio' in un sistema Unix e' un carattere speciale. Comunque se inserisci un '\' prima, diventa il comune simbolo minore (cioe', significa 'minore di'). Evita le funzioni 'eval', 'popen()' e 'system()'. Non permettere le chiamate alla shell Unix. Non installare script CGI troppo voluminosi (specie se sconosciuti. Infatti maggiori sono le dimensioni di un programma maggiore e' il numero di 'bug' contenuti al suo interno). Non installare assolutamente script CGI sconosciuti (controllali prima). Evita assolutamente la generazione automatica di programmi (come puoi controllare qualcosa che non esiste ancora?).

<<<indietro Home CGI avanti >>>

Copyright © 1998-99 M. Silvestri