Explotación de Vulnerabilidades de Inyección de Comandos en DVWA

Las vulnerabilidades de inyección de comandos (Command Injection) permiten a un atacante ejecutar comandos arbitrarios en el sistema operativo del servidor subyacente. La mecánica es similar a la inyección SQL, donde se manipulan las entradas para que el sistema interprete datos como comandos. Un conocimiento sólido de los comanods de la shell es fundamental para explotar estas debilidades.

Comprendiendo los Operadores de Concatenación de Comandos

  • A & B: Ejecuta A y luego ejecuta B, sin dependencia entre ellos.
  • A && B: Ejecuta B solo si A se completa exitosamente.
  • A | B: Redirige la salida de A para que sea la entrada de B.
  • A || B: Ejecuta B solo si A falla.

Nivel Bajo (Low)

Observación inicial: Al ingresar una IP como '127.0.0.1', la respuesta se muestra correctamente. Si se observa alguna codificación extraña, se puede ajustar la codificación de caracteres del navegador (por ejemplo, en Firefox: Ver -> Codificación de texto -> Chino simplificado).

Prueba de vulnerabilidad: Introducir '127.0.0.1 && help' demuestra la existencia de la vulnerabilidad, ya que el comando 'help' se ejecuta sin ningún tipo de validación.

Análisis del código fuente:


if( isset( $_POST[ 'Submit' ]  ) ) {
   $target = $_REQUEST[ 'ip' ];

   if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
       $cmd = shell_exec( 'ping  ' . $target );
   }
   else {
       $cmd = shell_exec( 'ping  -c 4 ' . $target );
   }
   echo "{$cmd}";
}
   

El código no implementa ninguna medida de seguridad para sanitizar la entrada del usuario antes de ejecutar el comando ping.

Nivel Medio (Medium)

Prueba y observación: Ingresar '127.0.0.1 && help' no produce el resultado esperado. Sin embargo, al probar con 'help || help', se observa un comportamiento diferente.

Hipótesis: El servidor parece haber implementado un filtro para el operador '&&'. Al usar '||', se puede lograr la ejecución de comandos si el primer comando falla. La salida muestra el resultado del primer comando 'help' (que falla o no produce salida deseada) seguido del resultado del segundo comando 'help'.

Análisis del código fuente:


if( isset( $_POST[ 'Submit' ]  ) ) {
   $target = $_REQUEST[ 'ip' ];

   $substitutions = array(
       '&&' => '',
       ';'  => '',
   );

   $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

   if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
       $cmd = shell_exec( 'ping  ' . $target );
   }
   else {
       $cmd = shell_exec( 'ping  -c 4 ' . $target );
   }
   echo "{$cmd}";
}
   

El código ahora filtra explícitamente los caracteres '&&' y ';'. Sin embargo, otros operadores como '|' o '||' aún podría ser viables.

Nivel Alto (High)

Revisión del código fuente:


if( isset( $_POST[ 'Submit' ]  ) ) {
   $target = trim($_REQUEST[ 'ip' ]);

   $substitutions = array(
       '&'  => '',
       ';'  => '',
       '| ' => '',
       '-'  => '',
       '$'  => '',
       '('  => '',
       ')'  => '',
       '`'  => '',
       '||' => '',
   );

   $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

   if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
       $cmd = shell_exec( 'ping  ' . $target );
   }
   else {
       $cmd = shell_exec( 'ping  -c 4 ' . $target );
   }
   echo "{$cmd}";
}
   

Se observa una lista de caracteres y cadenas más extensa que se eliminan de la entrada. Parece un intento riguroso de prevenir la inyección. Sin embargo, el filtro para '| ' (pipe seguido de espacio) deja una ventana potencial. Si se puede usar el pipe '|' solo, podría ser una vía de escape.

Prueba de explotación: Introduciendo '127.0.0.1|help' se logra la ejecución exitosa del comando.

Nivel Imposible (Impossible)

El nivel 'Impossible' implementa validaciones robustas en el formato de la entrada de IP, impidiendo cualquier intento de evasión o inyección de comandos a través de este campo.

Etiquetas: PHP Command Injection Web Security DVWA Shell Execution

Publicado el 11-3 02:04