¿Por qué los sitios web siguen sufriendo inyecciones en el sistema operativo si, de manera predeterminada, los servidores web no tienen una shell asignada?

1

Así que incluso si hay algún php mal escrito que permita un shell_exec () y eso Alguien ha desactivado el modo seguro, ¿cuáles son exactamente los riesgos? ¿Los administradores simplemente cambian el grupo predeterminado o la mayoría de los ataques provienen de otras formas de aplicaciones web que se ejecutan como usuarios privilegiados?

Apache , por ejemplo, se ejecuta como usuario "nobody" que se asigna a / bin / false o / usr / sbin / nologin que debería de todos modos, evita obtener una shell .

    
pregunta whatever489 05.07.2016 - 00:22
fuente

2 respuestas

2

El uso de shell_exec() y sus múltiples variantes está perfectamente bien siempre y cuando la cuenta de usuario del servidor web esté limitada a su estructura de directorios.

El verdadero riesgo es usar scripts no seguros que ejecutan comandos con la entrada del usuario. escapeshellcmd() y escapeshellarg() se pueden usar para hacerlo más seguro.

Tenga en cuenta que no tener un shell de inicio de sesión no impide ejecutar comandos a través de un shell.

En cuanto al modo seguro de PHP, está desactualizado (como se muestra en enlace ):

  

Esta función se ha DEPRECTO a partir de PHP 5.3.0 y se ELIMINÓ a partir de PHP 5.4.0.

    
respondido por el Julie Pelletier 05.07.2016 - 02:14
fuente
0

Se utiliza un shell (y se ejecuta por primera vez) cuando se produce un inicio de sesión interactivo para este ID de usuario. Poner un valor como bin / false o / usr / sbin / nologin termina esta sesión y, esencialmente, cierra la sesión del usuario.

Muchos servicios / daemons del sistema no utilizan inicios de sesión interactivos y otros procesos los inician. Sin embargo, se les asigna un ID de usuario y un ID de grupo para dirigir los permisos bajo los cuales se ejecutan los procesos.

Ejecutar un shell a través de procesos como shell_exec() , system() o execve() significa "ejecutar un shell bajo este UID / GID". No se está produciendo un proceso de inicio de sesión, por lo que no se lee el shell requerido (/ bin / ...).

¿Por qué sigue ocurriendo?
Porque los humanos son perezosos. Inyección de comandos Es una mala práctica, pero a menudo es una forma rápida y sucia de hacer las cosas (hacer ping a un sistema, realizar operaciones de archivos, ...). Los desarrolladores saben cómo hacerlo utilizando el shell, así que usa ese conocimiento para realizar lo mismo. Piensa en (sí, código PHP muy desordenado, ...):

$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 simplemente

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

En esencia, hace lo mismo, pero la segunda es más fácil y más rápida.

    
respondido por el ndrix 05.07.2016 - 03:29
fuente

Lea otras preguntas en las etiquetas