Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Terrore e angoscia per code injection

    Buona sera,
    con il sudore della fronte sono riuscito a scrivere (o meglio ad adattare) uno script in php.
    Lo script legge un'immagine presente in una qualsiasi cartella del mio sito e vi sovrappone un watermark (una sorta di Copyright) e visualizza il risultato a video.
    Lo script è richiamato in questo modo

    http://miosito.com/watermark.php?img...g/immagine.jpg

    Immagine jpg viene letta e viene apposto il watermark.

    Ho paura, non avendo esperienza in php, che il codice permetta code injection.
    Posto il codice utilizzato così che qualcuno possa consigliarmi.

    Codice PHP:
    <?php

    //$_GET['img'] contiene l'immagine sulla quale sovrapporre il watermark
    $source =@$_GET['img'];

    //questa variabile contiene l'immagine che viene sovrapposta
    $watermark_file "http://miosito.com/watermark.JPG";


    $image = @imagecreatefromjpeg($source);

    $source_w = @imagesx($image);

    $source_h = @imagesy($image);


    $watermark = @imagecreatefromjpeg($watermark_file);

    $watermark_w = @imagesx($watermark);

    $watermark_h = @imagesy($watermark);



    //qui decido dove posizionare il watermark
    $dest_x = ($source_w $watermark_w)/2;

    $dest_y 5;


    @
    imagecopy($image$watermark$dest_x$dest_y00$watermark_w$watermark_h);

    header('Content-type: image/jpeg');


    $if (isset($source_w) ) //se sono riuscito a leggere correttamente l'immagine
    @imagejpeg($image);   //la visualizzo
    else
    @
    imagejpeg($watermark); //altrimenti visualizzo solo il watermark


    ?>
    Ovvio che il pericolo derivi dal fatto che qualcuno richiami lo script così

    http://miosito.com/watermark.php?img=codicemaligno

    Ho letto altri articoli sul code injection ma sinceramente ho capito poco.
    Chiedo a Voi che di certo ne saprete più di me.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    in effetti la riga $image = @imagecreatefromjpeg($source); non è molto sicura perchè richiami una funzione passando un parametro letto direttamente dall'URL senza alcun controllo... inoltre c'è anche un problema logico: così facendo l'immagine ha l'URL in chiaro mostrata come parametro e quindi uno può bypassare il watermarking... ti suggerisco di creare un abbinamento id (numerico o al limite stringa) <-> immagine e di passare questo come parametro

  3. #3

    Nono

    Il problema della url in chiaro non esiste:
    se si richiede l'immagine
    http://miosito.com/immagine.jpg

    htaccess automaticamente esegue

    http://miosito.com/watermark.php?img...m/immagine.jpg

    quindi da questo punto di vista sono tutelato.
    httaccess impedisce che ci si appropri di un'immagine pulita.

    Il pericolo si può presentare se qualcuno digita
    http://miosito.com/watermark.php?img...ecodicedannoso

    Io voglio tutelarmi da questa eventualità.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    per quanto riguarda la gestione .htaccess va bene (bisogna vedere la regola esatta per essere sicuri che hai coperto tutti i campi, ma in linea di massima non dovresti allora avere problemi), per il resto vale quel che dicevo: dovresti filtrare i parametri dell'URL e sarebbe meglio impostare un parametro numerico (o al limite alfanumerico) cui associare le immagini anzichè usare direttamente il nome... al limite un minimo di controllo potresti farlo verificando che il nome passato sia un file esistente dentro la cartella delle immagini (e comunque passerei solo il nome del file senza la cartella) tipo:

    Codice PHP:
    $err false;
    $FOLDER 'cartella/sottocartella/';
    // supponendo che $source NON contenga il percorso
    // fai qualche controllo sul nome del file... sarebbe meglio con le espressioni regolari, ma almeno verificare che non contenga "slash" o "backslash"...
    if ((strpos($source'/')!==false) || (strpos($source'\\')!==false) {
      
    $err true;
    };
    $fullpath $FOLDER.$source;
    if (!
    file_existts($fullpath)) {
      
    $err true;
    };
    if (!
    $err) {
      ...
      
    $image = @imagecreatefromjpeg($fullpath); 
      ...
    }; 
    ...come spunto

  5. #5
    @prototipo

    Ciao,

    gentilmente, evitiamo titoli confusionario e/o inutili che non vadano dritto al centro: "Terrore e angoscia..." non è esattamente utile al fine di far comprendere agli utenti la richiesta

    Detto questo, secondo me, invece potresti stare abbastanza tranquillo perché anche se tu carichi in memoria percorsi qualsiasi, in realtà, quei percorsi stanno sotto open_basedir e safe_mode di conseguenza non possono accedere a parti pericolose del server.
    Se non è questo il tuo problema allora non vedo dove sia il rischio perché quel codice serve a caricare in memoria un'immagine e fa i suoi controlli

    Se proprio vuoi stare tranquillo tranquillo, puoi far si che le immagini che ricevi abbiano tutte l'estensione corretta e siano presenti nella tua document root (tecnicamente passando un url possono mettere il watermark su immagini esterne al sito)

    Quindi potresti fare qualcosa tipo
    codice:
    $document_root = realpath($_SERVER['DOCUMENT_ROOT']);
    if ($document_root != substr(dirname(realpath($source)), 0, strlen($document_root))) || substr($source, -3) != 'jpg')
    {
      echo "Percorso non accessibile o immagine non valida";
      die();
    }
    e già staresti al sicuro, infatti il codice si preoccupa di verificare che la document root corrisponda alla parte iniziale del percorso richiesto oltre a verificare l'estensione.

    Il codice l'ho scritto su due piedi, quindi potrebbe anche non funzionare, ma in linea di massima siamo li.

    PS: invece di fare
    codice:
    $watermark_file = "http://miosito.com/watermark.JPG";
    che costringe a php a scaricarsi tramite il webserver il watermark da posizionnare ti consiglieri di fare piuttosto
    codice:
    $watermark_file = dirname(realpath(__FILE__)) . DIRECTORY_SEPARATOR . "watermark.JPG";
    che accede direttamente al file

    PS: ti conviene convertire in minuscolo le estensioni dei file
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Grazie per le risposte.
    Chiedo scusa per il titolo che ho utilizzato. "Terrore e angoscia per code injection" forse era eccessivo.

    In primo luogo vi mostro le righe .httaccess utilizzate così che possiate effettivamente controllare che se qualcuno "chiede" al server un immagine jpeg automaticamente viene rindirizzato alla sua versione con il watermark



    in pratica se qualcuno richiede una immagine con estensione JPG, jpg, JPEG, jpeg viene reindirizzato alla versione con il watermark.

    Ho compreso dai vostri messaggi che dovrei controllare che l'url passato si riferisca ad un file realmente esistente sul mio server.
    Questo per evitare che sia passata un'immagine proveniente da un altro sito.
    Tuttavia la soluzione che mi è stata proposta si basa sul controllare che il file sia nella root directory.
    In realtà lo script deve funzionare per ogni immagine presente sul mio server e non solo nella root.

    Riassumendo vorrei controllare che la stringa passata sia un file esistente che si trovi su una cartella qualsiasi del mio sito.
    Credo così di stare al sicuro.
    Effettivamente ora come ora lo script mette il watermark anche su immagini di altri siti.
    Per favore, fatemi sapere.

  7. #7
    Ciao,

    il codice che ti ho postato accetta tutti i file presenti nella document root del tuo sito e tutti i file di tutte le cartelle presenti sotto la document root e via dicendo

    se ci fai caso, nell'if, c'è un SUBSTR cosi da poter verificare che la parte iniziale contenga, effettivamente, il percorso reale della document root

    se però hai necessità di effettuare operazioni anche in cartelle precedenti (cartelle contenute nella document root e via dicendo all'infinito vengono accettate) allora va modificato il codice
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8

    capisco

    Cercando di interpretare i vostri script e cercando un po in giro, ho inteso che vi sono 3 problemi e un problemino
    1) Bisogna controllare che la stringa passata non contenga tag html
    2) bisogna controllare che la stringa si riferisca ad un file residente sul mio server
    3) il carattere "\" potrebbe darmi problemi (non ho capito perchè!!)

    il problemino è che il watermark non deve essere caricato con
    Codice PHP:
    $watermark_file "hxxp://miosito.com/watermark.JPG"
    ma ora lo carico con
    Codice PHP:
    $watermark_file "watermark.JPG"
    penso di effettuare le seguenti modifiche


    Codice PHP:
    <?php 

    $source 
    =@$_GET['img']; 

    if (
    strip_tags($source) != $source//se la stringa contiene tag html o sbarra
    die();                                        //interrompi
    }

    if (!
    ereg("^hxxp://miosito.com/",$str)) { //se la stringa passata non inizia per 
    die();                                               // hxxp://miosito.com/
    }

    $watermark_file "watermark.JPG";  //qui ho fatto una modifica: invece di 
                                                     //http://miosito.com/watermark.JPG
                                                     //ho inserito solo watermark.JPG
                                                     //è più veloce


    $image = @imagecreatefromjpeg($source); 

    $source_w = @imagesx($image); 

    $source_h = @imagesy($image); 


    $watermark = @imagecreatefromjpeg($watermark_file); 

    $watermark_w = @imagesx($watermark); 

    $watermark_h = @imagesy($watermark); 



    //qui decido dove posizionare il watermark 
    $dest_x = ($source_w $watermark_w)/2

    $dest_y 5


    @
    imagecopy($image$watermark$dest_x$dest_y00$watermark_w$watermark_h); 

    header('Content-type: image/jpeg'); 


    $if (isset($source_w) ) 
    @
    imagejpeg($image);  
    else 
    @
    $imagejpeg($watermark);


    ?>

    ho sostituito hxxp a http nel testo perchè mi dava problemi di laiaut.
    In pratica mi sono accontentato di verificare che il file provenga dal mio sito.
    Infatti non credo di aver problemi se viene letto un qualsiasi file sul mio server.
    A questo punto suppongo che per quanto possa essere rozzo il codice che ho scritto, non debba più avere "timore e angoscia" del code injection.
    Aspetto le vostre critiche e i vostri consigli

  9. #9
    beh, innanzi tutto le ereg sono deprecate e spariranno a breve quindi ti consiglio di non usarle, al massimo le preg, ma detto questo la soluzione che ti avevo proposto risolveva i problemi senza fare controlli inutili

    Il fatto che ti passino tag, in questo caso, è assolutamente ininfluente: quello è un percorso non un qualcosa che verrà visualizzato a video o finirà su un database per essere poi visualizzato a video!

    Inoltre, consiglio personale, non passare i percorsi tramite "ht tp://tuositoweb.it/percorso/immagine.jpg" perchè costringi php a scaricarsi il file dal webserver facendo un sacco di lavoro inutile ... passali piuttosto come percorsi riferiti alla document root cosi da risolvere il problema ^^
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  10. #10
    Ok allora mi baserò sulla tua soluzione.
    Grazie assai!!!

    Finalmente ho capito qualcosa sulla code injection. Qualcosina!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.