Page cover

Ejecución de código 01

Inyección de código

En esta sección, trabajaremos en la ejecución de código.

La ejecución de código surge de la falta de filtrado y/o escape de datos controlados por el usuario.

Por ejemplo: si se desea ejecutar el comando ls, se debe enviar system("ls") a la aplicación si se trata de una aplicación PHP.

Al igual que otros ejemplos de problemas de aplicaciones web, siempre es útil saber cómo comentar el resto del código (es decir, el sufijo que la aplicación agregará a los datos controlados por el usuario).

En PHP, se puede usar // para deshacerse del código agregado por la aplicación.

Al igual que con la inyección SQL, se puede usar la misma técnica de valores para probar y asegurarse de tener una inyección de código:

  • Usando comentarios e inyectando /* valor aleatorio */

  • Inyectando una simple concatenación "." (donde " se utilizan para romper la sintaxis y reformarla correctamente)

  • Reemplazando el parámetro que proporcionó por una concatenación de cadenas, por ejemplo "."ha"."cker"." en lugar de hacker.

También puede utilizar la detección basada en el tiempo para este problema utilizando la función PHP sleep. Verá una diferencia de tiempo entre:

  • No utilizar la función sleep o llamarla con un retraso de cero: sleep(0).

  • Una llamada a la función con un retraso largo: sleep(10).

Obviamente, la inyección de código debe estar en el lenguaje utilizado por la aplicación. Por lo tanto, el primer paso en una inyección es encontrar qué lenguaje utiliza la aplicación. Para ello, puede mirar los encabezados de respuesta, generar errores o ver la forma en que la aplicación maneja los caracteres especiales.

Por ejemplo: comparando + y . para la concatenación de cadenas.

El siguiente ejemplo es una inyección de código trivial. Si inyecta una comilla simple, no sucede nada. Sin embargo, puede obtener una mejor idea del problema inyectando una comilla doble:

Esto podría suceder al revés: la comilla simple podría generar un error, mientras que la comilla doble no.

Según el mensaje de error, podemos ver que el código está usando la función eval.

Vimos que las comillas dobles rompen la sintaxis y que la función eval parece estar usando nuestra entrada. A partir de esto, podemos intentar calcular cargas útiles que nos den los mismos resultados:

".": solo estamos agregando una concatenación de cadenas; esto debería darnos el mismo valor. "./pentesterlab/": solo estamos agregando una concatenación de cadenas e información dentro de los comentarios; esto debería darnos el mismo valor. Ahora que tenemos valores similares funcionando, necesitamos inyectar código. Para demostrar que podemos ejecutar código, podemos intentar ejecutar un comando (por ejemplo, uname -a usando la ejecución de código). El código PHP completo se ve así:

El desafío aquí es salir de la sintaxis del código y mantener una sintaxis limpia. Hay muchas formas de hacerlo:

Agregando código ficticio: ".system('uname -a'); $dummy=". Usando comentarios: ".system('uname -a');# o ".system('uname -a');//. No olvide que deberá codificar en URL algunos caracteres (# y ;) antes de enviar la solicitud.

Last updated