Proteggere i propri applicativi php è importantissimo sia,  per l’integrità dei dati che del sistema.

Nello scorso articolo ho fatto una panoramica sulla vulnerabilità Local File Inclusion, mentre oggi lo scopo dei test sarà quello di applicare al codice php dei filtri command injection, ovvero normalizzare le richieste in input eliminando la possibilità di eseguire comandi non autorizzati.

Esempi di command injection

Qui di seguito riporto un esempio di script php (filter-injection.php) che passa tramite metodo $_GET  gli argomenti al comando “ls” del sistema linux locale, così da elencare il contenuto della directory desiderata.

<html>
<body>
<pre>
<?php

$cmd = "ls -lah " .$_GET['path'];

        system($cmd);
?>
</pre>
</body>
</html

Inserendo nel browser l’url http://sito/filter-injection.php?path=/tmp sarà possibile visualizzare il contenuto della  directory /tmp:

escapeshellarg escapeshellcmd

Utilizzando i caratteri “&“, “;” o “|” come ben noto è possibile concatenare più comandi o redirigerne l’utoput di uno verso l’altro.

Ecco un esempio di come è possibile iniettare comandi in una pagina php non protetta “http://sito/filter-injection.php?path=/tmp | pwd“:

escapeshellarg escapeshellcmd

Tramite il carattere pipe è stato possibile far eseguire alla pagina php un comando non autorizzato, ovvero pwd.

Filtri: escapeshellarg escapeshellcmd

Per proteggere script  php vulnerabili ai command injection vengono in aiuto due funzioni php:

Una breve descrizione  presa da php.net:

escapeshellarg

(PHP 4 >= 4.0.3, PHP 5)

escapeshellarg — estrae una stringa da usare come un argomento della shell

Descrizione

string escapeshellarg ( string $arg )

escapeshellarg() aggiunge le virgolette singole attorno ad una stringa ed elude ogni virgoletta semplice per permetterti di passare una stringa direttamente ad una funzione della shell a che questa venga trattata come un singolo argomento. Questa funzione dovrebbe essere usata per eludere argomenti individuali per funzioni della shell che giungano dall’input del utente. Le funzioni della shell includono exec(), system() e l’operatore backtick

escapeshellcmd

(PHP 4, PHP 5)

escapeshellcmd — Elude i metacaratteri della shell

Descrizione

string escapeshellcmd ( string $command )

escapeshellcmd() elude ogni carattere di una stringa che potrebbe essere usata per indurre un comando shell ad eseguire comandi arbitrari. Questa funzione dovrebbe essere usata per assicurarsi che ogni dato che giunga dall’input dell’utente venga neutralizzato prima di essere passato a funzioni come exec() o system() o all’operatore backtick .

Per il test utilizzerò la funzione escapeshellarg modificando la pagina filter-injection-php in questo modo:

<html>
<body>
<pre>
<?php

$cmd = "ls -lah ".escapeshellarg($_GET['path']);

        system($cmd);


?>
</pre>
</body>
</html

Riscrivo nel browser l’url “http://sito/filter-injection.php?path=/tmp | pwd“:

escapeshellarg escapeshellcmd

Il comando non è stato iniettato, dando uno sguardo al file error log di apache si nota:

ls: /tmp | pwd: No such file or directory

Riferimenti Filtri command injection: escapeshellarg escapeshellcmd

Pentester Academy – SecurityTube.net