Directrices

Inyección 101

Una de las clases de vulnerabilidades más conocidas suelen ser las vulnerabilidades de inyección, especialmente, y sin sorprender a nadie, la indiscutible poster-child: La inyección SQL. Es difícil no oír hablar de la inyección SQL en el mundo de la tecnología, así que vamos a hablar de ella. 

Con la inyección SQL, es posible manipular el comportamiento de una consulta SQL para que cumpla las órdenes de un atacante. 

También hay muchos otros tipos de inyección que, aunque diferentes en su superficie, funcionan todos basándose en el mismo principio. 

Para recapitular, algunos de los tipos de inyección más comunes son:

  • Inyección SQL
  • Cross-Site Scripting (inyección HTML/Javascript)
  • Path Traversal (Inyección de ruta/Url)
  • Inyección de comandos
  • Inyección de código 

Un poco de inyección 101

Si miras la lista anterior de tipos de inyección, todos tienen una cosa en común: todos implican una cadena, que se ejecuta a través de un intérprete, que luego hace lo que sea que la cadena represente. Hemos marcado la "entrada del usuario" con llaves.     

Tipo Ejemplo de entrada Cómo se interpreta
SQL SELECT nombre FROM usuarios WHERE nombre de usuario = '{admin}' Selecciona la columna "Nombre" de todas las filas de la tabla de usuarios en las que el nombre de usuario es 'admin'.
HTML {John Smith} Muestra el nombre "John Smith" en negrita
Ruta /var/www/app/documents/{privacy-policy.pdf} Señala el archivo `privacy-policy.pdf` en la carpeta `/var/www/app/documents/`.
Comando ping {8.8.8.8} Envía una serie de pings ICMP a la IP `8.8.8.8`.
Código const name = '{John Smith}'; Establece la variable constante `nombre` al valor `John Smith

Entonces, ¿qué pasaría si la inserción de la entrada del usuario fuera insegura? ¿Qué podría hacer un atacante? De nuevo, todo lo que viene entre llaves se considera "entrada del usuario" en este escenario.

Tipo Ejemplo de entrada Cómo se interpreta
SQL - Inyectado SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' Selecciona el "Nombre" de todas las filas de la tabla de usuarios donde el nombre de usuario es 'admin', y el hash de la contraseña de los usuarios donde el nombre de usuario es 'admin'.
HTML - Inyectado {} Mostrar el nombre "John Smith" en negrita
Trayectoria - Inyectado /var/www/app/documents/{../../../../../etc/shadow} Apunta al archivo `shadow` en la carpeta `/etc/`.
Mando - Inyectado ping {8.8.8.8 && ls . } Envía una serie de pings ICMP a la IP `8.8.8.8`, e imprime el contenido del directorio actual con `ls`.
Código - Inyectado const name = '{John Smith'; exec('ls .'); # }'; Establece la variable constante `nombre` con el valor `John Smith` y, a continuación, ejecuta el comando del sistema `ls .

En estos ejemplos, tenga en cuenta cómo se puede utilizar la entrada para influir en el resultado de la entrada del usuario. 

Esta es la esencia de la inyección. Es influir en lo que se pasa al intérprete, con el fin de conseguir que haga algo distinto de lo que el programador original pretendía.

Estos son sólo los aspectos básicos que hay que tener en cuenta. Hemos separado algunos de los diferentes tipos de inyección en sus propias páginas porque merecen un poco más de atención. 

Puede encontrarlos aquí:

Inyección de comandos‍

Path traversal‍

Inyección SQL‍

Secuencias de comandos en sitios cruzados