Qué es la Inyección de código y Cómo Puede Evitarla
Vulnerabilidades de inyección de código es un término general que describe vulnerabilidades que pueden ser explotadas por un atacante para inyectar y ejecutar código malicioso.
Esta vulnerabilidad ocurre generalmente debido a la falta de validación de datos no confiables. Las aplicaciones que evalúan directamente el código sin validarlo primero serían vulnerables a este tipo de ataque.
La inyección de código a veces se confunde con otras vulnerabilidades, como la inyección de comandos. Cabe señalar que la inyección de código es un tipo diferente de vulnerabilidad, en la que un atacante está inyectando código en lugar de comandos del sistema Operativo. Esto significa que con respecto a las vulnerabilidades de inyección de código, el atacante está limitado por la funcionalidad del lenguaje de la aplicación.
Limitaciones de atacantes
Al explotar tales vulnerabilidades, los atacantes están limitados por la funcionalidad del lenguaje de la aplicación (como PHP / Python). Sin embargo, en la mayoría de los casos, el atacante podría aprovechar la funcionalidad del intérprete para pasar de la Inyección de Código a la Inyección de Comandos.
Por ejemplo, si un atacante inyecta código PHP en una aplicación web, el atacante estaría limitado por la funcionalidad disponible por el intérprete PHP. Cuando ocurre el ataque de inyección, el intérprete PHP ejecutaría el código inyectado y dependería de la funcionalidad del intérprete, un atacante podría aprovechar las funciones de ejecución de programas que están disponibles en PHP, como system() o shell_exec, para ejecutar comandos del sistema.
El impacto de una inyección de código
El impacto que tendría un ataque exitoso puede variar dependiendo de varios factores, como el lenguaje utilizado por la aplicación, la funcionalidad disponible por aplicación, etc.
Sin embargo, en la mayoría de los casos, un ataque exitoso podría comprometer completamente la confidencialidad, integridad y disponibilidad de la aplicación y sus datos.
Ejemplo
Imagine una aplicación web que pasa datos no confiables, como la entrada del usuario a una función PHP eval (). La función eval () simplemente evalúa una cadena como código PHP siempre que tenga una sintaxis PHP válida y termine con punto y coma.
<?php
backup copia de seguridad = “”;
$input = _ _GET;
eval (“\backup backup = \input input;”);
?>
Dado que la aplicación pasa la entrada del usuario a la peligrosa función PHP eval() y no se está llevando a cabo ninguna validación, la aplicación sería vulnerable a ataques de Inyección de código.
Un atacante podría explotar esta debilidad suministrando la entrada 1; phpinfo (); como se muestra a continuación:
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; phpinfo();
Ejecutar comandos del sistema operativo
Después de verificar la vulnerabilidad, un atacante podría proceder a ejecutar comandos del sistema aprovechando las funciones del intérprete que permiten la ejecución de comandos. En este caso, se utiliza la función system ().
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; system (‘whoami’);
El comando whoami imprime el nombre de usuario del usuario actual cuando se invoca. Esto significa que cuando la aplicación
pasa la entrada del usuario a la función eval (), el intérprete PHP ejecutaría el comando whoami en el sistema operativo subyacente
.
Una vez que el atacante puede ejecutar comandos del sistema, puede proceder a obtener un shell interactivo en el sistema vulnerable
y llevar a cabo otros ataques contra otros sistemas dentro de la red interna del sistema comprometido.
Prevención
Independientemente del idioma que se utilice, las vulnerabilidades de inyección de código se pueden evitar siguiendo las prácticas recomendadas
que se describen a continuación:
- Evite evaluar datos no confiables
◦ A menos que sea estrictamente necesario, no evalúe directamente los datos no confiables utilizando funciones inseguras como eval(). * Tratar todos los datos como no confiables
◦ Tenga en cuenta que los datos no confiables no se refieren solo a las entradas proporcionadas a través de formularios HTML. La información controlada por los usuarios, como las cookies, los encabezados de solicitud HTTP y los archivos cargados, debe tratarse como no confiable.
- Datos no confiables válidos
◦ Valide siempre la entrada del usuario en el lado del servidor.
◦ Si se supone que el usuario debe enviar la entrada en un formato específico, como fecha, código postal, números, dirección de correo electrónico
, etc., asegúrese de que la entrada del usuario coincida con el formato esperado.
◦ Si la aplicación espera un valor dentro de un conjunto limitado de opciones, siga un enfoque de lista blanca y asegúrese de que
la entrada enviada sea una de las opciones permitidas.
- Endurecer el intérprete
◦ Por ejemplo, la funcionalidad del intérprete PHP debe limitarse a la funcionalidad mínima que se requiere para que la aplicación funcione. Esto podría hacer que sea mucho más difícil para los atacantes ejecutar comandos del sistema. Por ejemplo, las funciones de ejecución de programas PHP podrían desactivarse modificando el php.archivo ini.
- Análisis estático
◦ Realice actividades de análisis estático para identificar vulnerabilidades relacionadas con la evaluación insegura.
- VAPT
◦ Realizar Evaluaciones de Vulnerabilidad y Pruebas de Penetración periódicas para identificar y mitigar dichas debilidades.