Perché i siti Web continuano a soffrire di iniezioni del sistema operativo se per impostazione predefinita i web server non hanno una shell?

1

Quindi, anche se c'è un pessimo scritto php che permette un shell_exec () e che qualcuno ha disabilitato la modalità sicura, quali sono esattamente i rischi? Gli amministratori cambiano semplicemente il gruppo predefinito o la maggior parte degli attacchi proviene da altre forme di applicazioni Web che vengono eseguite come utenti privilegiati?

Apache per esempio viene eseguito come utente "nessuno" che è assegnato a / bin / false o / usr / sbin / nologin che dovrebbe evitare comunque di ottenere una shell .

    
posta whatever489 05.07.2016 - 00:22
fonte

2 risposte

2

L'utilizzo di shell_exec() e delle sue varianti multiple è perfetto, purché l'account utente del server Web sia limitato alla sua struttura di directory.

Il vero rischio è usare script non sicuri che eseguono comandi con input dell'utente. escapeshellcmd() e escapeshellarg() possono essere usati per renderlo più sicuro.

Si noti che non avere una shell di login non impedisce l'esecuzione di comandi attraverso una shell.

Come per la modalità sicura di PHP, è obsoleto (come mostrato sul link ):

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.

    
risposta data 05.07.2016 - 02:14
fonte
0

Una shell viene usata (e prima eseguita) quando avviene un login interattivo per questo user-id. Inserire un valore come bin / false o / usr / sbin / nologin termina questa sessione e in pratica disconnette l'utente.

Molti servizi / demoni di sistema non utilizzano accessi interattivi e sono avviati da altri processi, tuttavia sono assegnati un ID utente e un id di gruppo, per dirigere le autorizzazioni in esecuzione sui propri processi.

Eseguire una shell attraverso processi come shell_exec() , system() o execve() significa quasi "eseguire una shell con questo UID / GID". Non si verifica alcun processo di accesso, quindi la shell richiesta (/ bin / ...) non viene letta.

Perché succede ancora?
Perché gli umani sono pigri. Iniezione di comando È una cattiva pratica, ma spesso un modo rapido e sporco per fare le cose (eseguire il ping di un sistema, eseguire operazioni sui file, ...). Gli sviluppatori sanno come farlo usando la shell, quindi usa quella conoscenza per eseguire lo stesso. Pensa (sì, codice PHP molto disordinato, ...):

$pattern = $_GET["pattern"];
$fin =  fopen('/path/to/your/input/file.txt', 'r');
$fout = fopen('/path/to/your/output/file.txt', 'w');
while (!feof($fin)) {
  $line = fgets($fin, 4096);
  if (preg_match($pattern, $line)) { 
    fwrite($fout, $line);
  }
}
fclose($fin);
fclose($fout);

O semplicemente

shell_exec("cat input/file.txt | grep ".$_GET["pattern"]." > output/file.txt");

Fa lo stesso in sostanza, ma il secondo è più facile e veloce.

    
risposta data 05.07.2016 - 03:29
fonte

Leggi altre domande sui tag