La inyección de comandos es básicamente la inyección de comandos del sistema operativo para ejecutarse a través de una aplicación web. El propósito del ataque de inyección de comandos es inyectar y ejecutar comandos especificados por el atacante en la aplicación vulnerable. En una situación como esta, la aplicación, que ejecuta comandos del sistema no deseados, es como un pseudo shell del sistema y el atacante puede usarla como un usuario autorizado del sistema. Sin embargo, los comandos se ejecutan con los mismos privilegios y entorno que tiene la aplicación web. Los ataques de inyección de comandos son posibles debido a la falta de validación correcta de los datos de entrada, que pueden ser manipulados por el atacante (formularios, cookies, encabezados HTTP, etc.).
Hay una variante del ataque de inyección de código . En la inyección de código, el atacante agrega su propio código al código existente. El código inyectado se ejecuta con los mismos privilegios y entorno que tiene la aplicación.
Un ataque de inyección de comandos del sistema operativo ocurre cuando un atacante intenta ejecutar comandos a nivel del sistema a través de una aplicación vulnerable. Las aplicaciones se consideran vulnerables al ataque de inyección de comandos del sistema operativo si utilizan la entrada del usuario en un comando a nivel del sistema.
Ejemplo:
// C program to demonstrate Command Injection attack // The purpose of the program to print contents of a // file provided as command line argument. #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { char cat[] = "cat "; char *command; size_t commandLength; commandLength = strlen(cat) + strlen(argv[1]) + 1; command = (char *) malloc(commandLength); strncpy(command, cat, commandLength); strncat(command, argv[1], (commandLength - strlen(cat)) ); system(command); return (0); }
Usado normalmente, la salida es simplemente el contenido del archivo solicitado:
$ ./a.out exploit.txt my name is akash
Sin embargo, si agregamos un punto y coma y otro comando al final de esta línea, catWrapper ejecuta el comando sin quejarse:
$ ./a.out "exploit.txt; ls" my name is akash exploit.txt doubFree.c nullpointer.c unstosig.c www* a.out* format.c strlen.c useFree* catWrapper* misnull.c strlength.c useFree.c commandinjection.c nodefault.c trunc.c writeWhatWhere.c
El siguiente fragmento de código PHP es vulnerable a un ataque de inyección de comandos (aplicación web):
<?php print("Please specify the name of the file to delete"); print("<p>"); $file=$_GET['filename']; system("rm $file"); ?>
La siguiente solicitud y respuesta es un ejemplo de un ataque exitoso:
Request http://mywesite.com/delete.php?filename=bob.txt;id
Response Please specify the name of the file to delete uid=33(www-data) gid=33(www-data) groups=33(www-data)
Mitigación
- Idealmente, un desarrollador debería usar la API existente para su idioma. Por ejemplo (Java): en lugar de usar Runtime.exec() para emitir un comando de ‘correo’, use la API de Java disponible ubicada en javax.mail.*
- Si no existe tal API disponible, el desarrollador debe borrar todas las entradas en busca de caracteres maliciosos. La implementación de un modelo de seguridad positivo sería más eficiente. Por lo general, es mucho más fácil definir los caracteres legales que los ilegales.
Referencias
https://en.wikipedia.org/wiki/Code_injection
http://stackoverflow.com/questions/44799/preventing-command-line-injection-attacks
Este artículo es una contribución de Akash Sharan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA