web20

In questo tutorial verrà presentato un Application-based IDS (Intrusion Detection System), un sistema che protegge le vostre applicazioni web-based da attacchi che possono essere effettuati direttamente da query-string : SQL Injection, XSS (Cross Site Scripting), RFI (Remote File Inclusion), LFI (Local File Inclusion).

L’Intrusion Detection System o IDS è un dispositivo software (avvolte anche hardware ) utilizzato per rilevare tutti gli attacchi alle reti informatiche e ai computer. Questi attacchi includono gli attacchi alle reti informatiche tramite lo sfruttamento di un servizio vulnerabile, attacchi attraverso l’invio di dati malformati e applicazioni malevole, tentativi di accesso agli host tramite innalzamento illecito dei privilegi degli utenti, accessi non autorizzati a computer e file, e i classici programmi malevoli come virus, trojan e worm. Esistono diverse tipologie di IDS, quello che tratteremo, riceve come input i dati che viaggiano attraverso la query-string, monitorando la navigazione degli utenti. Il metodo di rilevamento (detection method) delle intrusioni consiste in un’ analisi basata sull’abuso.  Componente fondamentale di questo tipo di analisi è il database di riferimento (Knowledge base), contenente le caratteristiche di ogni attacco (modello di attacco) riconoscibile.

Tutte le attività monitorate vengono confrontate con i modelli di attacco collezionati nel Database di riferimento e in caso di riscontro si genera un allarme. Le attività che non trovano riscontro con i modelli di attacco disponibili, sono associati ad un uso legittimo del sistema sotto osservazione. I principali svantaggi di tali sistemi sono: generare il database di riferimento e mantenerlo sempre aggiornato è un attività costosa; se il modello di un dato attacco non è presente nel database, allora questo non può essere rilevato. L’unico grande beneficio che invece hanno è quello di generare un numero basso di falsi positivi ( con falso positivo s’intende un attività legittima vista per errore come abuso )

Dopo tutta questa presentazione teorica possiamo passare alla pratica. Ora mostreremo, che con poche righe di codice, è possibile proteggere un applicazione web-based scritta in PHP (PHP based web application), utilizzando la libreria gratuita PHPIDS.

PHPIDS (PHP-Intrusion Detection System) è semplice da usare, ben strutturata e veloce. L’IDS filtra qualsiasi input dannoso, riconoscendo quando un utente malintenzionato, tenta di rompere il vostro sito e reagisce nel modo in cui si desidera. Basato su un insieme di regole, che assegnano ad ogni attacco un voto numerico di “impatto”, rende facile decidere quale tipo di azione dovrebbe seguire il tentativo di hacking. Questo potrebbe andare dal semplice invio di un messaggio di posta al team di sviluppo, al visualizzare un messaggio di avviso per l’attaccante o addirittura terminare la sessione dell’utente.

I passi da seguire per incorporarlo nella vostra applicazione sono i seguenti:

1. Download e posizionamento dei file:
a) E’ possibile scaricare la versione più aggiornata della libreria dal seguente indirizzo http://php-ids.org/downloads/ .

b) Una volta scaricato il contenuto compresso, estraetelo in una locazione qualsiasi del vostro file system. Successivamente cercate nella cartella estratta, la directory “IDS”, contenuta nella sotto-cartella “lib”. Una volta trovata, copiatela nella directory principale della vostra applicazione web.

2. Preparazione del Database:
a) PHPIDS effettua anche il log delle intrusioni su database. Per renderlo possibile dobbiamo creare la seguente tabella nel db usato dalla nostra applicazione:


CREATE TABLE IF NOT EXISTS `PHPIDSintrusions` (
      `id` int(11) unsigned NOT null auto_increment,
      `name` varchar(128) NOT null,
      `value` text NOT null,
      `page` varchar(255) NOT null,
      `ip` varchar(15) NOT null,
      `impact` int(11) unsigned NOT null,
      `origin` varchar(15) NOT null,
      `created` datetime NOT null,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM ;

3. Configurazione:
a) La vostra applicazione è sicuramente costituita dal un file (ad es. index.php), contenuto nella root directory (ovvero in cui il server web cerca il file principale di un sito), che viene sempre caricato quando gli utenti navigano le pagine del sito. In questo file dovete aggiungere le seguenti righe di codice:


 /********************************************************************
    * Inizio PHPIDS
    * Se voglio disabilitare l'IDS basta che elimino il codice fino al commento con Fine IDS
    *********************************************************************/
    // configura in modo appropriato la include path per PHPIDS
    set_include_path(
        get_include_path()
        . PATH_SEPARATOR
        . '../../lib/'
    );

    if (!session_id()) {
        session_start();
    }

    require_once 'IDS/Init.php';

    try {

    /*
    * Definiamo dove vogliamo effettuare lo scan
    */    $request = array(
        'REQUEST' => $_REQUEST,
        'GET' => $_GET,
        'POST' => $_POST,
        'COOKIE' => $_COOKIE
    );

    $init = IDS_Init::init(dirname(__FILE__) . '/../IDS/Config/Config.ini');

    /**
     * Impostiamo via codice delle variabili nel file di configurazione
     */
    $init->config['General']['base_path'] = dirname(__FILE__) . '/../IDS/';
    $init->config['General']['use_base_path'] = true;
    $init->config['Caching']['caching'] = 'none';

    // 2. Inizializziamo il PHPIDS e lo avviamo

    $ids = new IDS_Monitor($request, $init);
    $result = $ids->run();

    /*
    * Ecco fatto - Ora possiamo analizzare i risultati dello scan:
    *
    * Nell' oggetto result trovate tutti i campi sospetti della query string
    *
    * Nota: è possibile cambiare il formato del messaggio contenuto in result, modificando nel IDS_Report.php il metodo __toString.
    */    if (!$result->isEmpty()) {
        echo "Attack detected!";

        /*
        * Inizializzo il log su file e lo attivo
        */        require_once dirname(__FILE__) . '/../IDS/Log/File.php';
        require_once dirname(__FILE__) . '/../IDS/Log/Composite.php';

        $compositeLog = new IDS_Log_Composite();
        $compositeLog->addLogger(IDS_Log_File::getInstance($init));
        $compositeLog->execute($result);
        /*
        * I stessi dati li salvo su DB nella tabella PHPIDSintrusion
        */        require_once 'IDS/Log/Database.php';

        $compositeLog->addLogger(
             IDS_Log_Database::getInstance($init)
        );
        */        $compositeLog->execute($result);

    } else {
        echo '<a href="?test=%22><script>eval(window.name)</script>">No attack detected - click for an example attack</a>';
    }
        }
    catch (Exception $e) {
    /*
    * C'è statoun grave errore

    */    printf(
        'An error occured: %s',
        $e->getMessage()
    );
                         }
    /********************************************************************
    * Fine PHPIDS
    * Cancellare fino a qui
    *********************************************************************/

Ovviamente questo è solo un esempio di utilizzo e configurazione, il codice può essere personalizzato in base alle proprie esigenze.

4. Mantenere aggiornato il database di riferimento:

Una volta aver installato e configurato l’IDS, per mantenerlo efficiente, dobbiamo aggiornare il database di riferimento (contenente i modelli di attacco). Per farlo, basta scaricare il file default_filter.xml al seguente indirizzo e sostituirlo nella cartella principale dell’IDS. Questo viene aggiornato almeno una volta alla settimana.

Per maggiori informazioni potete consultare una ricca documentazione qui:  e se riscontrate problemi, spedite un e-mail a genny.soacella[@]gmail.com

Post originale e maggiori informazioni qui

1 commento

  1. Ciao, una volta, per difendere il mio sito da eventuali attacchi, utilizzavo “evilsentinel” , programmavo in php non filtrando variabili etc… ed pensavo di essere sicuro utilizzando quel sistema anti-intrusione.
    Non mi rendevo conto però che includere in un suorce righe e righe di php, rendeva il mio sito web molto lento e in più non ero sicuro al 100%.
    Per questo ora preferisco programmare in php in modo sicuro cosi da migliorare i miei source e velocizzare il tutto.