Red de conocimiento informático - Material del sitio web - Cómo utilizar la inyección SQL para crear una puerta trasera

Cómo utilizar la inyección SQL para crear una puerta trasera

Cómo utilizar la inyección SQL para crear una puerta trasera

0×01, Introducción...

0×02, ¿Qué es la inyección SQL...

0 ×03, puerta trasera del sistema (sistema operativo)

0×04, obtener shell del sistema operativo

0×05, puerta trasera de la base de datos.

0×07, Métodos de defensa recomendados...

0×08, Conclusión...

0×09, Materiales de referencia...

0×01, Introducción

Si estás leyendo este artículo, tengo motivos para creer que has oído hablar de los virus antes o que son un tipo de virus. Los virus, troyanos o gusanos, son tipos de programas maliciosos que pueden infectar su sistema informático. Una vez que su sistema informático esté infectado, es probable que continúe infectando otras computadoras cuando conecte la computadora infectada a Internet. Muchas veces, el malware no sólo se propaga de un ordenador a otro, sino que crea su propia variante para cada ordenador infectado. Estos cambios permitirían que el virus tomara el control remoto de cada computadora e infectara sistemas informáticos adicionales en el futuro. La primera vez que estos virus se ejecutan, copian un pequeño archivo ejecutable en el disco del usuario. Simplemente escucha un puerto no utilizado en el sistema informático actual, lo que permite que el malware acceda a cualquier puerto conectado a Internet en cualquier momento. Este pequeño archivo ejecutable se llama puerta trasera. Expliqué brevemente el concepto de puertas traseras aquí.

0×02, ¿Qué es la inyección Sql?

Hay más de un millón de artículos escritos sobre qué es la inyección Sql y cómo detectar y evitar este tipo de amenazas, así que no quiero repetirme otra vez. Si necesita algunos conocimientos sobre la inyección de Sql, aquí tiene un enlace a un artículo introductorio para que lo lea. Al final de este artículo, también he incluido algunas referencias que le brindarán más información sobre los temas tratados en este artículo.

0×03, System Backdoor

El propósito de este artículo es utilizar la inyección SQL para ejecutar varios comandos y, en última instancia, controlar el sistema operativo. Para ejecutar comandos del sistema necesitamos un shell CMD o necesitamos ejecutar algún código que nos permita ejecutar comandos del sistema operativo. Probemos cada uno de estos métodos.

0×04, Obtención del shell del sistema operativo

Ahora escribiremos nuestro propio código para ejecutar cualquier comando del sistema operativo para controlar el sistema operativo. Entonces, por el artículo anterior, ya sabemos que las variables para la sección de búsqueda están presentes en la inyección Sql y que hay 4 nombres de columnas en la tabla de preguntas. Como recordatorio, la declaración Harry Potter' union select 1,2,3,4# dará como resultado un error:

Ahora queremos insertar código PHP que pueda ejecutar comandos del sistema. Para ello utilizamos la función INTO OUTFILE proporcionada por MYsql. Usando INTO OUTFILE, puede redirigir el resultado de una consulta a un archivo en su sistema. Por lo tanto, podemos ejecutar la unión de Harry Potter y seleccionar 'TEXTO EN ARCHIVO',2,3 EN ARCHIVO SALIDA '/tmp/blah.txt '#, y luego la cadena "TEXTO EN ARCHIVO" se almacenará en bla en el directorio /tmp . TXT.

Ahora reemplazamos "TEXTO EN ARCHIVO" con código PHP básico que puede leer parámetros de URL para ejecutar comandos del sistema y así controlar el sistema operativo. Usamos la declaración Harry Potter' union select "",2,3 INTO OUTFILE '/var/www/test/execcmd.php'#, como se muestra en el figura Mostrar:

¡Eso es! Pero también hay mucho contenido en los libros que simplemente no nos importa.

Por lo tanto, ajusté la declaración de consulta a:

' union select "",2,3 INTO OUTFILE '/var/www/test/ execcmd.php'# y ejecutar nuevamente.

Aunque esta vez todavía devuelve 2 y 3, es mucho mejor.

Ahora accedemos a execcmd.php y pasamos el comando [cat /etc.passwd] con los parámetros que queremos enviar para su ejecución.

Éxito. Durante mis muchos intentos, hubo algunas cosas que vale la pena señalar.

- El usuario de la base de datos que ejecuta esta declaración debe tener permisos de ARCHIVO; de lo contrario, el comando INTO OUTFILE no se ejecutará.

- Debe existir un directorio web grabable en la máquina host donde se ejecuta el servicio MySQL; de lo contrario, no podrá acceder al webshell que acaba de cargar. Puede escribir código en un directorio en el que siempre se pueda escribir (como /ttmp), pero no tiene permiso para acceder al directorio.

Una forma sencilla de implementar un OS Shell es utilizar la funcionalidad integrada de SQLMap. Si ha leído mis artículos anteriores, recordará que utilicé SQLMap.

La siguiente captura de pantalla del shell del sistema operativo se obtuvo inyectando un parámetro simple usando SQLMap y seleccionando PHP Web Shell en el indicador.

Ejecute el comando para comprobar si hay un shell. Bueno, ningún problema.

Esto es demasiado simple.

Desafortunadamente, desde la perspectiva de un "saboteador", es igual de fácil.

Ahora que tienes un método tan fácil y rápido, no querrás volver al método anterior, pero siempre es útil saber cómo usarlo manualmente (para que cuando falle el uso de la herramienta , tienes otro) método). Otra cosa a tener en cuenta es que cuando obtenga un WebShell, asígnele un nombre que sea muy similar al archivo que ya está en el directorio de red. Esto le ayudará a ocultar WebShell para que los administradores no lo descubran accidentalmente.

Antes de pasar a la siguiente categoría de puertas traseras, le mostraré cómo ocultar un SQLMap. Puede ejecutar SQLMap configurando un proxy.

Luego, cuando SQLMap carga el WebShell real en el directorio de escritura, brupSuite interceptará una gran cantidad de solicitudes. Echemos un vistazo a esas solicitudes.

Podemos ver algún contenido familiar. Confirmemos esto con la decodificación de URL. Mire la sección resaltada en azul en el panel inferior. Esto indica que SQLMap está usando el comando INTO OUTFILE, de la misma manera que lo usamos manualmente antes.

Finalmente, es interesante ver qué carga SQLMap en WebShell; consulte el panel inferior.

Ese es el punto, una vez más esta herramienta simplifica enormemente lo que de otro modo sería una tarea tediosa a la que dedicaríamos mucho tiempo.

0×05, Puerta trasera de base de datos

Ahora sabemos que cuando hay una inyección SQL en una aplicación de red, se puede implantar una puerta trasera del sistema operativo en el sistema. Ahora veamos cómo colocar una puerta trasera en la base de datos. Antes de continuar, necesitamos saber algunas cosas sobre la funcionalidad de la puerta trasera. En una puerta trasera de un sistema operativo, accedemos a la puerta trasera directamente y le pasamos comandos, pero aquí no es tan directo. La puerta trasera que configuramos cambia el valor de algunos datos confidenciales en la base de datos cada vez que se realiza una operación de inserción. Por lo tanto, a medida que cada libro se agrega a la base de datos, nuestra puerta trasera establece su precio en 0, lo que permite a las personas "comprar" los libros de forma gratuita. En un entorno real, esta situación se descubrirá rápidamente.

Así que usamos algo llamado "disparador" en la base de datos, que básicamente significa: "¡Cuando queremos que suceda algo, activa el disparador para hacer otra cosa!". Esta es una descripción muy vaga, pero. Tomemos un ejemplo más obvio.

Si fueras policía y vieras a un asesino en serie en algún momento, apretarías el gatillo y dispararías una bala, ¿verdad? Así que conviértalo a nuestro escenario anterior: hay una declaración INSERT (el asesino), se activa un disparador de la base de datos (el tirador) y luego la acción (acción) es liberar la bala (la bala) que configuró anteriormente.

Aquí hay un ejemplo del disparador de MySQL que escribiremos:

delimitador #

CREAR precio DEL DISPARADOR ANTES DE INSERTAR EN libros

para cada fila comienza

set new. price='0′;

end;#

delimiter

b)En cualquier momento si ejecuta una instrucción Insertar, por ejemplo, si es un libro, entonces establecemos su precio en 0. Esto significa:

a) Establece el delimitador predeterminado de MySQL en "#", porque el delimitador predeterminado es ";", se considera un carácter especial en MySQL y debemos tratarlo como datos. Por lo tanto, cambiamos el delimitador a "#" para indicar que "#" ahora tiene un significado especial.

c) Finalice el activador y restablezca el delimitador a ';'.

A continuación, utilizamos la inyección SQL para copiar el disparador al servidor. La siguiente es la declaración ingresada como cuadro de búsqueda:

Harry Potter' AND 1=0 union select 0×20,0×20, 0×20 INTO OUTFILE '/var/www/test/g2′ LÍNEAS TERMINADAS POR0x64656c696d6974657220230a4352454154452054524947474552207072696365204245464f524520494e53455254204f4e20626f6f6fb730a 666f72 206561636820726f7720626567696e0a736574206e65772e70726963653d2730273b0a656e643b230a64656c696d69746572203b#

, en realidad no es el caso. Usamos 1=0 porque no estamos interesados ​​en los resultados de consultas sobre Harry Potter. 0×20 solo busca "espacio" tres veces; de esta manera obtengo el resultado de la consulta que quiero redirigir al archivo "/var/www/test.g2′". Luego, la parte después de LÍNEAS TERMINADAS POR es el disparador completo convertido usando una función hexadecimal (estoy usando Brup Decoder, no te sientes ahí y pierdas el tiempo convirtiendo a mano).

Ejecutémoslo y veamos qué aparece en el archivo /var/www/test/g2.

¿Te diste cuenta de los primeros espacios? Aquí es donde vimos antes seleccionar 0×20,0×20,0×20. Lo que sigue es obvio.

Ahora, ejecutemos esta consulta de tal manera que nuestro disparador se active cada vez que se inserte un libro.

a) Consulta apilada: UNION de Harry Potter, bla, bla, bla, bla; fuente /var/www/test/g2 Pero esto en realidad no funciona porque PHP+MySQL no admite consultas de declaraciones múltiples. MySQL no admite consultas de declaraciones múltiples.

b) Abusar del comportamiento de activación predeterminado de MySQL: no he probado este enfoque, pero está bien descrito en el artículo de Stefano Di Paola. Pruébalo, lo probaré cuando tenga la oportunidad.

c) Utilice una herramienta de inyección SQL como SQLMap para ejecutar el disparador que almacenamos en /var/www/test/g2. Así queremos probarlo.

Ejecutemos SQLMap nuevamente para obtener un shell SQL que pueda ejecutar desencadenadores.

Mira la última línea. Lamentablemente, este enfoque sólo funciona si se admiten consultas de varias declaraciones. Esto significa que las opciones a y c anteriores tienen el mismo significado. Veamos la solicitud de SQLMap a través del proxy.

Ejecutemos una instrucción simple para crear una nueva base de datos en Sql-shell: "crear base de datos boo;" y luego verla en Brup.

Podemos ver SQLMap intentando convertir esto en una consulta SELECT. Esto nunca se ejecutará exitosamente. El contenido correspondiente de Burp lo confirma.

La única forma viable que se me ocurre para ejecutar la consulta de forma secuencial implica los siguientes pasos:

- Adivinar la contraseña de un usuario válido de MySQL. Por ejemplo, supone que la contraseña de root es test123

- Inyecte la puerta trasera del webshell del sistema operativo.

- Inyecta un disparador similar al formato anterior.

- Ahora instale el disparador ejecutando el comando MySQL en el webshell.

Tengo algunas capturas de pantalla para ilustrar por qué se hace esto. Para atender a los principiantes, aquí hay una captura de pantalla del nombre de la tabla que actualmente no tiene ningún activador.

Supongamos que hemos adivinado el nombre de usuario y la contraseña de root y toor (adivinación por fuerza bruta de la tabla mysql.user mediante SQL ciego). Ahora, le preguntamos al shell web y le pasamos un comando:

mysql -u -p < /var/www/test/g2

Ahora echemos un vistazo a la base de datos nuevamente.

Vea nuestros desencadenantes.

Ahora ejecutemos la consulta INSERT para comprobar si se ejecutará el disparador. De esta forma, el precio de todos los libros de Jeffrey Archer será increíble.

Ahora ejecuta la consulta:

Mira la última línea. Alguien ya no puede pagar el precio que cree que debería pagar.

Ahora ejecutemos directamente una consulta INSERT para controlar la base de datos. En un entorno real, habrá un formulario para agregar libros y lo más probable es que haya una consulta INSERT en el backend, momento en el cual lo más probable es que se active un disparador para su ejecución. Esta es la única razón por la que no creé otro formulario.

Obviamente, un requisito previo importante es que podamos adivinar el nombre de usuario y la contraseña de la base de datos. Aquí tienes una idea sencilla que te ayudará a conseguirlo.

Piense en algunos nombres de usuario de bases de datos comunes (como el nombre de usuario raíz de MySQL) u obtenga algunos mediante ingeniería social.

Las contraseñas de MySQL se cifran mediante hash, no mediante texto sin cifrar.

Puedes descifrar contraseñas de dos maneras:

- Comparando el hash de la contraseña con una lista de contraseñas en texto claro mediante inyección SQL. (Consulte mi artículo anterior)

: ejecute un activador en WebShell utilizando una lista de texto claro de contraseñas y un nombre de usuario específico. Puedes escribir un script en Perl o Ruby para hacer esto. Intente insertar un libro después de recorrer una lista de contraseñas de texto sin cifrar o encontrar la contraseña correcta después de cada adivinanza.

mysql -uroot -ptoor blindsql_test< /var/www/test/g2

mysql -uroot -ptoor blindsql_test< /var/www/test/g2

mysql - uroot -ptest blindsql_test</var/www/test/g2

mysql -uroot -ppassword blindsql_test< /var/www/test/g2

0×07,Recomendado Defensa

a) Utilice consultas parametrizadas para defenderse contra ataques de inyección SQL.

b) No tener una gran cantidad de directorios grabables en el directorio del sitio web.

c) Restringir los permisos de los usuarios cuyas aplicaciones web consultan la base de datos en el backend. Para hacer esto, no asigne permisos de ARCHIVO.

d) Establezca contraseñas de bases de datos complejas y políticas de contraseñas seguras.

0×08, Conclusión

La causa principal de este problema es que la aplicación web tiene una vulnerabilidad de inyección Sql. Arreglarlo evitará que ocurra esta amenaza. Sin embargo, sigue siendo beneficioso comprender los diferentes métodos para instalar puertas traseras. Gran parte del malware se propaga de esta manera, por lo que es necesario tomar medidas para evitarlo.

De:/articles/222.html