rieccomi qui..... CON UN POST CHILOMETRICO!!!!!!!!!!!!!
riporto per intero il mio personalissimo workaround, che ho creato appositamente per rendere la vita difficile ai bravi ragazzi che hanno tentato più volte di defacciarmi.
m'è costata alcune ore di progettazione, ma sono soddisfatto del risultato...
PREMESSA:
la mia soluzione è un tantinello lunga e potrebbe anche richiedere lievi modifiche "strutturali", ma andiamo con calma e proviamo a capire come funziona.
è meglio proporre e sentirsi dire "no, grazie", piuttosto che restare col senso di colpa!
****************** PASSAGGIO #1:
apri il file .htaccess ed aggiungi ALLA FINE (ribadisco: ALLA FINE!!!!!!) le seguenti righe:
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^.+\.php$
RewriteRule ^(.*)$ /404.php
che fanno? semplice: nel caso di un url errato, l'utente viene mandato ad una pagina di errore... ma attenzione: il lavoro che svolgono queste righe non si limita a questo.
in pratica, normalmente ci si aspetterebbe un redirect, ovvero digitando
www.sito.it/paginaerrata232125.htm dovrebbe rimandare a
www.sito.it/404.php.
E INVECE NO!!!
digitando
www.sito.it/paginaerrata232125.htm, il browser rimanderebbe SEMPRE a
www.sito.it/paginaerrata232125.htm, cioè la stessa pagina... però questa pagina sarebbe semplicemente un alias di /404.php creato al volo da htaccess con l'urlrewrite.
A COSA SERVE TUTTO QUESTO?
ci sto arrivando....
****************** PASSAGGIO 2:
da ora in poi tutto dipende dal tuo script per le statistiche.
è in grado di loggare TUTTE le pagine visualizzate? se sì, siamo messi bene.
se la risposta è no, ti consiglio di scaricare php-stats (e di alleggerirlo, ovviamente).
successivamente, come credo tu abbia già comunque fatto, le stats devono essere richiamate da tutte le pagine. quindi le includeremo in uno script per generare l'header delle pagine (quella che manda in output i tag <!doctype>, <head>, body, titolo, link in alto, ecc...... e che solitamente è /include/header.php o qualcosa del genere... non so com'è strutturato il tuo sito).
questo devi farlo anche per la pagina /404.php.
in poche parole, devi generare una pagina di errore con lo stesso identico layout ma che mostri un errore... oppure limitati a farle richiamare le stats e a mostrare l'errore, fai tu!
****************** PASSAGGIO #3:
adesso torna al file /include/header.php (o qualunque sia il suo nome).
metti AL SUO INIZIO questa riga:
include "/unadirectory/patch.php";
poi crea questa directory e questo fantomatico file.... fatto??? perfetto, inserisci questa simpatica funzione:
function diehack()
{
if (getenv('HTTP_CLIENT_IP'))
$ip=getenv('HTTP_CLIENT_IP');
elseif (getenv('HTTP_X_FORWARDED_FOR'))
$ip=getenv('HTTP_X_FORWARDED_FOR');
elseif (getenv('HTTP_X_FORWARDED'))
$ip=getenv('HTTP_X_FORWARDED');
elseif (getenv('HTTP_FORWARDED_FOR'))
$ip=getenv('HTTP_FORWARDED_FOR');
elseif (getenv('HTTP_FORWARDED') )
$ip=getenv('HTTP_FORWARDED');
else
$ip=$_SERVER['REMOTE_ADDR'];
$time=time();
$timef=date("D M j Y G:i:s T");
/*$index=fopen("/hacks.txt","a+",1);
fwrite($index,"l'ip $ip (unix timestamp: $time) ha provato ad entrare con questa url: ".PAGEPATH."\n");
fclose($index);*/
$root="/percorsoassoluto/htdocs";
$index=fopen($root."hacks/list.txt","a+"); //__$ip_$time.txt
fwrite($index,"[$timef$ip - timestamp: $time]\n$ip --> ".$_SERVER["REQUEST_URI"]."\n------\n");
fclose($index);
die("
<html><body><code>
lol... what are you trying to do? a hack??? bwahahahhahh! fuck ya, asshole!<br>
</br>
ITALIAN VERSION:<br/>
huauahahuauhahuahua! e tu vorresti defacciarmi??? ma vai al diavolo, piccola testa di ******!<br/>
-Fede<br/>
<br/>
<b>OH.... YOUR IP ($ip) IS LOGGED, OF COURSE!;)</b>
</code></body></html>
");
}
...che ringrazierà lo smaliziato pezzettino di sterco per la visita (lo farà sia in inglese che in italiano, perché non si sa mai
... ma ovviamente puoi modificare il messaggio come ti pare!), spiegandogli che è stato pizzicato.
non solo! questo creerà un file come questo:
http://www.federik***o.net/hacks/list.txtche mostrerà i dettagli dei tentativi sventati...
****************** PASSAGGIO #4:
e ora??? beh ora, ovviamente, dobbiamo poterla richiamare, questa funzione... giusto?
ed allora aggiungiamo altro codice al file patch.php:
$querystring=$_SERVER['QUERY_STRING']; //prende l'url richiamato dall'utente
//primo caso
if ((strpos($querystring,"****")) //porzione di parametri che causano l'injection
&& (strpos($querystring,"*******")) //altre porzioni
&& ...........
diehack();
//secondo
if ((strpos($querystring,"****")) //porzione di parametri che causano l'injection
&& (strpos($querystring,"*******")) //altre porzioni
&& ...........
diehack();
//ad libitum......
****************** PASSAGGIO #5:
poi, se proprio vogliamo fare un lavoretto ancora più pulito, vietiamogli pure di entrare in certe cartelle o di aprire certi files.
(nel mio caso avevano caricato un file di nome phpremview.php o qualcosa di simile.)
qui l'htaccess ci viene incontro come specificato più in alto, ma vediamo di preciso perché:
$requrl=$_SERVER["REQUEST_URI"];
if ((strpos($requrl,'/una_cartella')) //questa, ad es, è la cartella con il log e la patch
|| (strpos($requrl,'/altra_cartella'))
|| (strpos($requrl,'/include'))
|| (strpos($requrl,'/php')) // vuoi richiamare /phpremoteview.php??? E IO TI BLOCCO!!
|| (strpos($requrl,'phpr')) // ancora insisti???? è da qualche altra parte?!!? perfetto... TI RIBLOCCO!
//
// .....e il tutto va ripetuto e "riciclato" in base alle proprie esigenze!
)
diehack();
****************** DULCIS IN FUNDO (era ora!!!!!!):
ora passiamo alle conclusioni:
il procedimento è un po' complesso, macchinoso e, lo ammetto, poco pratico.
però ha DUE vantaggi:
1) modificando così l'htaccess, possiamo sapere PRECISAMENTE quali files sono stati chiamati dai visitatori, anche quando questi non esistono;
2) siamo LIBERISSIMI di limitare l'accesso a determinati files basandoci su svariati criteri (nome, dimensione, checksum, data di creazione, ecc), per rendere ancora più robusta la protezione.
siccome sia la pagina 404 che TUTTE LE ALTRE ESISTENTI richiamerebbero comunque il file patch.php, potremmo sempre intervenire, sia nel caso di tentativi di aprire files presumibilmente "dannosi" (lasciati dall'utente o dal lamer), che nel caso si tentasse di aprire files che dobbiamo tenere alla lontana da questi simpatici ometti.
certo, interverremo in leggero "ritardo" e saremmo costretti a tenere d'occhio le stats, ma fidatevi: col tempo si scocceranno! o almeno con me ha funzionato.
tophost può confermarvi: ho subito ripetuti e puntualissimi attacchi, ma adesso si sono dati una calmata.
ed effettivamente, guardando il file che logga i miei tentativi di attacchi, c'hanno rinunciato da dicembre!
effe8, se vuoi posso aiutarti a gestire le stringhe per le "if". dovresti però farmi avere, magari tramite mp/email/msn/telefono/letterina, i link passati per effettuare l'injection.
nel caso non ti fidassi, mi accontento soltanto di indirizzi tagliati a metà... è giusto per avere un'idea e per poterti dare una mano, evitando in ogni caso di rendere irraggiungibili documenti potenzialmente innocui.
questo è quanto. se l'idea dovesse piacere a qualcuno, fate pure... e magari, se per caso dovesse rivelarsi valida, battete un colpo: sarò contento di essermi reso utile per qualcuno!