Sí, esto es una cosa real. Pero al igual que con SQLi, no solo puede explotar cualquier programa, sino que uno mal escrito con insuficiente saneamiento de entrada podría ser vulnerable.
Veamos primero los lenguajes interpretados. Para que la inyección de código sea posible aquí, necesitas tener algo que tome el código en una cadena y lo ejecute.
En JavaScript tiene la función eval()
que sí lo hace ese. Así que si haces eval(untrustedData)
tienes una vulnerabilidad. Por este motivo, eval()
se considera "malvado" y, a menudo, se encuentra aquí la recomendación de no usarlo en absoluto. También hay más casos de sublte que permiten la ejecución de código desde una cadena, como new Function()
y setInterval()
.
En PHP también tiene una función eval()
, considerada tan peligrosa que el manual incluye una advertencia:
Precaución: La construcción eval()
language es muy peligrosa porque permite la ejecución de código PHP arbitrario. Por lo tanto, se desaconseja su uso. Si ha verificado cuidadosamente que no hay otra opción que usar este constructo, preste especial atención a no pasarle ningún dato proporcionado por el usuario sin validándolo correctamente de antemano.
Entonces, ¿qué hay de los lenguajes compilados? Son menos vulnerables porque no tienen funciones que ejecuten código arbitrario, ya que ese código tendría que compilarse primero. Por supuesto, usted podría escribir un programa que genere código fuente (a partir de datos no confiables), lo compile y lo ejecute. Pero eso sería algo bastante extraño de hacer.
Podría argumentar, como hace iain , que explotar los desbordamientos de búfer es una forma de inyección de código, ya que Se está inyectando código de máquina en el programa. Supongo que todo se reduce a la semántica, si cuentas eso o no.