Newsgroup: it.comp.www.php
Titolo: Problema script php

Un saluto a tutto il ng, ho un problema che vorrei mi aiutaste a risolvere. 
Ho da qualche anno un sito con uno script prefatto di una toplist, lo tengo 
su giusto per hobby ma bastrebbe poco per buttare via tutto. Ho scoperto, 
dopo una segnalazione, che qualcuno e' riuscito ad uploadare degli script 
che inviavano email o virus...non ho ben capito. In pratica lo script in php 
permetteva di uploadare i banner degli iscritti nella cartella "banner" (a 
cui andava dato chmod 777), che e' proprio la cartella in cui sono stati 
trovati i numerosi file anomali. Adesso provo a chiedere a voi se potete 
fare in modo che questo non accada piu'...altrimenti fanculo il sito. Vi 
riporto il contenuto del file banner_upload.php e upload.php in modo che, se 
qualcuno voglia aiutarmi, possiate modificarlo se possibile per eliminare il 
problema:
BANNER_UPLOAD.PHP
<?
include "config.php";
include "db/db.php";
db_options();
include "languages/$language.php";
include "style/" . $option['style'] . ".php";
include "header.php";
echo "<br><br><center>" . $lang['uploadtxt'] . "<br><br>
<form enctype='multipart/form-data' method='post' action='upload.php'>
<input type='hidden' name='action' value='upload'>
<table frame=box rules=none border=0 cellpadding=2
       cellspacing=0 align='center'>
   <tr>
      <td>Banner:</td>
      <td><input type='file' name='userfile'></td>
   </tr>
      <tr>
      <td>" . $lang['siteurlwohttp'] . ":</td>
      <td><input type='input' name='sitename'></td>
   </tr>
   <tr>
      <td></td>
      <td><input type='submit' name ='upload'
                 value='Upload'></td>
   <tr>
</table>
</form>";
include "footer.php";
?>
_____________________________________
UPLOAD.PHP=
<?
include "config.php";
include "db/db.php";
db_options();
include "style/" . $option['style'] . ".php";
include "header.php";
include "languages/$language.php";
mkdir("banners/$sitename",0777);
$upload_path = "banners/$sitename/";
$extval_use = 0;
// forbidden extensions
$extval = array();
$filesize_limit_use = 1; // turns on/off size check
$filesize_limit = 40; // file size limit (in kB)
$rc = 0;
if ( isset($HTTP_POST_VARS["upload"]) ) {
   $orig_name = $HTTP_POST_FILES['userfile']['name'];
   $filename = ereg_replace("[^a-z0-9._]", "",
                ereg_replace (" ", "_",
                 ereg_replace("%20", "_",
                  strtolower($orig_name))));
   // <filesize>
   if($filesize_limit_use=1) {
      $filesize = $HTTP_POST_FILES['userfile']['name'] / 1024; //filesize in 
kB
      if($filesize_limit < $filesize) {
         echo "<p><font color='red'><center>"
              . $message["fileisbig"]."</font></center></p>";
         $rc = 1;
      }
   }
   // </filesize>
   if ( $rc == 0 ) {
      // <extension_validate>
      if($extval_use=1) {
         $extget = substr( strrchr($filename, "."), 1);
         $found = in_array($extget, $extval);
         if ( $found ) {
            echo "<p><font color='red'><center>"
               . $message["invext"]."</font></center></p>";
            $rc = 2;
         }
      }
      // </extension_validate>
   }
   if ( $rc == 0 ) {
      // <file exists verification>
      echo "<p><center>Uploading...</center></p>\n";
      if ( file_exists($upload_path.$filename) ) {
         echo "<p><font color='red'><center>"
            . $message["fileexists"]."</font></center></p>";
      } else {
         if( move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'],
                   $upload_path.$filename) ) {
            echo "<p><center>" . $message["complete"]." URL to your banner: 
http://" . $option['siteurl'] . "/banners/$sitename/$filename 
:)</center></p>";
         } else {
            echo "<p><font color='red'><center>"
               . $message["incomplete"]."</font></center></p>";
         }
      }
      // </file exists verification>
   }
}
include "footer.php";
?>
Vi ringrazio anticipatamente per qualsiasi aiuto possiate darmi. 

 eliminare il problema:
Dunque, a prima vista si tratta del classico che uploada un file.
Prima cosa, chi ha accesso al form ed in che modo?
Se, come dici, qualcuno ha uploadato cose che non doveva, in un qualche modo 
deve aver avuto accesso al form.
Seconda cosa, non mi sembra che tu faccia nessun controllo sul tipo di file 
che uploadi, dando così la possibilità di inserire anche degli script.
Usi $extval per testare le estensioni, ma tale array è vuoto nel codice che 
hai postato.
Ciao
Marco 

 trovati i numerosi file anomali.
Non sono stato a guardare troppo attentamente il codice, a parte la sua
lunghezza che mi pare, a primo occhio, eccessiva, il problema che hai è
semplicemente che non stai controllando che tipo di estensione è stata
usata per il file. Lo script prevede anche un controllo del genere, però
mi pare una soluzione poco elegante.
Se hai voglia/tempo/capacità per modificare o riscrivere lo script in
modo che accetti solo estensioni di tipo .jpg/.gif/.png puoi risolvere
il tuo problema, altrimenti... beh direi che ti converrebbe cestinare il
tutto, personalmente non ho il tempo (e neanche la voglia a dirla tutta)
di scrivere per te il codice che ti serve.
Ciao.
-- 
Stéphane Bisinger
Webmas... well...

 di scrivere per te il codice che ti serve.
Bhe...capacita' non ne ho purtroppo, cercavo qualcuno capace come te e 
volenteroso.... 

 che hai postato.
So che ti chiedo troppo, ma non c'e' qualche riga di codice che possa 
inserire per accettare solo i file gif e jpeg? 


$extval = array('jpg', jpeg', 'png', 'gif');

Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

 modificare sono quelle non quotate):
Grazie mille, ci provo. Sei stato gentilissimo. 

 inserire per accettare solo i file gif e jpeg?
Ti hanno già risposto più sotto.
Ma in aggiunta puoi usare anche la funzione  getimagesize()  che ti 
restituisce il tipo di immagine del file (JPG, GIF, ...). Se il file non è 
un'immagine restituisce FALSE.
Ciao
Marco 

Grazie mille, ci provo. Sei stato gentilissimo. 
Di nulla, è già previsto nello script il controllo delle estensioni
ammesse, bastava solo abilitarle. Facci sapere se va bene così può
essere utile anche ad altri.
p.s. preciso che questo script è un pò obsoleto.
